0

現在、私は使用しています

    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 を使用してシェルからプロシージャを呼び出します。

4

1 に答える 1

3

匿名の PL/SQL ブロックは必要ありません。execute immediateDDLをネイティブコマンドとして実行できないため、その中で使用する必要があります。

これはあなたが持っているものと同等です:

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&PARAM12

parameters t4,idでそれを実行すると、次のnameようになります ( with 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;

order by新しいテーブルのデータには固有の順序がないため、この句は CTAS ステートメントではあまり意味がありませんが、有効な構文です。


本当に匿名ブロックで実行したい場合は、それを でラップするだけで済みますがexecute immediate、その周りに他のロジックを計画していない限り意味がありません。

BEGIN
    execute immediate 'CREATE TABLE &param1.2 AS SELECT * FROM '
      || ' &param1 Order By &param2,&param3';
END;
/
于 2013-09-24T08:56:16.213 に答える