代码之家  ›  专栏  ›  技术社区  ›  Jimenemex

投出的行太多,但只选择了一行

  •  2
  • Jimenemex  · 技术社区  · 6 年前

    我有一个过程,它只是根据一个名为 AppID AppNbr 基于这些行 应用程序ID 列。这个过程失败了 TOO_MANY_ROWS SELECT 一排。这是PL/SQL:

    DECLARE
        lvnApplNbr NUMBER;
    
        PROCEDURE deleteAppl(applId IN VARCHAR2) IS
        BEGIN
            BEGIN
                SELECT ApplNbr -- Exception thrown here
                INTO lvnApplNbr
                FROM Appl
                WHERE ApplID = applId;
            EXCEPTION
                WHEN TOO_MANY_ROWS THEN
                    DBMS_OUTPUT.PUT_LINE(SQLERRM);
            END;
            -- ... Delete it after some logic
        END; -- End Procedure
    BEGIN
        ...
        deleteAppl('571E00BA-70E6-4523-BEAC-4568C3DD1A7D');
        ...
    END;
    

    太多的行 异常被抛出时 SELECT INTO

    SELECT ApplNbr FROM Appl WHERE ApplId = '571E00BA-70E6-4523-BEAC-4568C3DD1A7D';
    

    只有一行会返回正确的 ApplId

    怎么回事?

    1 回复  |  直到 6 年前
        1
  •  5
  •   Barbaros Özhan    6 年前

    只需为相关表使用别名( Appl ):

       PROCEDURE deleteAppl(applId IN VARCHAR2) IS
       .....
       .....
       SELECT ApplNbr 
        INTO lvnApplNbr
        FROM Appl a
        WHERE a.ApplID = applId;
       ......
    

    applId )换个名字,比如 i_applId :

       PROCEDURE deleteAppl(i_applId IN VARCHAR2) IS
       .....
       .....
       SELECT ApplNbr 
        INTO lvnApplNbr
        FROM Appl
        WHERE ApplID = i_applId;
       ......
    

    parameter's name column name 都一样。

    推荐文章