【问题标题】:Oracle ORA-01427: single row subquery returns more than one rowsOracle ORA-01427: 单行子查询返回多行
【发布时间】: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 导致了问题。
  • 非常感谢。这有效

标签: sql database oracle plsql


【解决方案1】:

为什么不在 1 条语句中这样写:

INSERT INTO tbn ( d1, d2, d3, d4, d5, d6, d7, d8, d9 ) 
    select col001, col002, col003, to_date(col004), c.id, 
           to_date(col006), to_date(col007), col008||col009, sysdate
    from TEMP_FILES f,
         TABLE ( apex_data_parser.parse( p_content => f.f_blob, 
                                         p_file_name => f.f_name ) ) p,
         COUNTRY c
    WHERE  f.file_id = :p5_file
      and upper(c.name) LIKE upper('%' || col005 || '%')
      and ( col001 is not null or col002 is not null or 
            col003 is not null or col004 is not null or
            col005 is not null or col006 is not null or 
            col007 is not null or col008 is not null or
            col009 is not null or col010 is not null);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-11-02
    • 1970-01-01
    • 2014-06-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多