【问题标题】:Use the number of characters as delimiter sql使用字符数作为分隔符 sql
【发布时间】:2020-07-09 09:20:12
【问题描述】:

我有这个练习: 有这种类型的文本文件

10012020/07/057
10022020/07/055
10032020/07/100
10042020/07/079
10052020/07/103
10062020/07/098
10072020/07/104
10082020/07/101
10092020/07/104
10102020/07/063

使用字符数作为分隔符将记录插入外部表(如下表)。

CREATE TABLE Ftest ( 
  idF   VARCHAR(255),
  dt   DATE,
  n      VARCHAR(255)
)
ORGANIZATION EXTERNAL
  (
    TYPE oracle_loader
  DEFAULT DIRECTORY desktop    
  ACCESS PARAMETERS
  ( 
    RECORDS DELIMITED BY '\n'
    BADFILE     CHARACTER
      DISCARDFILE CHARACTER
      LOGFILE     CHARACTER
      FIELDS TERMINATED BY ','
      OPTIONALLY ENCLOSED BY "'"
      MISSING FIELD VALUES ARE NULL     
      (
        idF     CHAR(255),
        dt      CHAR(255) date_format DATE mask 'YYYY/MM/DD',
        numero  CHAR(255)
      )  
  )
  LOCATION ('Test.csv')
)
REJECT LIMIT UNLIMITED;

采取第一条记录,我有: 10012020/07/057 所以

  • 字段 1 (idF) = 1001 [4 个字符]
  • 字段 2 (dt)= 2020/07/05 [10 个字符]
  • 字段 3 (n)= 7 [1 个字符]

我不知道使用什么 sql 命令来指定每个字段的分隔符。你有什么建议吗?或者在插入表之前修改文件,但始终使用sql语言的解决方案?

【问题讨论】:

  • 您使用的是 Oracle 还是 SQL Server? (请去掉多余的标签)。

标签: oracle sql-loader external-tables


【解决方案1】:

这显然是甲骨文。因此:由于没有分隔符,您必须按位置获取数据。方法如下:

SQL> CREATE TABLE Ftest (
  2    idF        VARCHAR(4),
  3    dt         DATE,
  4    numero     VARCHAR(1)
  5  )
  6  ORGANIZATION EXTERNAL
  7    (
  8      TYPE oracle_loader
  9      DEFAULT DIRECTORY EXT_DIR
 10      ACCESS PARAMETERS
 11      (
 12        RECORDS DELIMITED BY newline
 13        LOGFILE 'ftest.log'
 14        fields
 15          (idf    position(1:4),
 16           dt     position(5:14) date 'yyyy/mm/dd',
 17           numero position(15:15)
 18          )
 19      )
 20    LOCATION ('exercise.txt')
 21  )
 22  REJECT LIMIT UNLIMITED;

Table created.

有效吗?

SQL> select * from ftest;

IDF  DT       N
---- -------- -
1001 05.07.20 7
1002 05.07.20 5
1003 10.07.20 0
1004 07.07.20 9
1005 10.07.20 3
1006 09.07.20 8
1007 10.07.20 4
1008 10.07.20 1
1009 10.07.20 4
1010 06.07.20 3

10 rows selected.

SQL>

以防万一您不知道:第 9 行提到了目录。它是由用户 SYS 创建并指向位于数据库服务器上的目录的 Oracle 对象。查看您的示例代码,就好像您想从桌面加载数据一样。它不起作用(除非您的 PC 也是数据库服务器,并且您将该目录命名为 desktop)。

此外,SYS 必须向将使用该目录的用户授予权限,例如

grant read, write on directory ext_dir to scott;

【讨论】:

  • 如果日志文件确实在客户端,而不是在服务器上,sqlldr可以同定义使用
  • 非常感谢,它有效!我设置了桌面目录以更容易地找到文件。不过你很有用,非常感谢。 :)
猜你喜欢
  • 2017-10-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多