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

PL / SQLのDDLステートメント?

    次のようなことをしていると思います:

    declare
       v_temp varchar2(20);
    begin
       execute immediate 'create table temp(name varchar(20))';
       execute immediate 'insert into temp values(''XYZ'')';
    
       select name into v_name from temp;
    end;
    

    コンパイル時に、テーブル TEMP 存在しません 。まだ作成されていません。存在しないため、そこから選択することはできません。したがって、SELECTも動的に実行する必要があります。この特定のでは、実際にはSELECTを実行する必要はありません。 を使用して 構文。

    declare
       v_temp varchar2(20)
    begin
       execute immediate 'create table temp(name varchar2(20))';
       execute immediate 'insert into temp 
                          values(''XYZ'')
                          returning name into :1'
                    returning into v_temp;
    end;
    

    ただし、テーブルを動的に作成する必要があるということは、通常、スキーマの設計が不適切であることを示しています。本当に必要なわけではありません。

    RenéNyffenegger's をお勧めします 投稿「動的SQLが悪いのはなぜですか?」 パフォーマンスの観点から、可能な限り動的SQLを回避する必要がある理由。また、に対してはるかにオープンであることに注意してください。 SQLインジェクション バインド変数と DBMS_ASSERT> それを防ぐのに役立ちます。



    1. OracleREGEXP_REPLACE大文字の置換文字列

    2. OracleのNUMTODSINTERVAL()関数

    3. sqlalchemyのPostgresqlONCONFLICT

    4. 別の列に基づくPostgreSQLシーケンス