1

我有一个光标如下:

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

我只需要修改游标内某些特定行的数据。以后谁会使用这个游标,他们应该只从这个游标中找到修改后的数据。

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

4

3 回答 3

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”的员工的薪水加倍。您可以使用 aUNION ALL返回数据库中不存在的行,即

SELECT employee_id, 
       first_name,
       last_name,
       salary
  FROM employee
UNION ALL
SELECT -1,
       'Justin',
       'Cave',
       17
  FROM dual
于 2012-08-30T18:00:24.313 回答
2

让您尝试实现的最简单方法是返回可变数组或嵌套表(流水线或输出参数)。当你填充它时,你可以做你需要的所有改变。如果您确实需要返回游标并且不需要像 UPDATE CURRENT OF 之类的东西,您可以将数据放在 vararray/nested 表中,作为 IN 参数过去到 pipilined 函数中,并从您的 pipilened 函数中创建游标作为 select *(准备 vararray/nested桌子)。

您可以在函数内部进行所有处理,将结果放在任何临时表中并从临时表中返回游标。

于 2012-08-30T18:24:10.337 回答
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;
于 2012-08-30T21:39:04.790 回答