Informix程序 - 如何返回空表?

时间:2013-02-19 08:18:50

标签: informix procedure

如果找到某个值,我需要创建一个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;

1 个答案:

答案 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无法正常工作。