如果找到某个值,我需要创建一个Informix过程来返回一个包含行的表,如果没有找到值,则需要一个空表。
我知道如何返回一个包含行的表,但我不知道如何返回空表;有人可以帮忙吗?
CREATE row type 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);
....
IF( FoundValue ) THEN
-- INSERT INTO TABLE
INSERT INTO TABLE (AType_TABLE) VALUES (ROW(v_id,v_name)::AType);
ELSE
// how to initial a AType_TABLE instance with empty records.
END IF
....
RETURN AType_TABLE;
END PROCEDURE;
答案 0 :(得分:1)
尽管它在SQL Syntax Manual中说的是,SPL(存储过程语言)过程可以返回集合类型(COLLECT,SET,MULTISET或LIST)。我已经报告了针对该文档的文档错误 - 本周早些时候误导了我。
我无法在Mac OS X 10.7.5上的Informix 11.70.FC6下编译此程序,但它出现的错误是:
SQL -9905: [Internal] No extended type information for domain.
我在尝试上述代码的各种变体时遇到了各种各样的问题。您似乎不能从多集中在DELETE上有WHERE子句(看起来不同的错误消息)。如果您回滚类型的创建,然后再试一次,也会遇到问题。
但是,我能够在Linux(RHEL 5,x86 / 64)上预先发布11.70.FC8并测试它并获得所需的输出:
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{}
这是一个空的multiset。如果您没有先在multiset中插入内容,则删除失败。这有点奇怪。
你可以使用Informix 11.70.xC7;它也可能适用于其他一些版本。但是很可能有很多版本的Informix无法正常工作。