-1

selectステートメントでカスタムビルド関数を使用して値の1つを返すクエリがあります。

私が抱えている問題は、この関数が複数の行の情報を返すため、時々エラーになることです。SQL エラー: ORA-01422: 正確なフェッチが、要求された行数を超えて返されます

問題をさらに複雑にするために、このクエリを実行する必要がある範囲内のテーブル データをチェックしましたが、この関数の where 句に基づいて重複する行を見つけることができません。

したがって、元のクエリのどの行でこれがクラッシュするかを簡単に特定して、そのクエリから関数に渡される値を取得し、これらの値を使用して関数クエリを再構築して結果を取得し、どれを確認できるかを簡単に確認したいと思います。 2 つ以上の行が返されます。

何か案は?最初のエラーまでの結果を確認できるように、エラーが発生するまでOracleに一度に1行ずつ処理させる方法があることを望んでいました。

コードを追加しました:

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 

この例では、2 倍の結果が別のテーブルに送られます。または、dbms_output で単純に出力することもできます。

開始する簡単なページはthisで、次に google exception だけで、必要なものをすべて見つけることができるはずです。

これが役立つことを願っています。

于 2013-10-18T16:54:44.457 に答える