Тема: INFORMIX, Оператор LIST

Потрібно в збережену процедуру передати набір значень для оператора IN.

Наприклад є запит:

SELECT payment_sum FROM payments WHERE id IN (1,2)

Для того щоб цей запит виконати в збереженій процедурі я використав LIST

Приклад збереженої процедури:

CREATE FUNCTION ttest(param_id LIST(INTEGER NOT NULL))
RETURNING
VARCHAR(33) AS payment_sum
DEFINE _payment_sum VARCHAR(33);
FOREACH SELECT payment_sum INTO _payment_sum FROM payments WHERE id IN (param_id)
RETURN
_payment_sum
WITH RESUME;
END FOREACH;
END FUNCTION;

Процедура створилася успішно.

А коли я намагаюся її викликати:

CALL ttest(LIST{1,2});

Помилка: 674 routine can not be resolved

Що не так ? Як створити правильно та викликати збережену процедуру з набором значень ?

2

Re: INFORMIX, Оператор LIST

Коболіста разморозили, ліл.

3

Re: INFORMIX, Оператор LIST

Що таке "Коболіст" ?

4

Re: INFORMIX, Оператор LIST

Betterthanyou написав:

Що таке "Коболіст" ?

свідок секти Кобола

5

Re: INFORMIX, Оператор LIST

Кодер на Коболі. Ваш код дуже подібний на Кобол.

Подякували: Betterthanyou1

6

Re: INFORMIX, Оператор LIST

0xDADA11C7 написав:

Кодер на Коболі. Ваш код дуже подібний на Кобол.

Це, пане, SQL.

Подякували: Betterthanyou, 0xDADA11C72

7

Re: INFORMIX, Оператор LIST

В моєму уявленні SQL обмежений запитами, а коли вже присутні функції, то це щось інше.

8 Востаннє редагувалося Betterthanyou (10.06.2021 21:22:27)

Re: INFORMIX, Оператор LIST

0xDADA11C7 написав:

В моєму уявленні SQL обмежений запитами, а коли вже присутні функції, то це щось інше.

Проблема в тому що запити не завжди можуть робити те що процедури... Для того щоб не пересилати постійно дані між сервером БД і сервером на якому знаходиться веб-сайт, можна зразу зробити все що потрібно на сервері БД і переслати готовий результат до сервера з веб-сайтом, для цього я використовую збережені процедури.

Подякували: 0xDADA11C71

9 Востаннє редагувалося koala (10.06.2021 21:33:09)

Re: INFORMIX, Оператор LIST

Вперше читаю документацію до цього Informix; але там ніби ж пікселями по екрану написано

Informix написав:

When you use CALL to invoke a user-defined function that you specify by its function identifier or as a routine_var that stores the identifier of the function, the CALL statement must also include the RETURNING clause.

https://www.ibm.com/docs/en/informix-se … ments-call

Схоже, що якщо викликаєте щось без RETURNING, то воно вважається рутиною, а не функцією. А рутини з таким ім'ям немає, тому й помилка.

Подякували: ch0r_t, leofun012

10

Re: INFORMIX, Оператор LIST

koala написав:

Вперше читаю документацію до цього Informix; але там ніби ж пікселями по екрану написано

Informix написав:

When you use CALL to invoke a user-defined function that you specify by its function identifier or as a routine_var that stores the identifier of the function, the CALL statement must also include the RETURNING clause.

https://www.ibm.com/docs/en/informix-se … ments-call

Схоже, що якщо викликаєте щось без RETURNING, то воно вважається рутиною, а не функцією. А рутини з таким ім'ям немає, тому й помилка.

Не зрозумів, де той RETURNING писати ? В мене так:

CREATE FUNCTION ttest(param_id LIST(INTEGER NOT NULL))
RETURNING
VARCHAR(33) AS payment_sum
DEFINE _payment_sum VARCHAR(33);
FOREACH SELECT payment_sum INTO _payment_sum FROM payments WHERE id IN (param_id)
RETURN
_payment_sum
WITH RESUME;
END FOREACH;
END FUNCTION;

11

Re: INFORMIX, Оператор LIST

Якось так:

CALL ttest(LIST{1,2}) RETURNING payment_sum;

або

EXECUTE FUNCTION ttest(LIST{1,2}) INTO payment_sum;

У будь-якому разі функція має повертати значення.

Подякували: leofun011