2013-07-18 70 views
1

我想創建一個ORACLE存儲過程,選擇一些信息到遊標中,對該遊標運行一些更新。然後返回光標的內容,這是爲了擺脫當前的設置,包括創建臨時表並運行查詢。我曾嘗試存儲過程更新一個光標,然後返回結果

一切都導致光標被淘汰的任何內容更新等,我想運行範圍的內容..

基本上我想:

  1. 選擇一些數據
  2. 做就可以進行一些處理
  3. 返回一些經處理的數據的(基於選擇)

請幫忙!

我當前的代碼是沿着線:

create or replace 
PROCEDURE TEMP_REPORT 
(
    returnTable OUT SYS_REFCURSOR 
) 
IS 
    CURSOR resultTable 
    IS 
    SELECT FNAME,SALARY FROM STAFF; 

    NAME  VARCHAR2 (10); 
    SALARY VARCHAR2 (10); 

BEGIN 


    Update resultTable set Salary = (salary * 1.1); 
    --- some more processing here 
    ---- now return the datarows 
    Cursor returnTable from select name, salary from resultTable where salary > 1000; 


END TEMP_REPORT; 
+0

我不認爲你可以在光標更新數據。遊標只是指向數據集的指針(即select語句)。您可以嘗試的一件事是使用集合(用戶定義類型的嵌套表) –

+0

您不能更改「在光標中」的數據。遊標不是某種數據結構,其中包含所有可以操作的結果。 –

+0

至於你想運行的「更新」,那些超級複雜?有了一些SQL體操,你*可能*能夠在單個查詢中計算所有內容。如果不是,流水線功能可能適合你。幾個月前,我終於開始使用我的第一個流水線功能,而且這非常容易,儘管您必須創建至少兩個Oracle TYPE,而某些DBA可能會忽略它。 –

回答

1

什麼不可以嘗試一些簡單的像:

declare 

    NAME  VARCHAR2 (10); 
    SALARY VARCHAR2 (10); 

begin 

FOR cid IN (select FNAME,SALARY FROM STAFF) LOOP 

     NAME := cid.NAME; 
     SALARY := cid.SALARY; 

     DBMS_OUTPUT. 
     put_line (
      NAME 
     || ' | ' 
     || SALARY); 
END LOOP; 

END;