使用字符数作为分隔符 sql

Use the number of characters as delimiter sql

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

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

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

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 所以

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

这显然是 Oracle。因此:由于没有定界符,您必须按位置 获取数据。方法如下:

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 行提到了目录。它是一个 Oracle 对象,由用户 SYS 创建并指向位于数据库服务器上的目录。查看您的示例代码,就好像您想从桌面加载数据一样。它不会工作(除非您的 PC 也是数据库服务器,并且您将该目录命名为 desktop)。

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

grant read, write on directory ext_dir to scott;