我有一个过程,它从在 oracle 中动态生成的查询返回结果集。它确实返回结果集,但我想要的是从生成的结果集中处理信息并将其保存在表中。
这是我的查询..
PROCEDURE GetItem(pitem_list in varchar2,
PGetData OUT SYS_REFCURSOR)
is
strsql2 long;
BEGIN
strsql2 :='SELECT val, val1, val2 from table1'; ----- This is a sample query as the main query is complex so just for simplicity I wrote this here.
open PGetData for strsql2; ----- This do returns me the result set generated from the query;
现在我想要的是执行存储在“strsql2”变量中的查询并读取结果并处理一些信息..
我想从 FOR LOOP 中执行它。
strsql2 :='SELECT val, val1, val2 from table1';
for log in (select strsql2 from dual) ---- I even tried execute immediate
loop
if(log.val = 'TEST')
then
insert into table ----
else
update table --
end if;
end loop;
open PGetData for strsql2; --- After saving the result in table then return the result set..
我哪里出错了,或者还有其他方法吗? 我被困在这里了。
答案 0 :(得分:2)
在这种情况下,您可以简单地从游标中提取到局部变量中。在这种情况下,我知道我的查询返回三列,一列是整数,一列是字符串,另一列是日期,因此我声明了三个局部变量来保存结果。
declare
l_sql varchar2(1000);
l_rc sys_refcursor;
l_integer pls_integer;
l_string varchar2(100);
l_date date;
begin
l_sql := q'{select 1 int, 'foo' str, date '2020-12-21' dt from dual}';
open l_rc for l_sql;
loop
fetch l_rc
into l_integer, l_string, l_date;
exit when l_rc%notfound;
dbms_output.put_line( 'l_string = ' || l_string ||
' l_integer = ' || l_integer ||
' l_date = ' || to_char( l_date, 'dd-mon-yyyy' ) );
end loop;
end;
/