我有一个查询,在 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