我有一个光标如下:
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”的员工的薪水加倍。您可以使用 aUNION ALL
返回数据库中不存在的行,即
SELECT employee_id,
first_name,
last_name,
salary
FROM employee
UNION ALL
SELECT -1,
'Justin',
'Cave',
17
FROM dual
让您尝试实现的最简单方法是返回可变数组或嵌套表(流水线或输出参数)。当你填充它时,你可以做你需要的所有改变。如果您确实需要返回游标并且不需要像 UPDATE CURRENT OF 之类的东西,您可以将数据放在 vararray/nested 表中,作为 IN 参数过去到 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;