【问题标题】:DB2 stored procedure w/ parameters带参数的 DB2 存储过程
【发布时间】:2014-05-19 19:57:44
【问题描述】:

我很难从我的存储过程中产生正确的结果。我正在使用 db2 数据库,我有 3 个输入参数部门、部门、项目。我的调用语句如下所示。

CALL schema.stored_procedure ('IT', 'MARKETING', 'ONLINE FULFILLMENT')

当指定第三个参数或具有项目名称的值时,我需要生成将显示该行数据的结果(如上面的示例 'Online_fulfillment')并显示所有当第三个参数的项目名称值为“ALL”时的结果(根据下面的示例'ALL')。

CALL schema.stored_procedure ('IT', 'MARKETING', 'ALL')

我下面的查询目前只返回没有结果的列标题名称,我在调试它时遇到了麻烦。这是我当前的存储过程。

CREATE PROCEDURE schema.stored_procedure
  (IN in_DIVISION_NAME VARCHAR(200)
  ,IN in_DEPARTMENT_NAME VARCHAR(20)
  ,IN in_PROJECT_NAME VARCHAR(400)
  )
  DYNAMIC RESULT SETS 1
 BEGIN
  IF (in_PROJECT_NAME = 'ALL') THEN
   BEGIN
    DECLARE GLOBAL TEMPORARY TABLE TEMP_DW_1
      (DIM_PROJECT_ID INT 
      ,PROJECT_NAME VARCHAR (400) 
      ,DIM_DEPARTMENT_ID INT  
      ,DEPARTMENT_NAME VARCHAR(100) 
      ,DIVISION_NAME VARCHAR(100)  
      ) ON COMMIT DELETE ROWS NOT LOGGED WITH REPLACE;
   END;

    INSERT INTO SESSION.TEMP_DW_1 (DIM_PROJECT_ID, PROJECT_NAME, DIM_DEPARTMENT_ID,
      DEPARTMENT_NAME,DIVISION_NAME)
             SELECT DISTINCT DJ.DIM_PROJECT_ID
            ,PROJECT_NAME
            ,DIM_DEPARTMENT_ID
            ,DEPARTMENT_NAME
            ,DIVISION_NAME
                 FROM SCHEMA.FACT_TABLE 
                 WHERE DEPARTMENT_NAME =  in_DEPARTMENT_NAME
                 AND DIVISION_NAME =  in_DIVISION_NAME; 

          BEGIN
        DECLARE  exitCursor CURSOR WITH RETURN FOR
        SELECT * 
        FROM SESSION.TEMP_DW_1;

        OPEN exitCursor;

           END;
 END 

预期结果: CALL schema.stored_procedure ('IT', 'MARKETING', 'ONLINE FULFILLMENT') 预期成绩: CALL schema.stored_procedure ('IT', 'MARKETING', 'ALL')

【问题讨论】:

  • 两件事:1)为什么要将结果转储到临时表中,然后打开一个新游标并返回临时表中的所有行(而不是仅在初始 @987654326 上打开游标@)? 2) 这个过程实际上似乎可以创建为视图,在您加入结果的情况下,这可能会更好地使用优化器。显然,您无法为视图提供参数,但将它们作为连接条件/作为WHERE 子句的一部分提供是微不足道的。

标签: sql stored-procedures db2


【解决方案1】:

我相信我已经解决了这个问题,方法是添加一个额外的 IF 语句设置 in_PROJECT_NAME 'ALL' 并在第二个查询中添加一个额外的过滤器来设置 PROJECT_NAME = in_PROJECT_NAME。可能是解决此问题的更简单方法,但它有效:

IF (in_PROJECT_NAME <> 'ALL') THEN
 BEGIN
  DECLARE GLOBAL TEMPORARY TABLE TEMP_DW_1
    (DIM_PROJECT_ID INT 
    ,PROJECT_NAME VARCHAR (400) 
    ,DIM_DEPARTMENT_ID INT  
    ,DEPARTMENT_NAME VARCHAR(100) 
    ,DIVISION_NAME VARCHAR(100)  
    ) ON COMMIT DELETE ROWS NOT LOGGED WITH REPLACE;
 END;

 INSERT INTO SESSION.TEMP_DW_1 (DIM_PROJECT_ID, PROJECT_NAME, DIM_DEPARTMENT_ID,
   DEPARTMENT_NAME ,DIVISION_NAME)
   SELECT DISTINCT DJ.DIM_PROJECT_ID
     ,PROJECT_NAME
     ,DIM_DEPARTMENT_ID
     ,DEPARTMENT_NAME
     ,DIVISION_NAME
     FROM SCHEMA.FACT_TABLE 
     WHERE DEPARTMENT_NAME = in_DEPARTMENT_NAME
     AND DIVISION_NAME =  in_DIVISION_NAME; 
     AND PROJECT_NAME = in_PROJECT_NAME

【讨论】:

  • 您的解决方案看起来不错,但是如果您有很多情况,并且每次都需要复制相同的选择,那么最好是使用动态查询(准备,执行)。
  • 你能举个例子吗?
猜你喜欢
  • 2019-09-07
  • 2020-02-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-06
  • 1970-01-01
相关资源
最近更新 更多