3

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)
      )

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

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

谢谢你

4

2 回答 2

1

是的,当未指定结束位置时,它是从数据类型派生的。本文档解释了 POSITION 子句。

  • 城市名称 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。

于 2014-04-23T05:52:34.530 回答
1

我们需要三个文本文件和 1 个批处理文件来加载数据:
假设您的文件位置 '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”文件

于 2017-04-27T06:32:39.780 回答