Stored procedures 游标执行时没有结果(db2)

Stored procedures 游标执行时没有结果(db2),stored-procedures,db2,database-cursor,Stored Procedures,Db2,Database Cursor,从光标检索正确结果时遇到问题。我没有经常使用光标,如果能给我指出正确的方向,我将不胜感激。我需要这个游标来返回生成多行的select语句的结果。db2存储过程的call语句是 CALL schema.stored_procedure ('in_category', 'in_BUSINESS_NAME', 'ALL'); in_Business_name之后的最后一个参数是项目名称。当声明为“ALL”时,它应该生成由多行组成的所有项目。声明特定项目名称后,该过程将生成一行,例如: CALL sc

从光标检索正确结果时遇到问题。我没有经常使用光标,如果能给我指出正确的方向,我将不胜感激。我需要这个游标来返回生成多行的select语句的结果。db2存储过程的call语句是

CALL schema.stored_procedure ('in_category', 'in_BUSINESS_NAME', 'ALL');
in_Business_name之后的最后一个参数是项目名称。当声明为“ALL”时,它应该生成由多行组成的所有项目。声明特定项目名称后,该过程将生成一行,例如:

CALL schema.stored_procedure ('CATEGORY_1', 'BUSINESS_1', 'PROJECT_1');
我已经进行了检查,它似乎收到了“in_category”和“in_BUSINESS_name”的值,但没有收到项目名称的值。这是我的光标:

DECLARE CURS1 CURSOR FOR
SELECT DP.dim_project_id
   ,DP.PROJECT_NAME
   ,DP.TITLE
   ,DP.LONG_TITLE
   ,DP.POINT
   ,DP.FIELD_SHORT
   ,DP.FIELD
   ,DM.BUSINESS_id
   ,DM.BUSINESS_NAME 
   ,'CATEGORY_1' 
   ,0.0 AS CAPABILITY
   ,SCHEMA.BUCKET_A(in_BUSINESS_NAME,a.project_name, 19990101, 20040522) AS BUCKET_A
   ,SCHEMA.BUCKET_B(in_BUSINESS_NAME,a.project_name, 19990101, 20040522) AS BUCKET_B
   ,SCHEMA.BUCKET_C(in_BUSINESS_NAME,a.project_name, 19990101, 20040522) AS BUCKET_C
   ,0.0 AS PERCENT
   ,0.0 AS PERCENT_A
   ,0.0 AS PERCENT_B   
from (SELECT distinct DP.PROJECT_NAME   
 FROM warehouse.fact AS FAT
 INNER JOIN WAREHOUSE.DIM_JOB AS DJ on FAT.DIM_JOB_ID = DJ.DIM_JOB_ID
 INNER JOIN WAREHOUSE.DIM_PROJECT AS DP on FAT.DIM_PROJECT_ID = DP.DIM_PROJECT_ID
 INNER JOIN WAREHOUSE.DIM_A AS DA on FAT.DIM_A_ID = DA.DIM_A_ID
 WHERE FAT.ADJUSTED_DATE_END_ID >= 19990101 AND FAT.ADJUSTED_DATE_END_ID < 20040522
 AND DA.category = in_CATEGORY_NAME
 AND DJ.BUSINESS_name=  in_BUSINESS_NAME) a
 left outer join warehouse.dim_project dp on dp.PROJECT_NAME = a.PROJECT_NAME
 left outer join warehouse.dim_BUSINESS dm on dm.BUSINESS_name = in_BUSINESS_NAME
 order by dp.project_name;

OPEN CURS1; 
IF (in_PROJECT_NAME = 'ALL' AND in_CATEGORY_NAME = 'CATEGORY_1') THEN
BEGIN 
  FETCH FROM CURS1 INTO 
 v_DIM_PROJECT_ID 
 ,v_PROJECT_NAME
 ,v_SHORT_TITLE
 ,v_LONG_TITLE 
 ,v_POINT
 ,v_FIELD_SHORT 
 ,v_FIELD 
 ,v_BUSINESS_ID
 ,v_BUSINESS_NAME
 ,v_CATEGORY_NAME
 ,v_CAPABILITY_HOURS
 ,v_BUCKET_A
 ,v_BUCKET_B
 ,v_BUCKET_C
 ,v_PERC_TOTAL
 ,v_PERCENT_BUCKET_A
 ,v_PERCENT_BUCKET_B;

  END;

 CLOSE CURS1;

可以将打开的游标视为具有多条记录的结果集,您可以通过执行fetch扫描这些记录。通常,在一段时间内扫描结果集,并对每一行执行一个操作

如果要根据给定的参数检索不同的值,则需要一个动态语句。您使用所需的列和谓词准备select,然后使用该列和谓词打开光标

这是一个基于给定参数的动态查询示例

ALTER MODULE LOGADMIN ADD
  PROCEDURE LOGS (
  IN LENGTH SMALLINT DEFAULT 72,
  IN QTY INT DEFAULT 100,
  IN MIN_LEVEL ANCHOR LOGDATA.LEVELS.LEVEL_ID DEFAULT NULL
  )
  LANGUAGE SQL
  SPECIFIC P_LOGS
  DYNAMIC RESULT SETS 1
  MODIFIES SQL DATA
  NOT DETERMINISTIC
  NO EXTERNAL ACTION
  PARAMETER CCSID UNICODE
 P_LOGS: BEGIN
  DECLARE STMT ANCHOR LOGGER.MESSAGE;
  DECLARE C CURSOR
    WITH RETURN TO CALLER
    FOR RS;

  SET STMT = 'SELECT TIME, MESSAGE FROM ('
    || 'SELECT SUBSTR(TIMESTAMP(L.DATE), 12, 15) AS TIME, '
    || 'SUBSTR(L.MESSAGE, 1, ' || LENGTH || ') AS MESSAGE '
    || 'FROM LOGDATA.LOGS AS L ';
  IF (MIN_LEVEL = -1) THEN
   SET STMT = STMT
     || 'WHERE L.LEVEL_ID = -1 OR L.LEVEL_ID IS NULL ';
  ELSEIF (MIN_LEVEL IS NOT NULL) THEN
   SET STMT = STMT
     || 'WHERE L.LEVEL_ID <= ' || MIN_LEVEL || ' '
     || 'AND L.LEVEL_ID >= 0 ';
  END IF;
  SET STMT = STMT
    || 'ORDER BY L.DATE DESC '
    || 'FETCH FIRST ' || QTY || ' ROWS ONLY '
    || 'WITH UR '
    || ') ORDER BY TIME'
    ;
  IF (LOGGER.GET_VALUE(LOGGER.LOG_INTERNALS) = LOGGER.VAL_TRUE) THEN
   INSERT INTO LOGDATA.LOGS (LEVEL_ID, LOGGER_ID, MESSAGE) VALUES
     (4, -1, 'Statement: ' || COALESCE(STMT,'NULL'));
   COMMIT;
  END IF;
  PREPARE RS FROM STMT;
  OPEN C;
 END P_LOGS @

此脚本取自log4db2:

不清楚您的问题是什么,但一般来说,在存储过程中使用查询之前,您需要确保查询返回您期望的结果……并且它看起来接收的是“in_category”和“in_BUSINESS_name”的值,而不是项目名称的值。请澄清没有收到项目名称值的内容。此外,请显示变量或参数定义。