【发布时间】:2011-01-28 06:05:31
【问题描述】:
我需要创建一个返回 select 语句的存储过程,比如大约 4-5 列的值。
我需要从 Java 应用程序调用它,因此我无法将输出放入临时表中,因为该临时表无法从另一个会话中访问。所以我基本上需要调用存储过程,然后根据返回值创建一个数组列表。
返回的数据将为select * from table。
【问题讨论】:
标签: java stored-procedures informix
我需要创建一个返回 select 语句的存储过程,比如大约 4-5 列的值。
我需要从 Java 应用程序调用它,因此我无法将输出放入临时表中,因为该临时表无法从另一个会话中访问。所以我基本上需要调用存储过程,然后根据返回值创建一个数组列表。
返回的数据将为select * from table。
【问题讨论】:
标签: java stored-procedures informix
将存储过程视为返回值的 SELECT 语句。
在 ESQL/C 等语言中,您准备“EXECUTE PROCEDURE”语句,然后为其声明一个游标,然后是 OPEN、循环中的 FETCH 和 CLOSE。类似的操作也应该在 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。您可能不需要太担心 FREE 操作 - 在 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;
这是一个完成这项工作的或多或少的最小过程——您不会经常编写一个简单地返回所选值而不对数据做更多事情的过程。
【讨论】: