Informix 11.70.FC8GE - Как передать тип данных LIST в SPL с помощью SELECT

Я видел еще один вопрос, касающийся передачи типов данных SET в код C #, но он не отвечал на то, что я пытался сделать.

Я пытаюсь передать тип данных LIST в SPL с помощью select. Я знаю, что в SPL СПИСОК может быть ОПРЕДЕЛЕН и установлен как таковой:

DEFINE a LIST(INTEGER NOT NULL);
LET a = LIST{(SELECT unique b from numberTable)};

Я также знаю, что список может быть отправлен в SPL, если его переменная - LIST.

execute procedure someProc(LIST{1,2,3});

Зная эти две вещи, я хочу попытаться создать СПИСОК из SELECT для переменной.

execute procedure someProc(LIST{(SELECT unique b from numberTable)});

Итак, я создал небольшой тестовый пример.

create table tab1 (a int);

insert into tab1 values (1);
insert into tab1 values (2);
insert into tab1 values (3);

create procedure retInt(c LIST(INTEGER NOT NULL))
RETURNING INTEGER;

DEFINE b INTEGER;

FOREACH SELECT * INTO b from TABLE(c)
        return b with RESUME;
end FOREACH

end procedure;

-- Works
execute procedure retInt(LIST{1,2,3});

-- Doesn't work
-- returns 284: A subquery has returned not exactly one row.
execute procedure retInt(LIST{(SELECT a from tab1)});

Я также попробовал ввести тип, выбрав такой

execute procedure retInt((SELECT a from tab1)::LIST(INTEGER NOT NULL));

Излишне говорить, что возникла синтаксическая ошибка.

Возможно, я пытаюсь сделать что-то, что невозможно. Просматривая документацию IBM, я ничего не нашел, однако иногда мне кажется, что их документацию сложно использовать.

Есть предположения?

Заранее спасибо, Катон


person cbeitzell    schedule 18.12.2015    source источник


Ответы (1)


В Informix вы не можете построить СПИСОК непосредственно из оператора SELECT, если только выбор не вернет ровно 1 строку. Я подозреваю, что в приведенном вами примере запрос возвращает ровно 1 строку и создается СПИСОК.

Informix не позволит вам создать СПИСОК из SELECT, который возвращает несколько строк, но допускает создание MULTISET из SELECT, который возвращает несколько строк, которые затем могут быть преобразованы в СПИСОК.

EXECUTE PROCEDURE retInt((MULTISET(SELECT ITEM a FROM tab1)::LIST(INTEGER NOT NULL)));

Ключевое слово ITEM требуется для создания MULTISET значений INTEGER вместо мультимножества значений ROW.

person Luís Marques    schedule 21.12.2015