
PL/SQLの質問です。
declare でカーソルを宣言し、その中で集合関数を使用しています。(sum)
CHAR型の項目に対して掛けるので、数値でないものが入っていた場合のために
INVALID ERRORのEXCEPTIONをつけました。
BEGINE
FOR rec IN cur_test
LOOP
----
END LOOP;
EXCEPTION
WHEN INVALID_NUMBER THEN
------
END;
しかし、このやりかただと、一部のレコードでエラーがあっても、
全てのレコードがエラーと判断されてしまいます。
カーソルで集合関数エラーが発生したレコードのみEXCEPTIONで扱い、
それ以外のデータはきちんとチェックしたいのですが、
そのような方法はあるでしょうか?
よろしくお願いします。
No.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;
/
*********************************************
直接の回答になってなくて、もうしわけないですが、参考になられましたでしょうか?
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
PL/SQLカーソルの2重FORループ...
-
PL/SQLでのSQL文法
-
Texの枠囲み調節
-
Accessのマクロでモジュールを...
-
Statement ignored というエラー
-
Access VBAで行ラベルが定義さ...
-
SQLで部分的にGROUP BYしたいとき
-
キャッシュを使わずにSELECTを...
-
sqlplusでヘッダーが付かない
-
ストアドプロシジャからストア...
-
callで順に実行されるプロシー...
-
日付型カラムへのデータINSERT
-
sqlplusのspoolで空白行出現
-
エクセルVBAでUserFormを起動し...
-
パッケージ内のファンクション...
-
【Excel VBA】 WorksheetやRa...
-
OutlookVBAで作成したマクロに...
-
DB2のSELECTでカンマ編集につい...
-
ODBCリンクの際にACCESSでは読...
-
14桁の日付(YYYYMMDDHHMMSS)を...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
PL/SQLカーソルの2重FORループ...
-
カーソル定義での条件分岐
-
Texの枠囲み調節
-
自動連番でカラムを更新したい
-
ORA-00904:無効な識別子の回避...
-
PL/SQLでのSQL文法
-
PL/SQLにて、マスタから取得し...
-
mysqlのcase文で複数の条件を指...
-
PL/SQLのOPEN cursor_name FOR...
-
PL/SQLでの配列についてetc
-
PL/SQLにてカーソル名を変数に
-
PL/SQLでカーソルを指定する方法
-
T-SQLのカーソルで
-
PL/SQL カーソルのFROM句にカー...
-
[Oracle9i]PL/SQLでFETCHしても...
-
ROW_NUMBER BY PL/SQL
-
T-SQLで
-
PL/SQLプログラムの書き方がわ...
-
PL/SQLのカーソルについて
-
処理の結果レコードがなかった...
おすすめ情報