sql >> データベース >  >> RDS >> Oracle

ビューやその他のテーブルタイプを使用せずに、動的列名と動的データ型を使用してOracleで動的テーブルを作成する方法

    EXECUTE IMMEDIATEではセミコロンを使用できません 単一のステートメントの場合

    これは、ドキュメント からの引用です。 :

    EXECUTE IMMEDIATEからセミコロンを削除します 。

    execute immediate 'create table smap1(nam varchar2(10));'; -- this is your code
    execute immediate 'create table smap1(nam varchar2(10))';  -- correct code, no semicolon at end
    

    しかし、別の問題があります。

    置換変数(&variable)を理解する必要があります )動作します

    SQL * Plusは、置換変数の入力を1回だけ要求します。つまり、スクリプトがコンパイルされる直前、スクリプトを実行する前です。そして、変数はスクリプト内で逐語的に置き換えられ、その後コンパイルされて実行されます。

    たとえば、スクリプトを実行すると、SQL * Plusは2つの不明なリテラル(&colname)があることを認識します。 および&coldata )、およびプロンプトが表示されます。値「age」および「number」を指定すると、SQL*Plusはスクリプトを次のように書き直します。

    declare
        -- omitted to add clarity
    begin
        execute immediate 'create table smap1(nam varchar2(10));';
        if(no_of_cols>=2) then
            for i in 2..no_of_cols loop
                colname:=age;
                coldata:=number;
                execute immediate 'alter table smapl add '||colname||' '||coldata;  
            end loop;
        end if;
    end;
    

    したがって、文字列リテラルを変数に割り当て、その文字列を置換変数から取得する場合は、次のようにする必要があります。

    colname varchar2(30) := '&colname'; -- notice the single quotes
    

    colnameに「age」を指定したと仮定します SQL * Plusは、これを次のように変換します。

    colname varchar2(30) := 'age';
    

    したがって、 ループ内に置換変数を配置しても、SQL*Plusがその値の入力を繰り返し求めることはありません



    1. QtQMYSQLドライバーがWindowsにロードされていません

    2. ユーザーログオン時のPostgresqlトリガー

    3. Oracle内の特定のレコードのみを選択します

    4. Yii2でデフォルトスキーマを設定する方法