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は機能しますが、まったく同じではありません。また、外部テーブルに仮想列を定義することもできません。これをステージングテーブルとして使用してデータを別の(実際の)テーブルにロードする場合は、転送中にこれらのハッシュを計算できます。それ以外の場合は、計算列を含むこの外部テーブルのビューを作成できます。