Использование varchar в контрольном файле для sqlldr

У меня есть процесс, который динамически создает файл CTL через запрос SQL. И мне нужно вставить имя файла в таблицу оракулов. Я могу получить имя файла для отображения в запросе, но он продолжает отклонять его. Ctls принимает только цифры? Потому что, если я жестко закодирую это число, оно будет работать. Если я жестко закодирую его в varchar, он отклонит его. Как я могу получить имя файла для вставки во время загрузки?

           '  LEAD_TIME,' || chr (10) ||
       '  DELIVERY_TIME,' || chr (10) ||
       '  DELIVERY_NO,' || chr (10) ||
       '  FREQUENCY,' || chr (10) ||
       '  FREQUENCY_UNIT,' || chr (10) ||
       '  MODE_TYPE,' || chr (10) ||
       '  AUDIT_LOG_ID "' || MAX(audit_log_id) || '",' || chr (10) ||
       '  STAGING_STATUS_ID "1",' || chr (10) ||
       '  FILENAME "&fname",' || chr (10) ||
       '  LINENO SEQUENCE(1)' || chr (10) ||
       ' )' || chr (10)
   from   audit_log
   where filename_orig = '&fname';

spool off

Вот результат работы sqlldr. Он правильно показывает имя файла, но все равно отклоняет запись.

       Column Name                  Position   Len  Term Encl Datatype
------------------------------ ---------- ----- ---- ---- ---------------------
VENDOR                              FIRST     *   ,       CHARACTER
COMM_CONTRACT                        NEXT     *   ,       CHARACTER
SERV_CONTRACT                        NEXT     *   ,       CHARACTER
ADDR_CHAIN                           NEXT     *   ,       CHARACTER
STORE                                NEXT     *   ,       CHARACTER
SITE_GROUP                           NEXT     *   ,       CHARACTER
START_DATE                           NEXT     *   ,       CHARACTER
END_DATE                             NEXT     *   ,       CHARACTER
ORDER_DAY                            NEXT     *   ,       CHARACTER
ORDER_TIME                           NEXT     *   ,       CHARACTER
LEAD_TIME                            NEXT     *   ,       CHARACTER
DELIVERY_TIME                        NEXT     *   ,       CHARACTER
DELIVERY_NO                          NEXT     *   ,       CHARACTER
FREQUENCY                            NEXT     *   ,       CHARACTER
FREQUENCY_UNIT                       NEXT     *   ,       CHARACTER
MODE_TYPE                            NEXT     *   ,       CHARACTER
AUDIT_LOG_ID                         NEXT     *   ,       CHARACTER
    SQL string for column : "26004459"
STAGING_STATUS_ID                    NEXT     *   ,       CHARACTER
    SQL string for column : "1"
FILENAME                             NEXT     *   ,       CHARACTER
    SQL string for column : "filenamexxx.csv"
LINENO                                                    SEQUENCE (1, 1)

value used for ROWS parameter changed from 64 to 51

Table DISA_STAGING_SUPP_SCHEDULE:
  0 Rows successfully loaded.
  6 Rows not loaded due to data errors.
  0 Rows not loaded because all WHEN clauses were failed.
  0 Rows not loaded because all fields were null.

1 ответ

Решение

Вы должны увидеть такие ошибки, как ORA-00984: column not allowed here, filenamexxx.csv рассматривается как имя столбца, а не как значение, потому что оно не заключено в кавычки; Вы можете изменить это, чтобы быть сгенерированным как:

FILENAME "'filenamexxx.csv'"

и чтобы ваш запрос избежал одинарных кавычек вокруг переменной подстановки:

       '  FILENAME "''&fname"'',' || chr (10) ||

или, если хотите, альтернативный механизм цитирования:

       q'[  FILENAME "'&fname"',]' || chr (10) ||
Другие вопросы по тегам