【问题标题】:Execute query stored in variable and read result in Oracle执行存储在变量中的查询并在 Oracle 中读取结果
【发布时间】:2020-12-21 21:26:22
【问题描述】:

我有一个从查询返回结果集的过程,该查询是在 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..

我在哪里出错了,还是有其他方法可以做到这一点? 我被困在这里了。

【问题讨论】:

  • 如果你动态生成查询,你知道结果集在编译时会是什么样子吗?从您的示例中,您似乎假设动态查询将有一个名为val 的列,它是一个varchar2,其值可能为“TEST”。您知道在编译时将作为结果集的一部分返回的其他列吗?
  • 是的,我的结果集列已定义,我什至修改了查询以供理解。

标签: oracle plsql


【解决方案1】:

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

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

一个liveSQL link

【讨论】:

  • 非常感谢,它成功了。如果我只想要光标中的 select 语句中的 1 列,因为我有 10-15 列要从结果集中返回,并且只有 3 列要保存在表中
  • @RohanSampat - 您可能必须修改查询以仅返回这 3 列,或者为您忽略的不关心的列声明局部变量。如果查询碰巧选择了特定表中的每一列,您可以将数据提取到声明为table_name%rowtype 记录的局部变量中,然后引用该记录中的字段。或者您可以声明一个与游标定义匹配的自定义记录类型并从中引用字段,但这可能不会有意义地简化代码而不是声明额外的局部变量。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-13
  • 1970-01-01
相关资源
最近更新 更多