强制Oracle一次处理一行

时间:2013-10-18 16:41:33

标签: oracle plsql

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

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

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

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

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

添加了代码:

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 

1 个答案:

答案 0 :(得分:0)

我认为最好的方法是通过例外。

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

EXCEPTION 
    WHEN TOO_MANY_ROWS THEN
         INSERT INTO ERR_TABLE
         SELECT your_columns 
         FROM query_that_sometimes_returns_multiple_rows 

在此示例中,doubled结果将转到分隔表,或者您可以决定使用dbms_output打印出来。

一个易于启动的页面可以是this,然后只是谷歌例外,您应该能够找到所需的一切。

希望这可以提供帮助。