我有一个光标如下:
CURSOR employee_cur IS
SELECT * FROM employee where department_id='accounts';
我只需修改游标内某些特定行的数据。稍后,无论谁将使用此游标,他们都应该从此游标中找到修改后的数据。
我不想更新任何数据库表。有人可以帮我吗?
答案 0 :(得分: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
答案 1 :(得分:2)
让你尝试实现的最简单方法是返回varray或嵌套表(pipelined或out param)。当您填充它时,您可以进行所需的所有更改。如果你真的需要返回游标并且不需要像UPDATE CURRENT OF这样的东西你可以将数据放在varray / nested表中,将IN参数作为pipilined函数过去,并从你的pipilened函数创建游标select *(准备好的vararray /嵌套表)。
您可以在函数内部执行所有处理,将结果放在任何临时表中并从临时表中返回光标。
答案 2 :(得分: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;