2015-02-09 86 views
-1

我創建了以下存儲過程:查看臨時表從內部存儲過程在Oracle

CREATE OR REPLACE PROCEDURE GetTPICostCenters 
IS 
    varCost_Center VARCHAR2(10); 
      varPI_MAX_DATE DATE; 
      varFD_MAX_DATE DATE; 

BEGIN 

    --OPEN costcenter_WFDB; 
    FOR item IN (select distinct(cost_center) as cost_center from fd_cost_center_validation where cost_center in 
      (select distinct(cost_center) from pi_cost_center_validation)) 
    LOOP 
    --FETCH costcenter_WFDB INTO varCost_Center; 



    SELECT GREATEST(nvl(CC_APPROVE_DATE,DATE '0001-01-01') ,nvl(CC_CHANGE_DATE,DATE '0001-01-01') ,nvl(CC_TAX_VALIDATE_DATE,DATE '0001-01-01'),nvl(COST_POOL_DETER_DATE,DATE '0001-01-01') ,nvl(DESC_UPDATE_DATE,DATE '0001-01-01'), 
    nvl(PRICING_METHOD_UPD_DATE,DATE '0001-01-01') ,nvl(INTER_861_LAST_MODIFY_DATE,DATE '0001-01-01')) INTO varPI_MAX_DATE 
    FROM pi_cost_center_validation WHERE COST_CENTER=item.cost_center; 

    SELECT GREATEST(nvl(CC_APPROVE_DATE,DATE '0001-01-01') ,nvl(CC_CHANGE_DATE,DATE '0001-01-01') ,nvl(CC_TAX_VALIDATE_DATE,DATE '0001-01-01'),nvl(COST_POOL_DETER_DATE,DATE '0001-01-01') ,nvl(DESC_UPDATE_DATE,DATE '0001-01-01'), 
    nvl(PRICING_METHOD_UPD_DATE,DATE '0001-01-01') ,nvl(INTER_861_LAST_MODIFY_DATE,DATE '0001-01-01')) INTO varFD_MAX_DATE 
    FROM fd_cost_center_validation WHERE S_ROWID IN 
     (SELECT S_ROWID FROM FD_COST_CENTER_VALIDATION FD GROUP BY COST_CENTER, S_ROWID 
     HAVING S_ROWID = (SELECT MAX(S_ROWID) FROM FD_COST_CENTER_VALIDATION WHERE COST_CENTER=FD.COST_CENTER)) 
     AND COST_CENTER=item.cost_center; 

    IF (varPI_MAX_DATE>varFD_MAX_DATE) THEN 
    INSERT INTO TPI_Data 
    (COST_CENTER,COST_CENTER_SHORT_NAME,COST_POOL,COST_POOL_PER,SUB_COST_POLL_SHORT_DESC,DRIVER, 
    DRIVER_PER,MARKUP_PERCENTAGE,MARKUP_BASE,PRICING,COST_POOL_B,COST_POOL_B_PER,COST_SUB_POOL_B, 
    DRIVER_2,DRIVER_2_PER,MARKUP_PERCENTAGE_2,MARKUP_BASE_2,PRICING_2,COST_POOL_C,COST_POOL_C_PER, 
    COST_SUB_POOL_C,DRIVER_3,DRIVER_3_PER,MARKUP_PERCENTAGE_3,MARKUP_BASE_3,PRICING_3,COST_POOL_D, 
    COST_POOL_D_PER,COST_SUB_POOL_D,DRIVER_4,DRIVER_4_PER,MARKUP_PERCENTAGE_4,MARKUP_BASE_4, 
    PRICING_4,COST_POOL_E,COST_POOL_E_PER,COST_SUB_POOL_E,DRIVER_5,DRIVER_5_PER,MARKUP_PERCENTAGE_5, 
    MARKUP_BASE_5,PRICING_5  
    ) 
    SELECT COST_CENTER, COST_CENTER_SHORT_NAME,COST_POOL,COST_POOL_PER, 
    SUB_COST_POLL_SHORT_DESC 
    ,DRIVER,DRIVER_PER, 
    MARKUP_PERCENTAGE,MARKUP_BASE,PRICING,COST_POOL_B,COST_POOL_B_PER,COST_SUB_POOL_B,DRIVER_2,DRIVER_2_PER,MARKUP_PERCENTAGE_2, 
    MARKUP_BASE_2,PRICING_2, 
    COST_POOL_C,COST_POOL_C_PER,COST_SUB_POOL_C,DRIVER_3,DRIVER_3_PER,MARKUP_PERCENTAGE_3, 
    MARKUP_BASE_3,PRICING_3, 
    COST_POOL_D,COST_POOL_D_PER,COST_SUB_POOL_D,DRIVER_4,DRIVER_4_PER,MARKUP_PERCENTAGE_4, 
    MARKUP_BASE_4,PRICING_4, 
    COST_POOL_E,COST_POOL_E_PER,COST_SUB_POOL_E,DRIVER_5,DRIVER_5_PER,MARKUP_PERCENTAGE_5, 
    MARKUP_BASE_5,PRICING_5 FROM pi_cost_center_validation WHERE COST_CENTER=item.cost_center; 
    ELSE 
    INSERT INTO TPI_Data 
    (COST_CENTER,COST_CENTER_SHORT_NAME,COST_POOL,COST_POOL_PER,SUB_COST_POLL_SHORT_DESC,DRIVER, 
    DRIVER_PER,MARKUP_PERCENTAGE,MARKUP_BASE,PRICING,COST_POOL_B,COST_POOL_B_PER,COST_SUB_POOL_B, 
    DRIVER_2,DRIVER_2_PER,MARKUP_PERCENTAGE_2,MARKUP_BASE_2,PRICING_2,COST_POOL_C,COST_POOL_C_PER, 
    COST_SUB_POOL_C,DRIVER_3,DRIVER_3_PER,MARKUP_PERCENTAGE_3,MARKUP_BASE_3,PRICING_3,COST_POOL_D, 
    COST_POOL_D_PER,COST_SUB_POOL_D,DRIVER_4,DRIVER_4_PER,MARKUP_PERCENTAGE_4,MARKUP_BASE_4, 
    PRICING_4,COST_POOL_E,COST_POOL_E_PER,COST_SUB_POOL_E,DRIVER_5,DRIVER_5_PER,MARKUP_PERCENTAGE_5, 
    MARKUP_BASE_5,PRICING_5  
    ) 
    SELECT COST_CENTER, COST_CENTER_SHORT_NAME,COST_POOL,COST_POOL_PER, 
    SUB_COST_POLL_SHORT_DESC,DRIVER,DRIVER_PER,MARKUP_PERCENTAGE,MARKUP_BASE,PRICING,COST_POOL_B, 
    COST_POOL_B_PER,COST_SUB_POOL_B,DRIVER_2,DRIVER_2_PER,MARKUP_PERCENTAGE_2,MARKUP_BASE_2,PRICING_2, 
    COST_POOL_C,COST_POOL_C_PER,COST_SUB_POOL_C,DRIVER_3,DRIVER_3_PER,MARKUP_PERCENTAGE_3,MARKUP_BASE_3,PRICING_3, 
    COST_POOL_D,COST_POOL_D_PER,COST_SUB_POOL_D,DRIVER_4,DRIVER_4_PER,MARKUP_PERCENTAGE_4,MARKUP_BASE_4,PRICING_4, 
    COST_POOL_E,COST_POOL_E_PER,COST_SUB_POOL_E,DRIVER_5,DRIVER_5_PER,MARKUP_PERCENTAGE_5,MARKUP_BASE_5,PRICING_5 
    FROM FD_COST_CENTER_VALIDATION WHERE S_ROWID IN 
     (SELECT S_ROWID FROM FD_COST_CENTER_VALIDATION FD GROUP BY COST_CENTER, S_ROWID 
     HAVING S_ROWID = (SELECT MAX(S_ROWID) FROM FD_COST_CENTER_VALIDATION WHERE COST_CENTER=FD.COST_CENTER)) 
     AND COST_CENTER=item.cost_center; 
    END IF; 
    END LOOP; 
    --CLOSE costcenter_WFDB; 

    INSERT INTO TPI_Data 
    (COST_CENTER,COST_CENTER_SHORT_NAME,COST_POOL,COST_POOL_PER,SUB_COST_POLL_SHORT_DESC,DRIVER, 
    DRIVER_PER,MARKUP_PERCENTAGE,MARKUP_BASE,PRICING,COST_POOL_B,COST_POOL_B_PER,COST_SUB_POOL_B, 
    DRIVER_2,DRIVER_2_PER,MARKUP_PERCENTAGE_2,MARKUP_BASE_2,PRICING_2,COST_POOL_C,COST_POOL_C_PER, 
    COST_SUB_POOL_C,DRIVER_3,DRIVER_3_PER,MARKUP_PERCENTAGE_3,MARKUP_BASE_3,PRICING_3,COST_POOL_D, 
    COST_POOL_D_PER,COST_SUB_POOL_D,DRIVER_4,DRIVER_4_PER,MARKUP_PERCENTAGE_4,MARKUP_BASE_4, 
    PRICING_4,COST_POOL_E,COST_POOL_E_PER,COST_SUB_POOL_E,DRIVER_5,DRIVER_5_PER,MARKUP_PERCENTAGE_5, 
    MARKUP_BASE_5,PRICING_5  
    ) 
    SELECT COST_CENTER, COST_CENTER_SHORT_NAME,COST_POOL,COST_POOL_PER, 
    SUB_COST_POLL_SHORT_DESC,DRIVER,DRIVER_PER,MARKUP_PERCENTAGE,MARKUP_BASE,PRICING,COST_POOL_B,COST_POOL_B_PER, 
    COST_SUB_POOL_B,DRIVER_2,DRIVER_2_PER,MARKUP_PERCENTAGE_2,MARKUP_BASE_2,PRICING_2,COST_POOL_C,COST_POOL_C_PER, 
    COST_SUB_POOL_C,DRIVER_3,DRIVER_3_PER,MARKUP_PERCENTAGE_3,MARKUP_BASE_3,PRICING_3,COST_POOL_D,COST_POOL_D_PER, 
    COST_SUB_POOL_D,DRIVER_4,DRIVER_4_PER,MARKUP_PERCENTAGE_4,MARKUP_BASE_4,PRICING_4,COST_POOL_E,COST_POOL_E_PER, 
    COST_SUB_POOL_E,DRIVER_5,DRIVER_5_PER,MARKUP_PERCENTAGE_5,MARKUP_BASE_5,PRICING_5 FROM FD_COST_CENTER_VALIDATION 
    WHERE S_ROWID IN 
    (SELECT S_ROWID FROM FD_COST_CENTER_VALIDATION FD GROUP BY COST_CENTER, S_ROWID 
     HAVING S_ROWID = (SELECT MAX(S_ROWID) FROM FD_COST_CENTER_VALIDATION WHERE COST_CENTER=FD.COST_CENTER)) 
     AND COST_CENTER NOT IN (SELECT COST_CENTER FROM TPI_Data); 


     COMMIT; 

END; 

在上面的存儲過程TPI_Deata是在過程中得到填充全局臨時表。在sql server中,我們曾經在存儲過程中執行「select * from temp_table」來查看存儲過程執行時的結果,但是在這裏我應該如何處理全局臨時表,以便在執行存儲過程時獲得表內記錄?

+0

做一個「select * from TPI_Data;」 ..不要在程序中做。從所謂的程序做起。或者,您可以讓程序返回REF Cursor .. http://docs.oracle.com/cd/E11882_01/appdev.112/e25519/static.htm#BABIIGAG – Ditto 2015-02-09 13:56:44

+0

TPI_Data是臨時表,一旦會話斷開行從其中刪除。如果我在執行「select * from TPI_Data」之前不再執行存儲過程,我將得到空表。你能幫忙嗎? – 2015-02-09 14:01:16

+0

無論何時調用此程序,仍處於同一會話中。你是否用ON COMMIT PRESERVE創建表格?或ON COMMIT DELETE?如果你使用前者,它會很好..同一屆,不用擔心。如果你做了後者,你可能會考慮從程序中刪除提交(有些人會認爲程序內部的COMMIT是不好的做法 - 我不打算在這裏爭論,但是如果你使用了它,可能會更好ON COMMIT DELETE);) – Ditto 2015-02-09 14:05:33

回答

1

使用Oracle時,應該忘記MSSQL。他們的方法完全不同。如果您希望從存儲過程返回一些表格數據,則通常應使用輸出REF CURSOR參數。如果你只想調試你的數據,那麼在調用SP之後簡單地做SELECT。

壞消息,在12c甲骨文實現了MSSQL-like facility緩解ms開發人員的痛苦。

+0

然後再從前端我必須聲明一個ref_cursor類型的變量,然後執行存儲過程是嗎?我試圖避免在執行時聲明任何進一步的變量,只是一個執行過程語句,有沒有解決方案? – 2015-02-09 13:58:57

+0

Sormita,如果你有一個工具,你應該明白這是首選的方法。現在,你看起來像一個騎自行車的人買了一輛勞斯萊斯,現在試圖用兩個車輪來駕駛它。從前端....也許你根本不需要SP,只需要從這個客戶端的一個SELECT。但是,如果您需要從SP返回結果集,則應該使用引用遊標。在服務器端,您應該將sys_refcursor參數描述到您的SP中。在客戶端,它依賴於DAC。 Google爲您的客戶端庫提供遊標示例。 – 2015-02-09 14:20:15

0

過程完成後,您可以查詢表格。如果您看到零行,這可能是因爲臨時表是用ON COMMIT DELETE ROWS(這是默認值)而不是ON COMMIT PRESERVE ROWS來聲明的。

http://docs.oracle.com/cd/E11882_01/server.112/e41084/statements_7002.htm#i2189569

如果你想查看從UI的結果,你要麼返回一個引用光標或使用常規表,使數據仍然存在。在全局臨時表中,一旦會話關閉,數據就會消失。

+0

這就是我想要的數據,我插入臨時表中的數據已經存在於其他兩個表中,我不想用相同的數據創建另一個表。 – 2015-02-09 14:03:22

+0

在這種情況下,返回引用光標是正確的方法。即使名稱GetTPICostCenters排序也指示該過程/函數以引用遊標的形式返回結果集。 (至少這是我在Oracle數據庫上下文中理解它的方式) – 2015-02-09 14:07:24