Oracle
 sql >> Baza danych >  >> RDS >> Oracle

PLS-00103 tworzenie zewnętrznej tabeli z dynamicznym SQL

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.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Błąd java.sql.SQLException:ORA-00911:nieprawidłowy znak

  2. Funkcja NLS_COLLATION_NAME() w Oracle

  3. Oracle SQL — usuń częściowy duplikat z ciągu znaków

  4. Automatyczne generowanie kluczy hibernacji za pomocą MySQL i Oracle

  5. Użyj wyniku zbierania zbiorczego w zapytaniu wybierającym bez kursora