2013-10-18 33 views
-1

我有一個查詢,在select語句中使用自定義構建函數來返回其中一個值。強制Oracle一次處理一行

我現在遇到的問題是,每次偶爾這個函數都會出錯,因爲它返回多行信息。 SQL錯誤:ORA-01422:精確提取返回的請求數超過要求的行數

爲了進一步解決問題,我檢查了該查詢應該運行的範圍內的表數據,並且找不到任何可能重複的行基於這個函數的where子句。

所以我想要一個快速的方法來確定原來的查詢的哪個行崩潰,以便我可以從該查詢中將值傳遞到該函數並重建函數查詢與這些值來獲取它的值結果並查看哪些兩行或更多行被返回。

任何想法?我希望能有辦法強制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 
+1

和代碼是? – igr

+0

這不是你要求的,但SELECT DISTINCT解決了你提到的問題。沒有看到你的功能是什麼樣子,很難說我們如何能夠幫助你。 –

+0

是否有一個原因,您不希望將錯誤日誌記錄添加到該函數中,以便在遇到錯誤時記錄它所調用的特定參數。此外,請注意,由於SQL是基於集合的,因此Oracle對由WHERE子句謂詞稍後過濾的行執行函數是完全合法的。因此,您不一定只需查看最終由查詢返回的行。 –

回答

0

我認爲這樣做是低谷異常的最好方法。

你需要做的是添加代碼來處理多行例外的功能:

EXCEPTION 
    WHEN TOO_MANY_ROWS THEN 
     INSERT INTO ERR_TABLE 
     SELECT your_columns 
     FROM query_that_sometimes_returns_multiple_rows 

在這個例子中翻了一番結果會去分開的表,或者你可以決定簡單地打印出與DBMS_OUTPUT。

一個簡單的頁面可以是this,然後只是谷歌例外,你應該能夠找到你所需要的。

希望這可以幫助。

+0

或者,只需將參數和其他所需的任何內容轉儲到DBMS_OUTPUT。是的,通過DBMS_OUTPUT.PUT_LINE *進行調試僅僅是70年代,但有時最簡單的解決方案是最快的解決方案。因人而異。 –