2

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

1 回答 1

2

尽管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{}

这是一个空的多重集。如果您不先将某些内容插入到多重集中,则删除将失败。这有点奇怪。

概括

您可能对 Informix 11.70.xC7 没问题;它也可能适用于其他一些版本。但是可能有很多版本的 Informix 无法正常工作。

于 2013-02-20T20:04:38.637 回答