2014-05-19 68 views
2

我很難從存儲過程中產生正確的結果。我使用的是db2數據庫,我有3個輸入參數division,department,project。我的通話聲明看起來像這樣。帶存儲過程的DB2存儲過程

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', '市場營銷', 'ONLINE應驗') enter image description here 預計業績: CALL schema.stored_procedure( 'IT', '市場營銷',「 ALL') enter image description here

+0

兩件事情:1)你爲什麼結果轉儲到一個臨時表,然後打開一個新的光標,並返回從臨時表中的所有行(相只要在初始的'SELECT'上打開一個遊標)? 2)這個過程實際上看起來可以被創建爲一個視圖,如果你加入到結果中,它可能會更好地使用優化器。顯然,你不能爲視圖提供參數,但將它們作爲連接條件/作爲WHERE條款的一部分提供是很簡單的。 –

回答

0

我相信我已經通過添加額外的解決了這個IF語句設置in_PROJECT_NAME <>‘全部’,並增加了過濾器,用於設置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 
+1

你的解決方案看起來不錯,但是如果你有很多情況,並且每次你需要複製同一個選擇,那麼最好的辦法就是使用動態查詢(準備,執行)。 – AngocA

+0

你能舉一個例子嗎? – Tone