我有一个查询,在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
答案 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,然后只是谷歌例外,您应该能够找到所需的一切。
希望这可以提供帮助。