这似乎是一个基本问题,但我在这里找不到类似的东西...
我目前通过连接各种字符串和列来生成1000
语句,如下所示:
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] )
错误,说当遇到符号SELECT时( - + case mod new not null [....]
是预期的。
生成的exec语句如下所示:
PLS-00103
子查询本身是有效的,如果我从生成的语句中复制并执行它,我会得到一个数据集 - 正如预期的那样。
是否无法将子查询的结果作为参数传递给PL / SQL包?有没有解决方法?谢谢你的帮助
答案 0 :(得分:4)
不,在实际参数列表中有查询是不可能的。您可以直接调用某些函数,但只能调用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
并使用/
自己在一条线上。取决于您打算如何调用结果,以及是否需要易于阅读。