oracle 12.2.9
db版本18c
我们正在从外部源获取.csv(逗号分隔(文件。并且需要将_ string拆分为1个TABLE类型的Array字段,然后需要插入到接口表中。但是正如我在.csv(逗号分隔(文件数量字段中看到的"介于金额之间,即";71007498.00〃;
我有这个值"71,007,498.00",0.00,0.00,"71,007,498.00"
,
因此,在拆分这个值时,它应该像一样
lv_data_tbl := split_string('"71,007,498.00",0.00,0.00,"71,007,498.00",' , ',');
预期输出
lv_data_tbl(1)=71,007,498.00
lv_data_tbl(2)=0.00
lv_data_tbl(3)=0.00
lv_data_tbl(4)=71,007,498.00
但是得到这个输出:-
lv_data_tbl(1)=71
lv_data_tbl(2)=007
lv_data_tbl(3)=498.00
lv_data_tbl(4)=0.00
lv_data_tbl(5)=0.00
lv_data_tbl(6)=71
lv_data_tbl(7)=007
lv_data_tbl(8)=498.00
I猜测可以在SQL中通过解析该字符串来完成,但是-为什么不使用外部表功能呢?由于它在后台使用SQL*Loader,因此可以使用optionally enclosed
参数。
例如,这是我的源数据的内容(文件名为test_quotes.csv
(:
1,"71,007,498.00",0.00,0.00,"71,007,498.00"
2,15.00,"12,332.08","8.13",2.82
让我们创建外部表。它要求你有权访问一个目录(第11行((指向包含该文件的文件系统目录的Oracle对象。如果你不确定如何获得它,请与你的DBA联系。如果没有,请这样说(:
SQL> CREATE TABLE test_ext
2 (
3 id NUMBER,
4 val1 VARCHAR2 (15),
5 val2 VARCHAR2 (15),
6 val3 VARCHAR2 (15),
7 val4 VARCHAR2 (15)
8 )
9 ORGANIZATION EXTERNAL
10 (TYPE oracle_loader
11 DEFAULT DIRECTORY kcdba_dpdir
12 ACCESS PARAMETERS (RECORDS DELIMITED BY NEWLINE
13 FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"'
14 (id,
15 val1,
16 val2,
17 val3,
18 val4))
19 LOCATION ('test_quotes.csv'))
20 REJECT LIMIT UNLIMITED;
Table created.
有数据吗?
SQL> SELECT * FROM test_ext;
ID VAL1 VAL2 VAL3 VAL4
---------- --------------- --------------- --------------- ---------------
1 71,007,498.00 0.00 0.00 71,007,498.00
2 15.00 12,332.08 8.13 2.82
SQL>
很好;它毫不费力就起作用了。好的,付出一点努力。
另一方面,您可以使用SQL*Loader本身-编写控制文件并加载数据。它真的很快。而且-你不必访问任何目录-源文件可以驻留在你自己的硬盘上。