匿名の 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
&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 ¶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;
order by
新しいテーブルのデータには固有の順序がないため、この句は CTAS ステートメントではあまり意味がありませんが、有効な構文です。
本当に匿名ブロックで実行したい場合は、それを でラップするだけで済みますがexecute immediate
、その周りに他のロジックを計画していない限り意味がありません。
BEGIN
execute immediate 'CREATE TABLE ¶m1.2 AS SELECT * FROM '
|| ' ¶m1 Order By ¶m2,¶m3';
END;
/