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

ループ内のテーブルの数を保存できる数値変数を宣言する方法

    動的SQLには3つの問題があります。

    1. EXECUTEIMMEDIATEは関数ではありません。適切な構文はexecute immediate '<<query>>' into <<variable>>です。 。
    2. INSERTステートメントはVALUES句またはSELECTを取りますが、両方は取りません。この場合、SELECTは非常に間違っています。また、それはVALUEではなくVALUESであることに注意してください。
    3. COLUMN_NAMEは動的SQLの文字列リテラルであるため、引用符で囲む必要があります。ただし、SQLステートメント自体は文字列であるため、動的文字列の引用符はエスケープする必要があり、 `'''|| column_name||'''にする必要があります。

    したがって、修正されたバージョンは次のようになります

    declare
      Cursor C_TABLE  is 
        select trim(table_name) as table_name
          from all_tables
         where table_name in ('T1', 'T2', 'T3');
    
      V_ROWNUM number;
    
    begin
        for m in C_TABLE
          loop 
              for i in ( select column_name 
                          from (
                              select c.column_name
                                 from all_tab_columns c
                                where c.table_name = m.table_name 
                                  and c.owner = 'owner1' 
                                )  
                        )       
         loop
             execute immediate 'select count(*) from ' || m.table_name into  V_ROWNUM;
             execute immediate 'insert into MY_table values ( ''' || i.column_name || ''', ' || V_ROWNUM || ')';
    
            end loop;
        end loop;
    end;
    /
    

    動的SQLは、コンパイルエラーをランタイムエラーに変えるため、困難です。最初にステートメントを静的SQLとして記述することをお勧めします。基本的な構文を正しく理解したら、それを動的SQLに変換できます。



    1. 2つのテーブルデータを表示しようとしています

    2. SQLServerのランキング関数

    3. BLOB列のテキストを置き換える

    4. IN句を使用したSymfony2.3rawsqlクエリ