Stored procedures DB2—如何调用在另一个用户定义的表函数中返回结果集的存储过程

Stored procedures DB2—如何调用在另一个用户定义的表函数中返回结果集的存储过程,stored-procedures,db2,cursor,resultset,table-functions,Stored Procedures,Db2,Cursor,Resultset,Table Functions,我有一个db2存储过程,它接收一些参数,从某处获取一些数据,然后通过游标返回一个结果集 现在我想在db2中编写一个表函数,它将调用这个存储过程,从结果集中读取数据,并将结果集中的数据作为表返回。最后,我想在联接中使用这个表函数 我想知道,在我们使用DB2V10.5的db2中是否允许这样做,即在表函数中执行一个存储过程,并从存储过程中获取和读取结果集。如果是这样,在db2中调用存储过程和读取表函数中的结果集的正确语法是什么?谢谢 是的,这是可能的。请参见下面的示例 --#SET TERMINATO

我有一个db2存储过程,它接收一些参数,从某处获取一些数据,然后通过游标返回一个结果集

现在我想在db2中编写一个表函数,它将调用这个存储过程,从结果集中读取数据,并将结果集中的数据作为表返回。最后,我想在联接中使用这个表函数


我想知道,在我们使用DB2V10.5的db2中是否允许这样做,即在表函数中执行一个存储过程,并从存储过程中获取和读取结果集。如果是这样,在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'))@

您需要创建DB2表函数,如下所示:

CREATE FUNCTION database_schema.function_name ( IN_PARTID VARCHAR(1000) ) 
RETURNS TABLE ( PARTNO CHAR(25), PARTDS CHAR(30), QUANTITY INT )   

BEGIN 
RETURN SELECT PARTNO , PARTDS , CASE WHEN QUANTITY > 0 THEN QUANTITY ELSE 0 END QUANTITY 
FROM 
( 
    SELECT PARTNO 
    ,MAX(PARTDS) AS PARTDS       
    ,SUM(QUANTITY) AS QUANTITY 
    FROM database_schema.table_name
    WHERE 1=1
    AND PARTID = (CAST(IN_PARTID AS INT))
    GROUP BY PARTNO  
) AA; 
END; 
然后将表函数作为join或STRAINT SQL调用:

SELECT partno,partds,quantity
FROM TABLE(database_schema.function_name('parameter_1'))

欢迎来到SO!根据说明,请阅读并更正您的问题。如果您需要代码示例进行学习,请先使用网络搜索引擎,例如谷歌。我投票将这个问题作为离题题题结束,因为它被交叉张贴在dba.stackexchange.com上。是的,对不起,我的不好。我还在stack exchange上发布了相同的问题:对于Linux上的Db2 LUW 11.1.4.4,在SQL20148N中调用管道表函数。必须将RETURN语句作为复合体的最后一条SQL语句。但是,结果集仍然返回@10.5.8也是如此。我忽略了这个例外。我已经编辑了这个例子。谢谢