Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Firebird, Interbase > Список значений во вход. параметре хр. процедуры


Автор: samalex 1.7.2010, 11:33
Уважаемые знатоки!!! Работаю в Firebird 2.1.
Хочу передать в хр. процедуру строковый параметр (типа "1, 2, 3") для использования его в конструкции "in (...)".
Вот скрипт для создания ХП.

Код

create or alter procedure SP_2 (
ID_TYPE_WORK_SET varchar(10))
returns (
ID_PREPARATION_TECH_DOC integer,
ID_TYPE_WORK integer)
as
begin
for select
dp.id_preparation_tech_doc,
dp.id_type_work
from data_preparation_tech_doc dp
where
dp.id_type_work in (:ID_TYPE_WORK_SET)
into
:id_preparation_tech_doc,
:id_type_work
do
suspend;


Хочу выбрать набор данных в соответствии с перечисленными через запятую значениями типа "int".
Но что-то не выходит. Не воспринимает Firebird мой параметр.
Кто мне подскажет, что не так?
Заранее благодарен.


Модератор: Пользуйтесь тегами КОД

Автор: Frees 1.7.2010, 12:24
можно так
Код

CREATE OR ALTER PROCEDURE SP_2 (
    ID_TYPE_WORK_SET VARCHAR(10))
RETURNS (
    ID_PREPARATION_TECH_DOC INTEGER,
    ID_TYPE_WORK INTEGER)
AS
DECLARE VARIABLE SQL_TEXT VARCHAR(1000);
BEGIN
  SQL_TEXT = '
    FOR SELECT
      DP.ID_PREPARATION_TECH_DOC,
      DP.ID_TYPE_WORK
    FROM DATA_PREPARATION_TECH_DOC DP
    WHERE
    DP.ID_TYPE_WORK IN (' || :ID_TYPE_WORK_SET || ')';
  FOR EXECUTE STATEMENT SQL_TEXT
  INTO :ID_PREPARATION_TECH_DOC, :ID_TYPE_WORK
  DO
   SUSPEND;
END

тут есть ограничение, в in максимум 1500 элементов 


Автор: Akella 1.7.2010, 21:48
это было в FB 2.0, в 2.1 возможно, что уже больше, нужно читать Release Notes по FB конкретной версии

Автор: Frees 2.7.2010, 06:22
еще в 2.1 появилась функция LIST может есть и обратная ей.
Я для таки целей использую сохраненку - ей на вход цифры через запятую она выдает каждую цифру отдельной записью

Автор: samalex 2.7.2010, 08:13
Цитата(Frees @ 1.7.2010,  12:24)
можно так
Код

CREATE OR ALTER PROCEDURE SP_2 (
    ID_TYPE_WORK_SET VARCHAR(10))
RETURNS (
    ID_PREPARATION_TECH_DOC INTEGER,
    ID_TYPE_WORK INTEGER)
AS
DECLARE VARIABLE SQL_TEXT VARCHAR(1000);
BEGIN
  SQL_TEXT = '
    FOR SELECT
      DP.ID_PREPARATION_TECH_DOC,
      DP.ID_TYPE_WORK
    FROM DATA_PREPARATION_TECH_DOC DP
    WHERE
    DP.ID_TYPE_WORK IN (' || :ID_TYPE_WORK_SET || ')';
  FOR EXECUTE STATEMENT SQL_TEXT
  INTO :ID_PREPARATION_TECH_DOC, :ID_TYPE_WORK
  DO
   SUSPEND;
END

тут есть ограничение, в in максимум 1500 элементов

Интересный подход. Спасибо большое.
Никогда не использовал в хп.
Нужно попробовать.

Цитата

можно так
Код

CREATE OR ALTER PROCEDURE SP_2 (
    ID_TYPE_WORK_SET VARCHAR(10))
RETURNS (
    ID_PREPARATION_TECH_DOC INTEGER,
    ID_TYPE_WORK INTEGER)
AS
DECLARE VARIABLE SQL_TEXT VARCHAR(1000);
BEGIN
  SQL_TEXT = '
    FOR SELECT
      DP.ID_PREPARATION_TECH_DOC,
      DP.ID_TYPE_WORK
    FROM DATA_PREPARATION_TECH_DOC DP
    WHERE
    DP.ID_TYPE_WORK IN (' || :ID_TYPE_WORK_SET || ')';
  FOR EXECUTE STATEMENT SQL_TEXT
  INTO :ID_PREPARATION_TECH_DOC, :ID_TYPE_WORK
  DO
   SUSPEND;
END

тут есть ограничение, в in максимум 1500 элементов




Интересный подход. Спасибо большое.
Никогда не использовал в хп.
Нужно попробовать.

Автор: Deniz 19.7.2010, 10:27
Смотри http://forum.vingrad.ru/index.php?showtopic=33913&view=findpost&p=2041894 и след. пост.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)