我有如下光標:如何在沒有數據庫更新的情況下修改遊標僅保留的數據?
CURSOR employee_cur IS
SELECT * FROM employee where department_id='accounts';
我需要修改的數據僅用於內部光標某些特定行。稍後誰會使用這個遊標,他們應該只能從這個遊標中找到修改過的數據。
我不想更新任何數據庫表。有人可以幫助我嗎?
我有如下光標:如何在沒有數據庫更新的情況下修改遊標僅保留的數據?
CURSOR employee_cur IS
SELECT * FROM employee where department_id='accounts';
我需要修改的數據僅用於內部光標某些特定行。稍後誰會使用這個遊標,他們應該只能從這個遊標中找到修改過的數據。
我不想更新任何數據庫表。有人可以幫助我嗎?
你不能。
遊標是隻讀結構。它是一個指向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
最簡單的方式來獲得你想實現的是在回報VARRAY或嵌套表(流水線或出PARAM )。當你填充它時,你可以做所有你需要的改變。如果你確實需要返回一個遊標而不需要像UPDATE CURRENT OF那樣的東西,你可以把數據放在varray/nested table中,作爲IN param過濾到pipilined函數中,並創建光標作爲你的pipilened函數中的select *(準備vararray/nested表)。
你可以在你的函數中做所有的處理,把結果放在任何臨時表中並從臨時表返回光標。
聲明一個收藏 -
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;
環[你嘗試過什麼?](http://www.whathaveyoutried.com) – Kermit