Wszystko od ORGANIZATION
dalej jest postrzegany jako kod PL/SQL, a nie część instrukcji dynamicznego SQL. Dołączasz nazwę tabeli do create table
ale potem nie dołączaj reszty jako części tego ciągu instrukcji. Musisz zrobić coś takiego:
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 || ''')
)';
W pierwszym wierszu kończący średnik został zastąpiony konkatenacją nowego literału napisowego. Odwołania do zmiennych p_tab_name
i DATAFILE
muszą być również wyłamane z tego dosłownego, wymagając więcej pojedynczych cudzysłowów i konkatenacji; a pojedyncze cudzysłowy, które w rzeczywistości są częścią wyrażenia, należy ominąć, podwajając je. Brakowało też wielu innych cytatów. To, co pokazano, powinno teraz działać.
Zmieniłem również używaną nazwę tabeli na p_tab_name
, ale musisz jawnie określić nazwy kolumn i typy danych. Nie ma sensu używać as select * ...
na stół zewnętrzny. To nie jest prawidłowa składnia, także przed organization
lub po reszcie, jeśli aktualne oświadczenie. Przypuszczam, że możesz wyodrębnić te informacje z all_tab_columns
i zbuduj tę część również dynamicznie, ale jeśli opierasz ją na stałej tabeli, i tak powinieneś ją znać.
Twoja logika upuszczania/tworzenia też jest wyłączona – myślę, że chcesz po prostu:
if n>0 then
execute immediate 'drop table ' || p_tab_name;
end if;
execute immediate 'create table ' || p_tab_name || '
...
... więc nie musisz powtarzać instrukcji create w obu gałęziach.
Poprawiłem też kilka innych błędów; PARAMETERS
zamiast PARAMETER
; FIELDS
zamiast FILEDS
; usunięto TRAILING NULLCOLS
. Spróbuj wykonać polecenie jako statyczny kod SQL przed przekonwertowaniem go na dynamiczny. Nadal mogą występować inne problemy.
I usunąłem dwie ostatnie obliczone kolumny:
DETL_CLMNS_HASH "ORA_HASH( :t4||:t7 )",
KEY_CLMNS_HASH "ORA_HASH(:t1||:t2||:t5)")
ORACLE_LOADER
kierowca
nie pozwala na takie manipulacje; SQL*Loader działa, ale nie są dokładnie takie same. Nie można również definiować kolumn wirtualnych w tabeli zewnętrznej. Jeśli używasz tego jako tabeli pomostowej do ładowania danych do innej (rzeczywistej) tabeli, możesz obliczyć te skróty podczas transferu; w przeciwnym razie możesz utworzyć widok tej zewnętrznej tabeli, która zawiera obliczone kolumny.