【问题标题】:Using varchar in a control file for sqlldr在 sqlldr 的控制文件中使用 varchar
【发布时间】:2016-05-12 05:45:58
【问题描述】:

我有一个通过 sql 查询动态创建 CTL 文件的进程。而且我必须将文件名插入到 oracle 表中。我能够让文件名显示在查询中,但它一直拒绝它。 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.

【问题讨论】:

  • 您要插入的表的结构是什么(列和数据类型)?正在加载的数据是什么,这六行被拒绝的错误是什么?

标签: sql oracle controls sql-loader controlfile


【解决方案1】:

您应该会看到像 ORA-00984: column not allowed here 这样的错误。 filenamexxx.csv 被视为列名而不是值,因为它没有被引用;您可以将其更改为:

FILENAME "'filenamexxx.csv'"

为了做到这一点,您的查询已经转义了替换变量周围的单引号:

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

或者,如果您愿意,也可以使用另一种引用机制:

       q'[  FILENAME "'&fname"',]' || chr (10) ||

【讨论】:

  • 非常感谢。第一个片段解决了我的问题。你救了我的心痛。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-03-08
  • 1970-01-01
  • 2021-05-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多