0

我需要自动解析位于 http url(比如http://example.com/report.csv)上的 csv 文件并加载到表中。我如何使用 pl/sql 来做到这一点?

4

2 回答 2

1

使用外部表可能是个好主意。

首先,定义存储文件的目录(阅读更多):

CREATE OR REPLACE DIRECTORY my_files AS '/usr/bin/my_files';

然后参考创建的目录创建外部表(阅读更多):

CREATE TABLE SAMPLE_EXTERNAL_TABLE
  (C1 VARCHAR2(4000 BYTE),
    C2 VARCHAR2(4000 BYTE),
    C3 VARCHAR2(4000 BYTE),
    C4 VARCHAR2(4000 BYTE),
    C5 VARCHAR2(4000 BYTE))
  ORGANIZATION EXTERNAL
  (TYPE ORACLE_LOADER DEFAULT DIRECTORY "my_files" ACCESS PARAMETERS
    ( RECORDS DELIMITED BY '\r\n'
    CHARACTERSET AL32UTF8
    SKIP 1 --SKIPPING FIRST ROW(HEADER)
    fields terminated BY ';'
    optionally enclosed BY '"'
    missing field VALUES are NULL
    ) LOCATION ( "my_files":' report.csv' )) ;

现在您可以将 CSV 文件中的所有记录(嗯,从外部表中)插入到目标表中:

INSERT INTO SAMPLE_TARGET_TABLE
  (COLUMN1, COLUMN2, COLUMN3, COLUMN4)
SELECT * FROM SAMPLE_EXTERNAL_TABLE;
于 2017-05-11T14:43:46.897 回答
1

以下代码(来自http://www.talkapex.com/2017/04/query-csv-data-using-apex-5-1-apis/)显示了如何在 SQL 中解析 CSV 文件:

select fname, lname, dept
from 
  (
    select 
      rownum rn,
      rtrim(regexp_substr(column_value, '([^,])*(,)?', 1, 1), ',') fname,
      rtrim(regexp_substr(column_value, '([^,])*(,)?', 1, 2), ',') lname,
      rtrim(regexp_substr(column_value, '([^,])*(,)?', 1, 3), ',') dept
    from table(apex_string.split(:data,chr(10)))
  )
where rn > 1

您还可以使用apex_web_service.make_rest_request( https://docs.oracle.com/database/apex-5.1/AEAPI/MAKE_REST_REQUEST-Function.htm#AEAPI1955 )获取 CSV clob

于 2017-05-11T14:44:26.690 回答