2013-07-18 71 views
1

我想创建一个ORACLE存储过程,选择一些信息到游标中,对该游标运行一些更新。然后返回光标的内容,这是为了摆脱当前的设置,包括创建临时表并运行查询。我曾尝试存储过程更新一个光标,然后返回结果

一切都导致光标被淘汰的任何内容更新等,我想运行范围的内容..

基本上我想:

  1. 选择一些数据
  2. 做就可以进行一些处理
  3. 返回一些经处理的数据的(基于选择)

请帮忙!

我当前的代码是沿着线:

create or replace 
PROCEDURE TEMP_REPORT 
(
    returnTable OUT SYS_REFCURSOR 
) 
IS 
    CURSOR resultTable 
    IS 
    SELECT FNAME,SALARY FROM STAFF; 

    NAME  VARCHAR2 (10); 
    SALARY VARCHAR2 (10); 

BEGIN 


    Update resultTable set Salary = (salary * 1.1); 
    --- some more processing here 
    ---- now return the datarows 
    Cursor returnTable from select name, salary from resultTable where salary > 1000; 


END TEMP_REPORT; 
+0

我不认为你可以在光标更新数据。游标只是指向数据集的指针(即select语句)。您可以尝试的一件事是使用集合(用户定义类型的嵌套表) –

+0

您不能更改“在光标中”的数据。游标不是某种数据结构,其中包含所有可以操作的结果。 –

+0

至于你想运行的“更新”,那些超级复杂?有了一些SQL体操,你*可能*能够在单个查询中计算所有内容。如果不是,流水线功能可能适合你。几个月前,我终于开始使用我的第一个流水线功能,而且这非常容易,尽管您必须创建至少两个Oracle TYPE,而某些DBA可能会忽略它。 –

回答

1

什么不可以尝试一些简单的像:

declare 

    NAME  VARCHAR2 (10); 
    SALARY VARCHAR2 (10); 

begin 

FOR cid IN (select FNAME,SALARY FROM STAFF) LOOP 

     NAME := cid.NAME; 
     SALARY := cid.SALARY; 

     DBMS_OUTPUT. 
     put_line (
      NAME 
     || ' | ' 
     || SALARY); 
END LOOP; 

END;