【发布时间】:2022-01-08 21:06:23
【问题描述】:
我想解析 CSV 文件并将数据存储在表中。我怎么能做到这一点。文件以 blob 类型存储在表中。这是第一个问题。其次,Oracle Apex“说”下面的代码不起作用,因为子查询返回了不止一行。但是当他返回超过一排时,我看不到这个地方。如果存在不同的方式将文件中的数据存储在表中,您可以提出建议。非常感谢。
DECLARE
l_ln NUMBER;
l_col1 VARCHAR2(255);
l_col2 VARCHAR2(255);
l_col3 VARCHAR2(255);
l_col4 VARCHAR2(255);
l_col5 NUMBER;
l_col6 DATE;
l_col7 DATE;
l_col8 NUMBER;
l_col9 NUMBER;
l_col10 VARCHAR2(255);
l_min_ln NUMBER;
l_max_ln NUMBER;
BEGIN
/* start and stop */
SELECT
MIN(line_number),
MAX(line_number)
INTO
l_min_ln,
l_max_ln
FROM
t_files f,
TABLE ( apex_data_parser.parse(p_content => f.f_blob, p_file_name => f.f_name) ) p
WHERE
f.file_id = :p5_file
AND line_number > 1;
/* end */
FOR counter IN l_min_ln..l_max_ln LOOP
SELECT
ff,
mm
ll,
bd,
(
SELECT
id
FROM
country
WHERE
upper(name) LIKE upper('%'
|| :country
|| '%')
) co,
dtn,
ind,
no,
np
INTO
l_col1,
l_col3,
l_col2,
l_col4,
l_col5,
l_col6,
l_col7,
l_col8,
l_col9
FROM
(
SELECT
line_number id_l,
col001 ff,
col002 mm,
col003 ll
col004 bd,
col005 co,
col006 dtn,
col007 ind,
col008 no,
col009 np,
col010 col
FROM
temp_files f,
TABLE ( apex_data_parser.parse(
p_content => f.f_blob,
p_skip_rows => counter - 1,
p_max_rows => counter,
p_file_name => f.f_name
) ) p
WHERE
f.file_id = :p5_file
AND line_number = counter
) temp_table
WHERE
id_l = counter;
IF l_col1 IS NOT NULL OR l_col2 IS NOT NULL OR l_col3 IS NOT NULL OR l_col4 IS NOT NULL OR l_col5 IS NOT NULL OR l_col6 IS
NOT NULL OR l_col7 IS NOT NULL OR l_col8 IS NOT NULL OR l_col9 IS NOT NULL OR l_col10 IS NOT NULL THEN
INSERT INTO tbn (
d1,
d2,
d3,
d4,
d5,
d6,
d7,
d8,
d9
) VALUES (
l_col1,
l_col2,
l_col3,
to_date(l_col4),
l_col5,
to_date(l_col6),
to_date(l_col7),
l_col8 || l_col9,
to_date(sysdate)
);
COMMIT;
END IF;
END LOOP;
END;
【问题讨论】:
-
改为加入。
-
我怀疑国家 ID 的内联子查询:
WHERE upper(name) LIKE upper('%'|| :country|| '%')看起来并不总是会给出 1 个唯一结果。 :country 在某些情况下是否为空? -
在子查询中使用
select max(id) || case when count(*) > 1 then 'DUPLICATED! '|| count(*) end ...仅返回一行,您可以看到哪个 ID 导致了问题。 -
非常感谢。这有效