可选地由封装.我们可以在sql查询中使用吗?或者有什么替代方案



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本身-编写控制文件并加载数据。它真的很快。而且-你不必访问任何目录-源文件可以驻留在你自己的硬盘上。

相关内容

最新更新