【问题标题】:SQL loader positionSQL 加载器位置
【发布时间】:2017-04-27 15:07:01
【问题描述】:

SQL 加载程序的新手,对POSITION 有点困惑。 让我们使用以下示例数据作为参考:

Munising  49862 MI
Shingleton49884 MI
Seney     49883 MI

这里是load 声明:

LOAD DATA
   INFILE 'zipcodes.dat'
   REPLACE INTO TABLE zipcodes (
      city_name POSITION(1) CHAR(10),
      zip_code POSITION(*) CHAR(5),
      state_abbr POSITION(*+1) CHAR(2)
      )

在加载语句中,city_name POSITION 为 1。SQLLDR 怎么知道它在哪里结束? CHAR(10) 是这里的诀窍吗?算上“Munising”后面的两个空格,它有 10 个字符。

还有为什么zip_code 分配了 CHAR,即使它只包含数字?

谢谢

【问题讨论】:

    标签: oracle sql-loader


    【解决方案1】:

    是的,当没有指定结束位置时,它是从数据类型派生的。这个documentation 解释了 POSITION 子句。

    • city_name POSITION(1) CHAR(10)

      这里数据域的起始位置是1。结束位置没有指定,而是从数据类型派生出来的,即10。

    • 邮编 POSITION(*) CHAR(5)

      这里 * 表示,数据字段紧跟在前一个字段之后,应该是 5 个字节长。

    • state_abbr POSITION(*+1) CHAR(2)

      这里 +1 指定与前一个字段的偏移量。 Sqlloader 跳过 1 个字节并读取接下来的 2 个字节,这是从 char(2) 数据类型派生的。

    至于邮政编码为什么是CHAR,邮政编码被认为只是一个固定长度的字符串。您不会对其进行任何算术运算。因此,CHAR 适合它。 另外,请查看SQL Loader datatypes。在控制文件中,您告诉 SQL*Loader 如何解释数据。它可以不同于表结构。在此示例中,您还可以为邮政编码指定 INTEGER EXTERNAL。

    【讨论】:

      【解决方案2】:

      我们需要三个文本文件和一个批处理文件来加载数据:
      假设您的文件位置为 'D:\loaddata'
      输入文件 'D:\loaddata\abc.CSV'
      1. D:\loaddata\abc.bad -- 空
      2. D:\loaddata\abc.log -- 空
      3. D:\loaddata\abc.ctl "下面写代码"

          OPTIONS ( SKIP=1, DIRECT=TRUE, ERRORS=10000000, ROWS=5000000) 
          load data 
          infile 'D:\loaddata\abc.CSV' 
          TRUNCATE
          into table Your_table
        (
           a_column          POSITION   (1:7) char,
           b_column          POSITION   (8:10) char,
           c_column          POSITION   (11:12) char,
           d_column          POSITION   (13:13) char,
           f_column          POSITION   (14:20) char
        )
      
      1. D:\loaddata\abc.bat --- 用于执行

         sqlldr db_user/db_passward@your_tns control=D:\loaddata\abc.ctl log=D:\loaddata\abc.log
        

        双击“D:\loaddata\abc.bat”文件后,您的数据将被加载期望的oracle表。如果有任何问题,请检查“D:\loaddata\abc.bad”和“D:\loaddata\abc.log”文件

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-02-27
        • 2016-12-25
        • 2012-10-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-05-13
        • 1970-01-01
        相关资源
        最近更新 更多