DB2 - как вызвать хранимую процедуру, которая возвращает набор результатов в другой пользовательской табличной функции - PullRequest
0 голосов
/ 19 марта 2019

У меня есть хранимая процедура db2, которая принимает некоторые параметры, получает некоторые данные откуда-то и затем возвращает результирующий набор через курсор.

Теперь я хочу написать табличную функцию в db2, которая будет вызыватьэто хранимая процедура, чтение из набора результатов и возврат данных в наборе результатов в виде таблицы (в конце концов я хочу использовать эту табличную функцию в объединении).

Я хотел бы знать, разрешено ли это вdb2 (мы используем DB2 v10.5), т.е. выполняем хранимую процедуру в табличной функции, выбираем и читаем из набора результатов из хранимой процедуры.Если да, то каков правильный синтаксис для вызова хранимой процедуры и чтения результирующего набора внутри табличной функции в db2?Спасибо!

Ответы [ 2 ]

1 голос
/ 09 мая 2019

Вам необходимо создать табличную функцию 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; 

Затем вызвать табличную функцию как объединение или прямой SQL:

SELECT partno,partds,quantity
FROM TABLE(database_schema.function_name('parameter_1'))
0 голосов
/ 19 марта 2019

Да, это возможно.Смотрите пример ниже.

--#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'))@
...