1

我有一个 csv 文件,我想将它加载到 oracle apex 中,当我单击提交时,它必须通读 csv 文件并返回 csv 中包含 null 的所有行。

所以我有一个表名csvtest,它有字段id、nameage。当我使用带有这些字段的文件浏览器将 csv 文件上传到 oracle apex 时,我想通读它并使用 plsql 查找列 AGE 中具有 NULL 的所有行,如果它们不包含 null 然后返回它们成功上传文件

这是我到目前为止的代码,我没有任何方式阅读该专栏

DECLARE
    F_FILE UTL_FILE.FILE_TYPE;
    V_LINE VARCHAR2 (1000);
    V_ID NUMBER(10);
    V_NAME VARCHAR2(70);
    V_AGE NUMBER(2);

BEGIN
    F_FILE := UTL_FILE.FOPEN ('TEMP.CSV', 'R', 32767);
        IF UTL_FILE.IS_OPEN(F_FILE) THEN
            LOOP
                BEGIN
                    UTL_FILE.GET_LINE(F_FILE, V_LINE, 32767);
                    IF V_LINE IS NULL THEN
                    EXIT;
                    END IF;
                        V_ID := REGEXP_SUBSTR(V_LINE, '[^,]+', 1, 1);
                        V_NAME := REGEXP_SUBSTR(V_LINE, '[^,]+', 1, 2);
                        V_AGE := REGEXP_SUBSTR(V_LINE, '[^,]+', 1, 3);
                        INSERT INTO EMP_DEPT VALUES(V_ID, V_NAME, V_AGE);
                    COMMIT; 
                    EXCEPTION
                        WHEN NO_DATA_FOUND THEN
                        EXIT;
                END;
            END LOOP;
        END IF;
UTL_FILE.FCLOSE(F_FILE);
END;
/
4

2 回答 2

1

由于您使用的是 APEX,因此一种非常简单的方法是使用提供的 APEX_DATA_PARSER 包。只需将您的 CSV 加载到一个 blob(或任何具有 blob 列的表中),然后它就是一个简单的(例如)

select line_number, col001, col002, col003, col004, col005, 
                    col006, col007, col008, col009, col010
                    -- more columns (col011 to col300) can be selected here.
  from apex_application_temp_files f, 
       table( apex_data_parser.parse(
                  p_content                     => f.blob_content,
                  p_add_headers_row             => 'Y',
                  --
                  p_max_rows                    => 5,
                  p_skip_rows                   => 2,
                  p_csv_col_delimiter           => ';',
                  --
                  p_store_profile_to_collection => 'FILE_PARSER_COLLECTION',
                  p_file_name                   => f.filename ) ) p
 where f.name = :PX_FILE

它可以加载 CSV、JSON、XML、Excel 等...

完整的文档在这里

https://docs.oracle.com/en/database/oracle/application-express/19.1/aeapi/PARSE-Function.html#GUID-B815CF74-C469-4F78-9433-643D1339E930

以及 Oracle APEX 博客上的更多示例

https://blogs.oracle.com/apex/super-easy-csv-xlsx-json-or-xml-parsing-about-the-apex_data_parser-package

于 2020-06-03T09:23:57.243 回答
1

一种方法是在将数据保存到表之前使用APEX_DATA_PARSER API 。PARSE 函数使您能够解析 XML、XLSX、CSV 或 JSON 文件并返回具有以下结构的通用表:

LINE_NUMBER COL001 COL002 COL003 COL004 ... COL300

示例代码可能与此类似:

select line_number, col001,col002,col003,col004,col005,col006,col007,col008 
   from table( 
              apex_data_parser.parse(
                  p_content         => {BLOB containing CSV file},
                  p_file_name       => 'test.CSV') );

然后,您可以轻松地根据列的位置确定列的值,并决定是否将数据保存到表中。

于 2020-06-03T09:26:30.143 回答