如何修改游标所持有的数据,而不更新数据库?

时间:2012-08-30 17:54:18

标签: sql oracle cursor updating

我有一个光标如下:

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

我只需修改游标内某些特定行的数据。稍后,无论谁将使用此游标,他们都应该从此游标中找到修改后的数据。

我不想更新任何数据库表。有人可以帮我吗?

3 个答案:

答案 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;