【问题标题】:ORA-01422: exact fetch returns more than requested number of rows pl/sqlORA-01422: 精确提取返回的行数超过 pl/sql 请求的行数
【发布时间】:2015-04-09 14:44:49
【问题描述】:

我的 PL/SQL 中有这个过程。 当我在 sql dev 中运行它时,它正好给了我一行(一列)

PROCEDURE Newpo_code(sp_code OUT VARCHAR2) 
IS 
BEGIN 
    SELECT To_char(Max(num)) 
    INTO   sp_code 
    FROM   (SELECT "ordernumber" num 
            FROM   "purchaseorder" 
            WHERE  ROWNUM = 1 
            ORDER  BY "pkpurchaseorderid" DESC) 
    WHERE  ROWNUM = 1; 

    SELECT Substr(sp_code, 10, 2) 
    INTO   sp_code 
    FROM   "purchaseorder"; 
END newpo_code; 

但是当我从代码级别运行它时

它给了我例外

ORA-01422: exact fetch returns more than requested number of rows

我在这里错过了什么?

我搜索了这个异常,但没有找到有用的结果。

【问题讨论】:

  • 您确定第二个查询没有返回多于一行吗?它没有 WHERE 子句

标签: oracle plsql


【解决方案1】:

没有什么可做的,但很可能这是线路失败:

select substr(SP_CODE,10,2) into SP_CODE from "PurchaseOrder";

为什么?因为PurchaseOrder 表中可能有超过 1 行,所以您尝试将哪个字段放入一个变量 SP_CODE

您可能需要在PurchaseOrder 上添加where 子句。

【讨论】:

    【解决方案2】:
    PROCEDURE Newpo_code(sp_code OUT VARCHAR2) 
    IS 
    BEGIN 
        SELECT To_char(Max(num)) 
        INTO   sp_code 
        FROM   (SELECT "ordernumber" num 
                FROM   "purchaseorder" 
                WHERE  ROWNUM = 1 
                ORDER  BY "pkpurchaseorderid" DESC) 
        WHERE  ROWNUM = 1; 
    
        SELECT Substr(sp_code, 10, 2) 
        INTO   sp_code 
        FROM   dual; 
    END newpo_code; 
    

    完成! 不管怎么说,多谢拉。

    【讨论】:

    • 最好使用:sp_code := Substr(sp_code, 10, 2); 而不是从双重中不必要的选择
    • 使用 WHERE ROWNUM=1 的“答案”将始终更新/使用第一(或最旧)行,而不是您要查找的确切行。使用此类语句操作时要非常谨慎,并在执行此类操作时尽可能准确。
    猜你喜欢
    • 2013-11-15
    • 2015-09-24
    • 1970-01-01
    • 2019-01-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-14
    相关资源
    最近更新 更多