目前我正在使用
def PARAM1=&1
def PARAM2=&2
def PARAM3=&3
DECLARE &PARAM4 VARCHAR(20);
BEGIN
PARAM4 := &PARAM1 || '2';
CREATE TABLE ¶m4 AS SELECT * FROM ¶m1 Order By ¶m2,¶m3;
END;
/
exit;
我正在尝试运行它,但它将我的错误视为无效的SQL语句。 我将使用SQLPlus从shell调用过程。
答案 0 :(得分:3)
您不需要匿名的PL / SQL块;在此之内,您必须使用execute immediate
,因为您无法将DDL作为本机命令。
这相当于我的想法:
def PARAM1=&1
def PARAM2=&2
def PARAM3=&3
def PARAM4=&PARAM1.2
CREATE TABLE ¶m4 AS SELECT * FROM ¶m1 Order By ¶m2,¶m3;
exit;
&PARAM1
与您2
的固定值之间的时间段marks the end of the variable name。没有它,&PARAM12
将被解释为新参数。我猜这可能是导致你出现问题的原因。
如果我使用参数t4
,id
,name
运行,我得到(set verify on
}:
old:def PARAM1=&1
new:def PARAM1=t4
old:def PARAM2=&2
new:def PARAM2=id
old:def PARAM3=&3
new:def PARAM3=name
old:def PARAM4=&PARAM1.2
new:def PARAM4=t42
old:CREATE TABLE ¶m4 AS SELECT * FROM ¶m1 Order By ¶m2,¶m3
new:CREATE TABLE t42 AS SELECT * FROM t4 Order By id,name
所以它执行的最后一个语句是:
CREATE TABLE t42 AS SELECT * FROM t4 Order By id,name
或者你可以在没有明确的define
命令的情况下做同样的事情:
CREATE TABLE &&1.2 AS SELECT * FROM &&1 Order By &&2,&&3;
exit;
{CT}语句中的order by
子句没有多大意义,因为新表中的数据没有固有的顺序,但是它的语法有效。
如果你真的想在一个匿名区块中进行,你必须将它包装在execute immediate
内,但除非你计划围绕它的其他逻辑,否则没有意义: / p>
BEGIN
execute immediate 'CREATE TABLE ¶m1.2 AS SELECT * FROM '
|| ' ¶m1 Order By ¶m2,¶m3';
END;
/