Вызов процедуры для выборки курсора - PullRequest
0 голосов
/ 28 марта 2012

Не знаю, возможно ли это, но необходимо создать процедуру, которая при получении запроса просматривает данные в другой процедуре.

Пример:

Ниже приведен еще один пример того, насколько реальна моя структура:

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;

Мой большой вопрос заключается в том, что в обеих процедурах возврат всегда выполняется курсором, и я не могу это изменить.

Кто-нибудь знает, как решить эту проблему?

1 Ответ

0 голосов
/ 29 марта 2012
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;

Я не скомпилировал код, но я думаю, что это даст вам представление о подходе.

Предложение

  1. Если вы используете Oracle11g, то используйте функцию automatic subprogramming inline для оптимизации этого вызова процедуры. ссылка
  2. вы можете использовать update clause в курсоре и where current of при обновлении
...