Sql 存储过程更新游标,然后返回结果

Sql 存储过程更新游标,然后返回结果,sql,oracle,Sql,Oracle,我试图创建一个ORACLE存储过程,将一些信息选择到游标中,并在该游标上运行一些更新。然后返回游标的内容,这将从当前设置中移开,该设置涉及创建临时表并对其运行查询 我所尝试的一切都导致光标的内容超出了我想要运行的任何更新等的范围 基本上,我正在尝试: 选择一些数据 对它进行一些处理 返回一些已处理的数据(基于选择) 请帮忙 我目前的代码大致如下: create or replace PROCEDURE TEMP_REPORT ( returnTable OUT SYS_REFCURSOR )

我试图创建一个ORACLE存储过程,将一些信息选择到游标中,并在该游标上运行一些更新。然后返回游标的内容,这将从当前设置中移开,该设置涉及创建临时表并对其运行查询

我所尝试的一切都导致光标的内容超出了我想要运行的任何更新等的范围

基本上,我正在尝试:

  • 选择一些数据
  • 对它进行一些处理
  • 返回一些已处理的数据(基于选择)
  • 请帮忙

    我目前的代码大致如下:

    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;
    

    什么不可以尝试一些简单的方法,例如:

    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;
    

    什么不可以尝试一些简单的方法,例如:

    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;
    

    我认为你不能用光标更新数据。游标只是指向数据集的指针(即select语句)。您可以尝试使用集合(用户定义类型的嵌套表),但不能“在游标中”更改数据。游标不是一种数据结构,所有的结果都“在”它里面,你可以操作。至于你想要运行的“更新”,那些是超级复杂的吗?通过一些SQL技巧,您可以在一个查询中计算所有内容。如果不是,则管道函数可能适合您。几个月前,我终于开始使用我的第一个管道函数,它非常简单,尽管您必须创建至少两种Oracle类型,一些DBA可能会对此犹豫不决。我已经更新了上面的代码,以显示我正在尝试做什么(我知道代码不起作用)。是否不能创建另一个包含原始游标的更新值等的游标,然后返回最终游标?或者,在某种一次性视图中,所有这些都能更好地完成吗?听起来您需要一个流水线函数,该函数将根据某些业务逻辑以编程方式对行进行管道化(更改或不更改)。例如,我不认为你可以更新光标中的数据。游标只是指向数据集的指针(即select语句)。您可以尝试使用集合(用户定义类型的嵌套表),但不能“在游标中”更改数据。游标不是一种数据结构,所有的结果都“在”它里面,你可以操作。至于你想要运行的“更新”,那些是超级复杂的吗?通过一些SQL技巧,您可以在一个查询中计算所有内容。如果不是,则管道函数可能适合您。几个月前,我终于开始使用我的第一个管道函数,它非常简单,尽管您必须创建至少两种Oracle类型,一些DBA可能会对此犹豫不决。我已经更新了上面的代码,以显示我正在尝试做什么(我知道代码不起作用)。是否不能创建另一个包含原始游标的更新值等的游标,然后返回最终游标?或者,在某种一次性视图中,所有这些都能更好地完成吗?听起来您需要一个流水线函数,该函数将根据某些业务逻辑以编程方式对行进行管道化(更改或不更改)。请参阅以获取示例