stored-procedures - DB2 - 如何调用在另一个用户定义的表函数中返回结果集的存储过程
问题描述
我有一个 db2 存储过程,它接受一些参数,从某个地方获取一些数据,然后通过游标返回一个结果集。
现在我想在 db2 中编写一个表函数,它将调用这个存储过程,从结果集中读取并将结果集中的数据作为表返回(最终我想在连接中使用这个表函数)。
我想知道这在 db2 中是否允许(我们使用的是 DB2 v10.5),即在表函数中执行存储过程并从存储过程的结果集中获取和读取。如果是这样,调用存储过程和读取 db2 中表函数内的结果集的正确语法是什么?谢谢!
解决方案
是的,这是可能的。请参见下面的示例。
--#SET TERMINATOR @
CREATE OR REPLACE PROCEDURE TEST_PROC(P_TABSCHEMA VARCHAR(128))
DYNAMIC RESULT SETS 1
READS SQL DATA
BEGIN
DECLARE C1 CURSOR WITH HOLD WITH RETURN FOR
SELECT TABSCHEMA, TABNAME, COLCOUNT
FROM SYSCAT.TABLES
WHERE TABSCHEMA=P_TABSCHEMA;
OPEN C1;
END@
--CALL TEST_PROC('SYSCAT')@
CREATE OR REPLACE FUNCTION TEST_PROC(P_TABSCHEMA VARCHAR(128))
RETURNS TABLE (
TABSCHEMA VARCHAR(128)
, TABNAME VARCHAR(128)
, COLCOUNT INT
)
READS SQL DATA
BEGIN
DECLARE SQLSTATE CHAR(5);
DECLARE V_TABSCHEMA VARCHAR(128);
DECLARE V_TABNAME VARCHAR(128);
DECLARE V_COLCOUNT INT;
DECLARE V1 RESULT_SET_LOCATOR VARYING;
CALL TEST_PROC(P_TABSCHEMA);
ASSOCIATE RESULT SET LOCATOR (V1) WITH PROCEDURE TEST_PROC;
ALLOCATE C1 CURSOR FOR RESULT SET V1;
L1: LOOP
FETCH C1 INTO V_TABSCHEMA, V_TABNAME, V_COLCOUNT;
IF SQLSTATE<>'00000' THEN LEAVE L1; END IF;
PIPE(V_TABSCHEMA, V_TABNAME, V_COLCOUNT);
END LOOP L1;
CLOSE C1;
RETURN;
END@
SELECT * FROM TABLE(TEST_PROC('SYSCAT'))@
推荐阅读
- c++ - _get_second() 中的 xutility 堆栈溢出
- trace - 如何使用 sleuth/brave 传播具有不同标头名称的标头值
- node.js - MulterError:意外的字段,reactjs,vuejs,nodejs
- java - 从数组中返回 K 个最大的元素。(JAVA)
- ios - Swift 4 使用外部网络框架时将结果传输到主线程
- android - 升级到 roboelectric 4.0 并给出依赖错误
- r - 如何将数字向量转换为字符,使每个字符元素在 R 中具有相同的十进制长度?
- java - 在两个构造函数中初始化最终变量
- node.js - 错误:5 NOT_FOUND:在 LongRunningRecognize 上找不到请求的实体
- c# - Linq-to-SQL 中的多个 JOIN