Несмотря на то, что написано в SQL Руководство по синтаксису, процедуры SPL (язык хранимых процедур) могут возвращать типы коллекций (COLLECT, SET, MULTISET или LIST). Ранее на этой неделе я сообщил об ошибке в документации, которая ввела меня в заблуждение.
Мне не удается скомпилировать эту процедуру под Informix 11.70.FC6 в Mac OS X 10.7.5, но возникает следующая ошибка:
SQL -9905: [Internal] No extended type information for domain.
Я столкнулся с различными проблемами, пытаясь использовать различные варианты приведенного выше кода. Кажется, у вас не может быть предложения WHERE в DELETE из мультинабора (другое сообщение об ошибке). Вы также можете столкнуться с проблемами, если откатите создание типа, а затем повторите попытку.
Тем не менее, я смог протестировать его с предварительным выпуском 11.70.FC8 в Linux (RHEL 5, x86/64) и получил желаемый результат:
CREATE ROW TYPE IF NOT EXISTS AType
(
id VARCHAR(255),
name VARCHAR(255)
);
CREATE PROCEDURE getmeasurement (p_date DATETIME YEAR TO SECOND)
RETURNING MULTISET(AType NOT NULL);
DEFINE AType_TABLE MULTISET(AType NOT NULL);
DEFINE v_id VARCHAR(255);
DEFINE v_name VARCHAR(255);
LET v_id = "Polynomial - " || p_date;
LET v_name = "Euclid's Geometry of the Plane";
INSERT INTO TABLE (AType_TABLE) VALUES(ROW(v_id, v_name)::AType);
IF 1 = 1 THEN
-- how TO initial a AType_TABLE instance WITH empty records.
DELETE FROM TABLE(AType_TABLE);
END IF
RETURN AType_TABLE;
END PROCEDURE;
EXECUTE PROCEDURE getmeasurement(CURRENT);
ROLLBACK;
Результат был:
MULTISET{}
который является пустым мультимножеством. Если вы сначала не вставите что-то в мультимножество, удаление завершится ошибкой. Это немного странно.
Резюме
Вы можете быть в порядке с Informix 11.70.xC7; это может работать и на некоторых других версиях. Но, скорее всего, существует множество версий Informix, в которых он не работает.
person
Jonathan Leffler
schedule
20.02.2013