Oracle 调用过程获取游标

Oracle 调用过程获取游标,oracle,cursor,procedure,Oracle,Cursor,Procedure,不知道是否可能,但必须创建一个过程,在获取查询期间浏览另一个过程中的数据 例如: 下面是我的结构真实性的另一个例子: TYPE T_CURSOR IS REF CURSOR; PROCEDURE PR_ACCOUNT_ACTIVE(CCURSOR OUT T_CURSOR) IS CURSOR CURSOR_ACCOUNT IS SELECT ID_ACCOUNT, NAME, 0 AS SUM_BALANCE FROM ACCOUNT

不知道是否可能,但必须创建一个过程,在获取查询期间浏览另一个过程中的数据

例如:

下面是我的结构真实性的另一个例子:

TYPE T_CURSOR IS REF CURSOR;

PROCEDURE PR_ACCOUNT_ACTIVE(CCURSOR OUT T_CURSOR) IS

    CURSOR CURSOR_ACCOUNT IS
        SELECT ID_ACCOUNT, NAME, 0 AS SUM_BALANCE 
          FROM ACCOUNT
         WHERE STATUS = 'A'
         ORDER BY DATE_CREATE DESC;

    REG_ACCOUNT CURSOR_ACCOUNT%ROWTYPE;

    BEGIN

        OPEN CURSOR_ACCOUNT;
        LOOP

            FETCH CURSOR_ACCOUNT INTO REG_ACCOUNT;
            EXIT WHEN CURSOR_ACCOUNT%NOTFOUND;

            /*** 
            At this point I need to call the procedure PR_ACCOUNT_BALANCE (below) and
            her return and use (field SUM_VAL_MONEY) to update the field SUM_BALANCE
            this current cursor (CURSOR_ACCOUNT) and then return to the cursor CCURSOR
            ***/

        END LOOP;
        CLOSE CURSOR_ACCOUNT;

    END;

END PR_ACCOUNT_ACTIVE;


PROCEDURE PR_ACCOUNT_BALANCE(P_ID_ACCOUNT IS NUMBER, CCURSOR OUT T_CURSOR) IS

  BEGIN

    OPEN CCURSOR FOR

      SELECT ID_ACCOUNT
       , SUM(VAL_MONEY) AS SUM_VAL_MONEY
        FROM ACCOUNT_CONTRIBUTION
       WHERE ID_ACCOUNT = P_ID_ACCOUNT
       GROUP BY ID_ACCOUNT

END PR_ACCOUNT_BALANCE;
我的大问题是,在这两个过程中,返回总是由光标执行的,我不能改变这一点

有人知道如何解决这个问题吗

PROCEDURE PR_ACCOUNT_ACTIVE(CCURSOR OUT T_CURSOR) IS

CURSOR CURSOR_ACCOUNT IS
    SELECT ID_ACCOUNT, NAME, 0 AS SUM_BALANCE 
      FROM ACCOUNT
     WHERE STATUS = 'A'
     ORDER BY DATE_CREATE DESC;

REG_ACCOUNT CURSOR_ACCOUNT%ROWTYPE;

--create a record to fetch the value of the cursor 
TYPE p_rec is RECORD
(
  ID_ACCOUNT ACCOUNT.ID_ACCOUNT%TYPE
 ,SUM_VAL    PLS_INTEGER
);

 v_rec p_rec; --variable of that record

BEGIN

    OPEN CURSOR_ACCOUNT;
    LOOP

        FETCH CURSOR_ACCOUNT INTO REG_ACCOUNT;
        EXIT WHEN CURSOR_ACCOUNT%NOTFOUND;
           PR_ACCOUNT_BALANCE(REG_ACCOUNT.ID_ACCOUNT,v_cursor);
             FETCH  v_cursor INTO v_rec;
               UPDATE ACCOUNT SET sum_balance=v_rec.sum_val 
                    WHERE id_account=v_rec.id_account --assuming id_account is primary key of accounts table  
             CLOSE v_cursor;  

     END LOOP;
     CLOSE CURSOR_ACCOUNT;

END;

END PR_ACCOUNT_ACTIVE;

 PROCEDURE PR_ACCOUNT_BALANCE(P_ID_ACCOUNT IS NUMBER, CCURSOR OUT T_CURSOR) IS

 BEGIN

  OPEN CCURSOR FOR

  SELECT ID_ACCOUNT
   , SUM(VAL_MONEY) AS SUM_VAL_MONEY
    FROM ACCOUNT_CONTRIBUTION
   WHERE ID_ACCOUNT = P_ID_ACCOUNT
   GROUP BY ID_ACCOUNT

END PR_ACCOUNT_BALANCE;
我还没有编译代码,但我认为这会让您了解该方法

建议

  • 如果您使用的是Oracle11g,那么请使用
    自动子程序内联
    功能来优化此过程调用
  • 更新时,您可以在游标中使用
    update子句
    ,在当前的位置使用

  • 我不确定我是否理解你试图解决的问题。“在另一个过程中浏览数据”是什么意思?在
    PROC_1
    中,有一个
    FETCH
    ,但您没有获取任何内容。在
    FETCH
    之后的
    c1
    应该是记录而不是光标吗?您想为
    c1
    记录的
    field1
    分配什么?@rafael:首先,您想使用
    c1的值。field1
    proc\u 1
    中的第一个游标获取
    proc\u 2
    的输入,然后从proc\u 2中返回
    cursor
    ?并在
    proc_1
    中进行一些操作?如果是,这是可能的。@GauravSoni为了更好地理解,我改变了问题的例子。但是他的断言是正确的,这就是我要做的。@rafaelderpaula:请尝试这段代码,如果您遇到任何问题,请告诉我错误日志。谢谢!我将尝试使用这个代码,然后说它是否有效。Gaurav,使用上面的结构,它工作得非常完美。但是,我想做的不是帐户更新,而是分配字段SUM\u BALANCE CURSOR\u ACCOUNT的返回值,然后将其返回给CCUR或第一个过程(这是一个输出游标)。它必须这样做,或者必须使用临时表?@rafaelderpaula:Yaa将所有记录提取到临时表中,然后返回打开的
    ccursor
    ,并返回光标。