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

PLS-00103動的SQLを使用した外部テーブルの作成

    ORGANIZATIONのすべて 以降は、動的SQL文の一部ではなく、PL/SQLコードと見なされています。 create tableにテーブル名を追加します ただし、残りはそのステートメント文字列の一部として追加しません。次のようなことをする必要があります:

    execute immediate 'create table ' || p_tab_name || '
    ( /* put column names and types here */ )                  
    ORGANIZATION EXTERNAL 
    (
    TYPE ORACLE_LOADER
    DEFAULT DIRECTORY DE_DUBFILE
    ACCESS PARAMETERS 
        (
        RECORDS DELIMITED BY NEWLINE
        CHARACTERSET US7ASCII
        BADFILE     UPLOAD:''' || p_tab_name || '.bad''
        DISCARDFILE UPLOAD:''' || p_tab_name || '.dis''
        LOGFILE     UPLOAD:''' || p_tab_name || '.log''
        FIELDS TERMINATED BY '','' 
        optionally enclosed by ''"''
        MISSING FIELD VALUES ARE NULL
        (
        t1 ,t2,t3,t4,t5 date mask "YYYYMMDD" ,t6,t7,
        t8 ,t9, t10,t11
        )    
    LOCATION (''' || DATAFILE || ''')    
    )';
    

    最初の行では、終了セミコロンが新しい文字列リテラルの連結に置き換えられています。変数への参照p_tab_name およびDATAFILE そのリテラルからも切り離す必要があり、より多くの一重引用符と連結が必要です。また、実際にステートメントの一部である一重引用符は、それらを2倍にしてエスケープする必要があります。他にもさまざまな引用がありませんでした。表示されているものが実行されるはずです。

    また、使用されているテーブル名をp_tab_nameだけに変更しました 、ただし、列名とデータ型を明示的に指定する必要があります。 as select * ...を使用するのは意味がありません 外部テーブルの場合。 organizationの前でも、これは合法的な構文ではありません。 または、現在のステートメントの場合は残りの後に。 all_tab_columnsからその情報を抽出できると思います その部分も動的に構築しますが、固定テーブルに基づいている場合は、とにかくそれらを知っている必要があります。

    ドロップ/作成のロジックもオフになっています-必要なのは次のとおりです:

    if n>0 then                                    
      execute immediate 'drop table ' || p_tab_name; 
    end if;
    execute immediate 'create table ' || p_tab_name || '
    ...
    

    ...したがって、両方のブランチでcreateステートメントを繰り返す必要はありません。

    他にもいくつかの間違いを修正しました。 PARAMETERS PARAMETERではなく; FIELDS FILEDSではなく; TRAILING NULLCOLSを削除しました 。コマンドを動的に変換する前に、コマンドを静的SQLとして実行してみてください。まだ他の問題があるかもしれません。

    そして、最後の2つの計算列を削除しました:

        DETL_CLMNS_HASH "ORA_HASH( :t4||:t7 )",
        KEY_CLMNS_HASH "ORA_HASH(:t1||:t2||:t5)")
    

    ORACLE_LOADER ドライバー そのような操作は許可されていません。 SQL * Loaderは機能しますが、まったく同じではありません。また、外部テーブルに仮想列を定義することもできません。これをステージングテーブルとして使用してデータを別の(実際の)テーブルにロードする場合は、転送中にこれらのハッシュを計算できます。それ以外の場合は、計算列を含むこの外部テーブルのビューを作成できます。




    1. PHP MySQLは、配列キーから多次元連想配列構築クエリを挿入します

    2. selectにアスタリスクが存在すると、他の列が除外されますか?

    3. 表の水平値をOracleデータベース内の別の表の垂直値にバインドする方法

    4. SELECT /GROUPBY-値のシーケンス