我需要创建一个存储过程,它返回一个select语句,比如4-5列和值。
我需要从Java应用程序调用它,这样我就不能将输出放到临时表中,因为该临时表将无法从其他会话访问。因此,我基本上需要调用存储过程,然后从返回值创建数组列表。
返回的数据将是select * from table
。
发布于 2011-01-28 06:09:20
将存储过程视为返回值的SELECT语句。
在诸如ESQL/C这样的语言中,您准备了'EXECUTE PROCEDURE‘语句,然后为它声明一个游标,然后打开、获取一个循环并关闭。类似的操作也应该在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;
三个占位符问号表示传入存储过程的输入值;这些值在打开操作中传递给存储过程。存储过程可以返回(零或)一行或多行数据;每一行按如下所示依次处理。
该代码与处理SELECT语句之间唯一的区别是准备行:
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中,这两种操作中的一种可能是多余的(但无害的)。但是,准备、声明、打开、取入循环和关闭序列将需要复制。
我假设您可以阅读手册并知道如何编写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;
这是一个或多或少能完成任务的过程--您不会经常编写一个简单返回所选值而不对数据做更多操作的过程。
https://stackoverflow.com/questions/4825362
复制相似问题