如何通过在PL / SQL中将字符串附加到命令行变量来创建表?

时间:2013-09-24 08:28:13

标签: sql plsql oracle11g sqlplus

目前我正在使用

    def PARAM1=&1
    def PARAM2=&2
    def PARAM3=&3
    DECLARE &PARAM4 VARCHAR(20);
    BEGIN
        PARAM4 := &PARAM1 || '2';
        CREATE TABLE &param4 AS SELECT * FROM &param1 Order By &param2,&param3;
    END;
    /
    exit;

我正在尝试运行它,但它将我的错误视为无效的SQL语句。 我将使用SQLPlus从shell调用过程。

1 个答案:

答案 0 :(得分:3)

您不需要匿名的PL / SQL块;在此之内,您必须使用execute immediate,因为您无法将DDL作为本机命令。

这相当于我的想法:

def PARAM1=&1
def PARAM2=&2
def PARAM3=&3
def PARAM4=&PARAM1.2
CREATE TABLE &param4 AS SELECT * FROM &param1 Order By &param2,&param3;
exit;

&PARAM1与您2的固定值之间的时间段marks the end of the variable name。没有它,&PARAM12将被解释为新参数。我猜这可能是导致你出现问题的原因。

如果我使用参数t4idname运行,我得到(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 &param4 AS SELECT * FROM &param1 Order By &param2,&param3
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 &param1.2 AS SELECT * FROM '
      || ' &param1 Order By &param2,&param3';
END;
/