使用字符数作为分隔符 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
所以
- 字段 1 (idF) = 1001 [4 个字符]
- 字段 2 (dt)= 2020/07/05 [10 个字符]
- 字段 3 (n)= 7 [1 个字符]
我不知道要使用什么 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;
我有这个练习: 有这种类型的文本文件
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 所以
- 字段 1 (idF) = 1001 [4 个字符]
- 字段 2 (dt)= 2020/07/05 [10 个字符]
- 字段 3 (n)= 7 [1 个字符]
我不知道要使用什么 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;