将子查询的结果作为参数传递给PL / SQL包

时间:2016-09-01 10:28:54

标签: sql oracle

这似乎是一个基本问题,但我在这里找不到类似的东西...

我目前通过连接各种字符串和列来生成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包?有没有解决方法?谢谢你的帮助

1 个答案:

答案 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并使用/自己在一条线上。取决于您打算如何调用结果,以及是否需要易于阅读。