假设我有一个存储过程接受2个varchars,做一些处理并更新我的业务表。有没有办法可以运行存储过程来获取选择查询的结果?
喜欢,
execute my_stored_proc select varchar_1,varchar_2 from an_ip_table;
答案 0 :(得分:2)
您可以循环遍历结果
BEGIN
FOR RECS IN (SELECT varchar_1, varchar_2 FROM an_ip_table)
LOOP
my_stored_proc (RECS.varchar_1, RECS.varchar_2);
END LOOP;
END
答案 1 :(得分:1)
这可能是一个简单的方法:
begin
for i in (
select varchar_1, varchar_2
from an_ip_table
)
loop
my_stored_proc(i.varchar_1, i.varchar_2);
end loop;
end;
答案 2 :(得分:0)
最初,我只是想发表评论,但这需要一些解释,所以我写了一个答案。你实际上是以错误的方式做事。理想情况下,您应该将光标传递给my_stored_proc
并在过程中提取光标。您的方法实际上会导致多次调用到查询结果中的每一行的过程。如果您拥有大量数据,处理速度将非常慢。即使行数很少,这也是一个坏主意。
以下是使用FORALL
执行dml操作的示例过程。它只是一个示例,但您应该能够转换您的选择查询,以便您能够以这种方式执行dml。
CREATE OR REPLACE PROCEDURE my_stored_proc (
p_iptab_cur SYS_REFCURSOR
) AS
TYPE iprec IS RECORD ( col1 an_ip_table.col1%TYPE,
col2 an_ip_table.col1%TYPE );
TYPE iptype IS
TABLE OF iprec;
ips iptype;
BEGIN
FETCH p_iptab_cur BULK COLLECT INTO ips;
FORALL i IN ips.FIRST..ips.LAST
--Your DML-- using the collection of records.
END;
/
--Calling the procedure by passing the `CURSOR`
DECLARE
x SYS_REFCURSOR;
BEGIN
OPEN x FOR select col1, col2
from an_ip_table;
my_stored_proc(x);
END;
/