执行存储在变量中的查询并在Oracle中读取结果
我有一个从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
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
记录的局部变量中,然后引用该记录中的字段。或者,您可以声明一个与游标定义匹配的自定义记录类型,并引用其中的字段,但这可能不会比声明其他局部变量更有效地简化代码。