执行存储在变量中的查询并在Oracle中读取结果

时间:2020-12-21 12:56:57

标签: oracle plsql

我有一个过程,它从在 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..

我哪里出错了,或者还有其他方法吗? 我被困在这里了。

1 个答案:

答案 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;
/

A liveSQL link

相关问题