Создание внешней таблицы и загрузка этих данных в другую таблицу внутри процедуры

Я пытаюсь создать процедуру, которая позволяет загружать данные из файла во внешнюю таблицу. Далее следует создать: последовательность и триггер, которые позволяют автоматически генерировать идентификатор при вставке данных из внешней таблицы в другую таблицу. Я написал всю процедуру, но проблем много, поэтому начал с самого начала - просто создать внешнюю таблицу из файла.

CREATE OR REPLACE PROCEDURE LOAD_TO_EXTERNAL AS
  PATH_FILE VARCHAR2(100) := 'TEST_FILE.TXT';
  DELIMETER VARCHAR2(100) := '\n';
  DATE_FORMATTING VARCHAR2(100) := 'YYYY-MM-DD';
  STMT VARCHAR2(5000);
BEGIN
  STMT := 'CREATE TABLE "TEST_EXT"
    (
      DATA DATE,
      NAME VARCHAR2(5),
      CODE VARCHAR2(5)
    )
    ORGANIZATION EXTERNAL
    (
      TYPE ORACLE_LOADER DEFAULT DIRECTORY MY_DIR ACCESS PARAMETERS
      (RECORDS DELIMITED BY' || DELIMETER || '
      FIELDS LRTRIM (
          DATA (1:10) CHAR(10) DATE_FORMAT DATE MASK ' || DATE_FORMATTING || ',
          NAME (39:78) CHAR(40),
          CODE (79:80) CHAR(2)
         )
      ) LOCATION (' || PATH_FILE || ')
    )
    REJECT LIMIT UNLIMITED';

    EXECUTE IMMEDIATE STMT;

END LOAD_TO_EXTERNAL;

К сожалению, я получаю эту ошибку, которая указывает на EXECUTE IMMEDIATE:

ORA-00905: missing keyword
ORA-06512: at "SYSTEM.LOAD_TO_EXTERNAL_SEQ", line 34
ORA-06512: at line 2

Я также так предложение поставить STMT между: ('BEGIN ' || STMT || 'END;'), но тогда я получаю эту ошибку:

PLS-00103: Encountered the symbol "CREATE" when expecting one of the following:

   ( begin case declare exit for goto if loop mod null pragma
   raise return select update while with <an identifier>
   <a double-quoted delimited-identifier> <a bind variable> <<
   continue close current delete fetch lock insert open rollback
   savepoint set sql execute commit forall merge pipe purge
   json_exists json_value json_query json_object json_array

Я понятия не имею, что не так с этим...

Я пытался без создания STMT переменная, поместив утверждение непосредственно в EXECUTE IMMEDIATE, но это то же самое...

Более того, я знаю, что следующей проблемой будет загрузка данных из внешней таблицы в другую таблицу. Я получил сообщение о том, что внешняя таблица не существует, и это правда, но она будет создана перед вызовом кода, который будет загружать данные из внешней в обычную таблицу.

Буду признателен за вашу помощь!

**РЕДАКТИРОВАТЬ: **

Ответ @Guenther правильный - не хватает лишних цитат. Я обнаружил это сегодня утром. Но сейчас у меня другая проблема... Загрузить FLOAT данные во внешнюю таблицу... Данные такие: +00000700000,00, Есть идеи, как это сделать? FLOAT EXTERNAL или же FLOAT(15) не работает... конечно в CREATE У меня есть заявление FLOAT колонка.

1 ответ

Решение

Следующее работает отлично для меня. Я просто добавил дополнительное пространство после delimited by и дополнительные цитаты, где это необходимо.

create or replace PROCEDURE LOAD_TO_EXTERNAL AS
  PATH_FILE VARCHAR2(100) := 'TEST_FILE.TXT';
  DELIMETER VARCHAR2(100) := '-';
  DATE_FORMATTING VARCHAR2(100) := 'YYYY-MM-DD';
  STMT VARCHAR2(5000);
BEGIN
  STMT := 'CREATE TABLE "TEST_EXT"
    (
      DATA DATE,
      NAME VARCHAR2(5),
      CODE VARCHAR2(5)
    )
    ORGANIZATION EXTERNAL
    (
      TYPE ORACLE_LOADER DEFAULT DIRECTORY MY_DIR ACCESS PARAMETERS
      (RECORDS DELIMITED BY ''' || DELIMETER || '''
      FIELDS LRTRIM (
          DATA (1:10) CHAR(10) DATE_FORMAT DATE MASK ''' || DATE_FORMATTING || ''',
          NAME (39:78) CHAR(40),
          CODE (79:80) CHAR(2)         )
      ) LOCATION (''' || PATH_FILE || ''')
    )
    REJECT LIMIT UNLIMITED';

    EXECUTE IMMEDIATE STMT;
END LOAD_TO_EXTERNAL;

После этого

begin
 LOAD_TO_EXTERNAL();
end;

создает таблицу. Убедитесь, что владелец схемы имеет права на чтение каталога.

Другие вопросы по тегам