プロが教える店舗&オフィスのセキュリティ対策術

PL/SQLの質問です。

declare でカーソルを宣言し、その中で集合関数を使用しています。(sum)

CHAR型の項目に対して掛けるので、数値でないものが入っていた場合のために
INVALID ERRORのEXCEPTIONをつけました。

BEGINE

 FOR rec IN cur_test
 LOOP
  ----
 END LOOP;

EXCEPTION
 WHEN INVALID_NUMBER THEN
  ------

END;

しかし、このやりかただと、一部のレコードでエラーがあっても、
全てのレコードがエラーと判断されてしまいます。
カーソルで集合関数エラーが発生したレコードのみEXCEPTIONで扱い、
それ以外のデータはきちんとチェックしたいのですが、
そのような方法はあるでしょうか?

よろしくお願いします。

A 回答 (1件)

こんにちは。



表(TEST)を以下とします。
*************************************
SQL> desc test
名前 型
--------
COL1 CHAR(1)
COL2 CHAR(1)
*************************************
データは、こんなかんじ。
*************************************
SQL> select * FROM TEST ;
COL1 COL2
- -
1 1
1 2
2 3
2 4
3 1
3 a
4 9
*************************************
ここで、COL1で、GROUP BYして、COL2のSUMを取る。
ただし、COL2には、数値以外があり(上の例では「a」)とします。

いきなり、全部をカーソルとすると、カーソルのレコードセットを作る時点でエラーとなるので、
(1)COL1をGROUP BYするカーソルを準備
(2)COL1を読んで、その値で、COL2をSUM
ここで、数値例外が出ても、継続するために、(2)の部分を別ブロックとします。

こんな感じでしょうか。
*********************************************
DECLARE
CURSOR cur_test IS SELECT COL1 FROM TEST GROUP BY col1 ;
v_sum NUMBER;
flg BOOLEAN ;
BEGIN
FOR rec IN cur_test LOOP
flg := TRUE ;
/*****************************************/
BEGIN
SELECT SUM(COL2) INTO v_sum FROM TEST WHERE COL1 = rec.col1 ;
EXCEPTION
WHEN INVALID_NUMBER THEN
flg := FALSE ;
END;
/*********************************************/
IF ( flg ) THEN
dbms_output.put_line('v_sum=' || v_sum);
END IF ;
END LOOP ;
END;
/
*********************************************

直接の回答になってなくて、もうしわけないですが、参考になられましたでしょうか?
    • good
    • 0
この回答へのお礼

それです!
やり方つかめました。ありがとうございました。

お礼日時:2005/02/14 09:10

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!