2012-08-30 47 views
1

我有如下光標:如何在沒有數據庫更新的情況下修改遊標僅保留的數據?

CURSOR employee_cur IS 
     SELECT * FROM employee where department_id='accounts'; 

我需要修改的數據僅用於內部光標某些特定行。稍後誰會使用這個遊標,他們應該只能從這個遊標中找到修改過的數據。

我不想更新任何數據庫表。有人可以幫助我嗎?

+0

環[你嘗試過什麼?](http://www.whathaveyoutried.com) – Kermit

回答

4

你不能。

遊標是隻讀結構。它是一個指向SQL語句的指針。當執行該SQL語句時,數據將從數據庫中獲取。您可以儘可能多地操作SELECT聲明中的數據。但是一旦光標打開,你就不能修改光標將返回的數據。

您當然可以操縱SELECT語句中的數據。例如,您的查詢可以執行如下操作:

SELECT employee_id, 
     first_name, 
     last_name, 
     (CASE WHEN last_name = 'King' 
      THEN salary*2 
      ELSE salary 
     END) salary 
    FROM employee 

使結果集中名爲「King」的任何員工的工資翻倍。您可以使用UNION ALL返回不存在於數據庫中的行,即

SELECT employee_id, 
     first_name, 
     last_name, 
     salary 
    FROM employee 
UNION ALL 
SELECT -1, 
     'Justin', 
     'Cave', 
     17 
    FROM dual 
2

最簡單的方式來獲得你想實現的是在回報VARRAY或嵌套表(流水線或出PARAM )。當你填充它時,你可以做所有你需要的改變。如果你確實需要返回一個遊標而不需要像UPDATE CURRENT OF那樣的東西,你可以把數據放在varray/nested table中,作爲IN param過濾到pipilined函數中,並創建光標作爲你的pipilened函數中的select *(準備vararray/nested表)。

你可以在你的函數中做所有的處理,把結果放在任何臨時表中並從臨時表返回光標。

1

聲明一個收藏 -

type my_emp_table_type is table of employee%rowtype; 
myEmpTable my_emp_table_type; 

然後用BULK COLLECT收集光標數據,通過

SELECT * BULK COLLECT INTO myEmpTable 
    FROM employee 
WHERE department_id='accounts'; 

修改收集要素喜歡 -

myEmpTable(10).id := 10; 
myEmpTable(10).first_name := 'John'; 
myEmpTable(10).last_name := 'Doe'; 

並使用myEmpTable無論你想。 注意,您可以通過收集的

for i in myEmpTable.first .. myEmpTable.last loop 
    if myEmpTable.(i)last_name = 'Doe' 
    then 
      myEmpTable.(i)sal := 50000; 
    end if; 
    ... 
    .... 
end loop; 
相關問題