使用 PL/SQL 读取 csv 文件
Reading a csv file with PL/SQL
我有一个 csv 文件,我想将它加载到 oracle apex 中,当我单击提交时,它必须通读 csv 文件并且 return csv 中的所有行都包含空值。
所以我有一个 table 名字 csvtest 并且它有字段 id, name 和 age 。
当我使用带有这些字段的文件浏览器将 csv 文件上传到 oracle apex 时,我想通读它并使用 plsql 找到 AGE 列中所有具有 NULL 的行,如果它们是 return 其他行none包含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;
/
由于您使用的是 APEX,一个非常简单的方法是使用提供的 APEX_DATA_PARSER 包。只需将您的 CSV 加载到一个 blob(或任何具有 blob 列的 table)中,然后它就是一个简单的(例如)
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 等等...
这里有完整的文档
Oracle APEX 博客上还有更多示例
一种方法是在将数据保存到 table 之前使用 APEX_DATA_PARSER API。
PARSE 函数使您能够解析 XML、XLSX、CSV 或 JSON 文件和 returns 具有以下结构的通用 table:
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') );
然后你可以很容易地根据列的位置确定数据的值,并决定是否将数据保存到table。
我有一个 csv 文件,我想将它加载到 oracle apex 中,当我单击提交时,它必须通读 csv 文件并且 return csv 中的所有行都包含空值。
所以我有一个 table 名字 csvtest 并且它有字段 id, name 和 age 。 当我使用带有这些字段的文件浏览器将 csv 文件上传到 oracle apex 时,我想通读它并使用 plsql 找到 AGE 列中所有具有 NULL 的行,如果它们是 return 其他行none包含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;
/
由于您使用的是 APEX,一个非常简单的方法是使用提供的 APEX_DATA_PARSER 包。只需将您的 CSV 加载到一个 blob(或任何具有 blob 列的 table)中,然后它就是一个简单的(例如)
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 等等...
这里有完整的文档
Oracle APEX 博客上还有更多示例
一种方法是在将数据保存到 table 之前使用 APEX_DATA_PARSER API。 PARSE 函数使您能够解析 XML、XLSX、CSV 或 JSON 文件和 returns 具有以下结构的通用 table:
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') );
然后你可以很容易地根据列的位置确定数据的值,并决定是否将数据保存到table。