这似乎是一个基本问题,但是我在这里没有发现任何类似的问题...
我目前正在exec
通过连接各种字符串和列来生成语句,如下所示:
SELECT ('exec my_package.my_procedure(input_var1 => ''' || columnA || ''', input_var2 => [... ... ...] || ''');') As sql_stmt FROM myTable;
在我决定添加另一个应从子查询中获取其值的输入参数之前,此方法一直很好(我省略了不相关的部分,这与上面的查询相同,只是添加了一个参数):
input_var_my_id => (select NVL(MAX(my_id)+1,1) from someTable where [various conditions] )
添加该参数后,出现一个PLS-00103
错误,说当(-+ case mod new not not null [....]时遇到了符号SELECT。
生成的exec语句如下所示:
my_package.my_procedure(input_var1 => 'whatever', input_var_my_id => (select NVL(MAX(my_id)+1,1) from someTable where [various conditions] ));
子查询本身是有效的,如果我从生成的语句中将其复制并执行,则结果是单个数据集-符合预期。
不可能将子查询的结果作为参数传递给PL / SQL包吗?有什么解决方法吗?谢谢你的帮助
不,不可能在实际参数列表中进行查询。您可以直接调用某些函数,但只能调用在PL / SQL中实现的那些函数。您无法切换到SQL上下文。您可以通过一个更简单的示例看到这一点:
exec dbms_output.put_line(select user from dual);
ORA-06550: line 1, column 28:
PLS-00103: Encountered the symbol "SELECT" when expecting one of the following:
...
您将不得不将查询结果放入一个局部变量中,该变量在生成的代码中将是丑陋的。它需要结束为:
declare
l_input_var_my_id someTable.my_id%type;
begin
select NVL(MAX(my_id)+1,1) into l_input_var_my_id from someTable where [various conditions];
my_package.my_procedure(input_var_my_id => l_input_var_my_id, ...);
end;
您可以将所有内容放入exec
:
exec declare l_input_var_my_id someTable.my_id%type; begin select NVL(MAX(my_id)+1,1) into l_input_var_my_id from someTable where [various conditions]; my_package.my_procedure(input_var_my_id => l_input_var_my_id, ...); end;
...然后从您的原始查询中生成。
但是,由于exec
这只是匿名块的简写,并且默认情况下必须位于一行上,因此生成该块可能会更清晰-因此,在不带exec
和的情况下,请/
自行将其放在一行上。取决于您计划如何调用结果以及它是否需要易于阅读。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句