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

执行存储在变量中的查询并在Oracle中读取结果,oracle,plsql,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

我有一个从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循环执行它

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..
我哪里做错了,或者还有其他方法吗?
我被困在这里。

在这种情况下,您可以简单地从游标获取局部变量。在本例中,我知道我的查询返回三列,一列是整数,一列是字符串,一列是日期,所以我声明了三个局部变量来保存结果

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

如果动态生成查询,您知道结果集在编译时会是什么样子吗?从您的示例来看,您似乎假设动态查询将有一个名为
val
的列,该列是
varchar2
,其值可能为“TEST”。您知道在编译时将作为结果集的一部分返回的其他列吗?是的,我的结果集列已经定义,我甚至修改了查询以便于理解。非常感谢,它很有效。若我只想从游标中的select语句中得到一列,因为我有10-15列要从结果集中返回,只有3列要保存,那个该怎么办table@RohanSampat-您可能需要修改查询以仅返回这3列,或者为您不关心但忽略的列声明局部变量。如果查询碰巧选择了特定表中的每一列,则可以将数据提取到声明为
表\u name%rowtype
记录的局部变量中,然后引用该记录中的字段。或者,您可以声明一个与游标定义匹配的自定义记录类型,并引用其中的字段,但这可能不会比声明其他局部变量更有效地简化代码。