0

我有以下 SQL*Plus 代码:

COLUMN x NEW_VALUE x2
BEGIN
   -- ...
   EXECUTE IMMEDIATE 'SELECT ''a'' x FROM dual';
   EXECUTE IMMEDIATE 'SELECT colname x FROM some_table WHERE (some_condition)';
   -- ...
END;

此时,&x2 仍然为空,并且 colname 不是 NULL。如果没有别的,为什么不设置为“a”?

4

2 回答 2

2

COLUMN是一个 SQL*Plus 客户端结构,动态 SQL 在 PL/SQL 引擎内部运行,因此没有真正的连接。我不确定你会在哪里记录不适用的东西。

我能想到的最接近的方法——假设你这样做是为了让你的动态 SQL 的结果可用于稍后在脚本中规划 SQL 语句——而是使用绑定变量:

var x varchar2(30);

BEGIN
    EXECUTE IMMEDIATE 'SELECT ''a'' x FROM dual' INTO :x;
END;
/

select :x from dual;

您可以:x在任何您使用过的地方使用&x2,但请记住,因为它是一个绑定变量,所以您在使用它时不需要将它放在单引号中(如果它是一个 varchar);如果你这样做:

select ':x' from dual;

...然后你会支持文字 string :x,而不是a

编辑添加

如果您特别需要&表格,您可以做进一步的步骤(未经测试,但看不出为什么不这样做):

column x2 new_value x3
select :x as x2 from dual;

...您将&x3有空。

于 2012-06-29T19:48:13.043 回答
0

在网络上进行数小时的测试和搜索(无果而终)之后,这是我能想到的最好的: EXECUTE IMMEDIATE在它自己的泡沫宇宙中运行,至少就COLUMN支持而言。它甚至看不到它,无论你做什么都不会。不知道为什么会这样,或者为什么在任何地方都没有记录(至少我能找到)。

于 2012-06-29T17:07:34.823 回答