Informix存储过程返回值

时间:2011-01-28 06:05:32

标签: java stored-procedures informix

我需要创建一个存储过程,它返回一个select语句,比如大约4-5列的值。

我需要从Java应用程序调用它,因此我无法将输出放入临时表,因为临时表将无法从其他会话访问。所以我基本上需要调用存储过程,然后从返回值创建一个数组列表。

返回的数据为select * from table

1 个答案:

答案 0 :(得分:0)

将存储过程视为返回值的SELECT语句。

在ESQL / C等语言中,您准备'EXECUTE PROCEDURE'语句,然后为它声明一个游标,然后在循环和CLOSE中声明OPEN,FETCH。类似的操作也应该在JDBC和Java中工作 - 可能存在差异,您可能不需要将准备和执行阶段分开。


我可以拼写'Java' - 让我们思考;它以'C'开头......不是吗?喜欢'C'?

在ESQL / C中,您将编写(忽略错误检查和变量声明):

EXEC SQL PREPARE prep_stmt FROM "EXECUTE PROCEDURE CursoryProcedure(?,?,?)";
EXEC SQL DECLARE cursor_nm FROM prep_stmt;
EXEC SQL OPEN cursor_nm USING :hostvar1, :hostvar2, :hostvar3;
while (SQLCODE == 0)
{
    EXEC SQL FETCH cursor_nm INTO :receiver1, :receiver2, :receiver3,
                                  :receiver4, :receiver5, :receiver6;
    if (SQLCODE != 0)
        break;
    ...use the values in the receiverN variables...
}
EXEC SQL CLOSE cursor_nm;
EXEC SQL FREE cursor_nm;
EXEC SQL FREE prep_stmt;

三个占位符问号代表传递给存储过程的输入值;值在OPEN操作中传递给它。存储过程可以返回(零或)一行或多行数据;如图所示,依次处理每一行。

该代码与处理SELECT语句之间的唯一区别是PREPARE行:

select_str = "SELECT * FROM A_Table WHERE Col1 = ? AND (Col2 = ? OR Col3 < ?)";
EXEC SQL PREPARE prep_stmt FROM :select_str;

现在 - 您将不得不研究如何将上面的ESQL / C转换为JDBC。您可能不需要太担心免费操作 - 在ESQL / C中,即使这两个中的一个可能是多余的(但无害)。但是需要复制PREPARE,DECLARE,OPEN,FETCH-in-a-loop和CLOSE序列。


我假设你可以阅读手册并知道如何编写Informix存储过程,但以防万一:

CREATE PROCEDURE CursoryProcedure(i INTEGER, j CHAR(10), k DATE)
    RETURNING CHAR(20) AS v1, INTEGER AS v2, DATE AS v3, 
              VARCHAR(255) AS v4, INTEGER AS v5, INTEGER AS v6; 
    DEFINE v1 CHAR(20);
    DEFINE v2 INTEGER;
    DEFINE v3 DATE;
    DEFINE v4 VARCHAR(255);
    DEFINE v5 INTEGER;
    DEFINE v6 INTEGER;
    FOREACH SELECT *
              INTO v1, v2, v3, v4, v5, v6
              FROM Table
             WHERE Col1 = i AND (Col2 = j OR Col3 < k)
        RETURN v1, v2, v3, v4, v5, v6 WITH RESUME;
    END FOREACH;
END PROCEDURE;

这是一个或多或少的最小程序来完成这项工作 - 你不会经常编写一个只返回所选值而不用数据做更多事情的程序。