0

ストアド プロシージャに問題があります。以下の場合は失敗します

cntmismatch NUMBER;

SELECT COUNT(keyvalue) INTO cntmismatch 
FROM tbl_temp GROUP BY keyvalue HAVING count(keyvalue) > 1

上記基準のデータがない場合は不合格

私も使ってみました

SELECT NVL(COUNT(keyvalue),0) INTO cntmismatch 
FROM tbl_temp GROUP BY keyvalue HAVING count(keyvalue) > 1

しかし、それでもここで null が返され、proc は失敗します

4

4 に答える 4

1

keyvalue複数回発生するの値の数を数えたい場合は、サブ選択を使用する必要があります。

SELECT COUNT(*) INTO cntmismatch 
FROM
( SELECT keyvalue, count(*) FROM tbl_temp GROUP BY keyvalue HAVING count(*) > 1)
于 2013-07-12T10:37:15.823 に答える
0

コードで例外をキャッチして処理するだけです。あなたの場合、 NO_DATA_FOUND 例外が発生します。

以下に例を示します。

PROCEDURE count_mismatch AS
  cntmismatch NUMBER;
BEGIN
  BEGIN
    SELECT COUNT(keyvalue) INTO cntmismatch FROM tbl_temp GROUP BY keyvalue;
  EXCEPTION
  WHEN no_data_found THEN
    cntmismatch := -1;
  END;
END 

HAVING 句はもう必要ないと思います。したがって、私はそれを削除しました。ステートメントが予想される 1 行より多くを返す場合は、TOO_MANY_ROWS 例外も処理する必要があります。

于 2013-07-12T10:39:11.217 に答える