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;
我还没有编译代码,但我认为这会让您了解该方法
建议
自动子程序内联
功能来优化此过程调用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
,并返回光标。