-1

我有一个查询,在 select 语句中使用自定义构建的函数来返回其中一个值。

我遇到的问题是这个函数时不时会出错,因为它返回的信息不止一行。SQL 错误:ORA-01422:精确提取返回的行数超过了请求的行数

为了进一步复杂化这个问题,我检查了这个查询应该运行的范围内的表数据,并且找不到任何会根据这个函数的 where 子句重复的行。

因此,我想要一种快速的方法来确定原始查询的哪一行崩溃,以便我可以从该查询中获取将传递给函数的值,并使用这些值重建 Functions 查询以获得它的结果并查看哪个返回两行或多行。

有任何想法吗?我希望有一种方法可以强制 Oracle 一次处理一行,直到它出错,这样你就可以看到第一个错误的结果。

添加了代码:

FUNCTION EFFPEG
--Returns Effective Pegged Freight given a Effdate, ShipTo, Item
  DATE1 IN NUMBER -- Effective Date (JULIANDATE)
  , SHAN IN NUMBER -- ShipTo Number (Numeric)
  , ITM IN NUMBER -- Short Item Number (Numeric)
  , AST IN VARCHAR -- Advance Pricing type (varchar)
  , MCU IN VARCHAR Default Null --ShipFrom Plant (varchar)
) RETURN Number
IS
  vReturn Number;
BEGIN

    Select ADFVTR/10000 
    into vReturn 
    from PRODDTA.F4072 
    where ADEFTJ <= DATE1 
    and ADEXDJ >= DATE1 
    and ADAN8 = SHAN and ADITM = ITM 
    and TRIM(ADAST) = TRIM(AST) 
    and ADEXDJ = (
        Select min(ADEXDJ) ADEXDJ 
        from PRODDTA.F4072 
        where ADEFTJ <= DATE1 
        and ADEXDJ >= DATE1 
        and ADAN8 = SHAN 
        and ADITM = ITM 
        and TRIM(ADAST) = TRIM(AST));

调用此代码并传入值的查询是:

select GLEXR, ORDTYPE,
 EFFPEG(SDADDJ, SDSHAN, SDITM, 'PEGFRTT', SDMCU), 
from  proddta.F42119 
4

1 回答 1

0

我认为最好的方法是通过异常。

您需要做的是添加代码来处理函数中的多行异常:

EXCEPTION 
    WHEN TOO_MANY_ROWS THEN
         INSERT INTO ERR_TABLE
         SELECT your_columns 
         FROM query_that_sometimes_returns_multiple_rows 

在本例中,加倍的结果将转到单独的表中,或者您可以决定使用 dbms_output 简单地打印出来。

一个简单的页面可以是这个,然后只是谷歌例外,你应该能够找到你需要的一切。

希望这能有所帮助。

于 2013-10-18T16:54:44.457 回答