• ベストアンサー

カーソル0件の時にエラーを発生させる

以下の処理をしようと考えています。 Aテーブルをカーソルで検索     →0件だった場合にはエラー ・・・ (1)     →データが入っていた場合には処理     →カーソルのデータがなくなったら処理を正常終了 カーソルに入っているデータが0件だった場合、Oracle上ではエラーとはみなされず、処理が正常終了してしまいます。 カーソルデータが0件だった場合にエラーを発生させるにはどのようにコーディングすればよいですか?

  • Oracle
  • 回答数2
  • ありがとう数2

質問者が選んだベストアンサー

  • ベストアンサー
  • yamada_g
  • ベストアンサー率68% (258/374)
回答No.2

最初のFETCHをループの外ですればいいのでは。 open cur1; fetch cur1 into rec1; if cur1%notfound then close cur1; raise NO_DATA_FOUND; end if; loop --処理 fetch cur1 into rec1; exit when cur1%notfound; end loop; close cur1;

m0123456789
質問者

お礼

なるほど!有難うございました。 解決です!!

その他の回答 (1)

  • muyoshid
  • ベストアンサー率72% (230/318)
回答No.1

こんにちわ。 PL/SQL ならFetch 直後に curs%NOTFOUND で判断可能です。 Pro*C なら、sqlca.sqlerrd[2] に処理件数が入りますので、この値が0か どうかで判断できます。

m0123456789
質問者

補足

loop fetch cv into jcrec; exit when curs%notfound;  処理 end loop; close cv; 回答ありがとうございます。 「curs%notfound」とは上記のような使い方を指しているのでしょうか? もしそうであるならば、カーソルで複数行データを取得し、カーソルにデータがなくなったらループをぬける(正常処理)という動きになると思います。 カーソルが0件の場合にも同じように正常処理でぬけてしまって、エラーにならないと思うのですが、間違っていますでしょうか?

関連するQ&A

  • カーソルエラー

    カーソルエラーについて質問です。 phpからpearを使ってoracleへ接続しています。 バッチ処理で大量にSQL文(SELECT,INSERT,UPDATE)を発行したいのですが、カーソルエラーになってしまいます。 途中の処理でエラーになった場合はロールバックしたい為最後までコミットできません。また、なるべく少ないSQL発行で済むようにプログラムを組み替え済みです。 で、少々手詰まりといった状況なのですが、コミットする以外でカーソルエラーを回避する方法はあるでしょうか? DB設計から見直さないとだめですかね…。

    • 締切済み
    • PHP
  • レコードセット抽出後、エラーが出てカーソルの移動ができません。

    SQLServer2000を利用して、ASPで開発を行なっています。 2つのテーブルA,Bがあり、Aに対するクエリをサブクエリとした、Bへのクエリを実行した結果をレコードセットとして取得し、カーソルの移動を行なおうとしたところ、 「カーソルが宣言された後にテーブル スキーマが変更されたので、カーソル操作を完了できませんでした。」とのエラーが表示され、カーソルの移動が行なえない状態となっています。 このエラーは、サブクエリの結果によって、出る、出ないがあるのですが、データ的には、出るデータと出ないデータの差異はほとんどありません。 (中に入っているデータは若干異なっていますが、型としては全く同じです。) また、検証用に設置した別の表領域で処理を行なったところ、一切エラーは表示されていません。 そもそも、このエラーはどのような原因で発生し、どういった方法で解決することができるのでしょうか。 よろしくお願いいたします。 なお、下に、その際に使用したクエリの概要を記します。 select fldB1, fldB2, case when (select fldA1 from TBL_A where fldA2 = ***) then 1 else '' end as fldAB1 from TBL_B where fldB3 = ****

  • (レンタルサーバ)大量データで500エラー

    初めて投稿させていただきます。 現在、勉強もかねてロリポップというレンタルサーバーで PHPのプログラムを作成しております。 プログラムの概要は、以下の通りです。 1)CSVファイルを[テーブルA(MySQL)]へinsert。 2)[テーブルA(MySQL)]から対象レコードをselectし、 処理1を実行した結果を[テーブルB]へinsert。 3)[テーブルA]と[テーブルB]と結合したテーブルから対象レコードをselectし、処理2を実行した結果を[テーブルC]へinsert。 上記プログラムを実行する際に、以下の事象が発生し、困っております。 ・CSVファイルの内容が300行だと正常に処理が終了する。 ・CSVファイルの内容が400行だと、「500 internal server error」が発生する。 実行環境は以下の通りです。 ・ロリポップサーバーのロリポプラン (ディスク容量:50GB) 「500 internal server error」について検索すると「パーミッションの設定」が関係するようなので 推奨値である「600」やデフォルトである「644」の両方で実行いたしましたが どちらも同じ結果でした。 また、try~catchで各処理をかこっていますが、PHPのエラーは出ていません。 CSVファイルの行数を300から400に増やすと起こるので データ量が関係するのではないか、と考えております。 プログラムのエラー(不具合)か、否かを確認する方法はありますでしょうか? また、データ量が問題の場合、どのような回避策がありますでしょうか? CSVファイルを300行までしか読み込まないような制約を付けることも考えましたが プログラム的に可能なロジックがあれば、ご教示いただきたく思います。 ロリポップサーバのプランを上げることも考えましたが それでも、ファイルの読み込みには上限があるでのはないかと考えております。 何卒、よろしくお願いいたします。

    • ベストアンサー
    • PHP
  • DTSのデータ変換タスクで入力にゼロ件のファイルを指定するとエラーになる

    SQLserver2000のDTS実行結果を、VB6.0で作成したアプリで 「sp_help_job」を使用して取得し、画面表示しています。 DTSのデータ変換タスクで、csvデータをテーブルに ロードしているのですが、csvデータがゼロ件だと DTSが異常終了となってしまいます。 業務の都合上、あるタイミングではcsvデータが ゼロ件になることがあり、この場合は正常終了としたいのですが、 例えば最後のタスクまで到達した場合は、 途中のタスクに異常があってもDTSの処理結果を 正常終了とするようなことは出来ないでしょうか?

  • カーソル処理とファンクションとインデックスの件

    はじめまして。 環境 WinXP(Pro)/Oracle9i まず、やりたいことは和暦の年号と日付で別々になっているフィールドをファンクションで西暦に直し、その対象とする西暦をカーソル処理で1行つかって抽出したいのです。 具体的には以下の例ですが ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^(ファンクション FUNCTION FNCWSDATECNV(STRGEN IN VARCHAR2) RETURN DATE IS (一部省略しますが、A.WGENを和暦のアルファベット記記号に変換編集する[M/T/S/H]。    そして、文字列形式に連結してS10/12/10として西暦に変換して戻り値にセット ([S10/12/31 -> 1935/12/31]となる。) --------------------------------(カーソル処理定義 DECLARE SELYMD DATE; CURSOR CRSL1 IS SELECT A.SELID,A.SELNAME FROM KOJIN A WHERE FNCWSDATECNV(A.WGEN, A.WDATE) < SELYMD; ---------------------------------(実行 BEGIN SELYMD := GET_SELYMD; -- パラメータから得られた変数 OPEN CRSL1; FETCH CRSL1 INTO VAL_SID, VAL_SNAME; LOOP EXIT CRSL1%NOT FOUND; (省略) END LOOP; END; --------------------- 初回のときは、データは50件ならばうまく抽出できましたが、20万件あるとFETCHしたときには時間がかかると思うので、 CREATE INDEX KOJIN_IDX ON KOJIN(SELID); としておくことで通常SELECTすると早くなりましたが、 上記の定義したカーソルにはファンクションが効かず、0件として終わってしまいます。 また、カーソル1行ずつ読み込むのは別テーブルへ追加する際、必要なデータを対象とする別表に参照するためです。 カーソル上でTO_CHAR(DECODE(A.WGEN,0,'M',・・・),'JAPANESE・・・ というような形式にしてもうまくいきませんでした。(カレンダによるエラー) どうしたらよいのでしょうか?よろしくお願いします。

  • 最大オープン・カーソル数のエラー

    javaサーブレットと、Oracle8iを使って、 C/S系のシステム開発をしています。 Javaサーブレットで、JDBCを使用してOracleへ接続しているのですが、 時々、以下のような、エラーが発生します。 Java.sql.SQLException: ORA-01000: 最大オープン・カーソル数を超えました。 原因は、何でしょうか? 最大オープン・カーソル数の個数を調べるには、どこを見ればいいのでしょうか? 是非ご教授下さい。

    • ベストアンサー
    • Java
  • カーソル処理って?

    最近オラクルの勉強をはじめたのですが、 本当に初心者なので、何がなにやらさっぱりわからないことだらけです。 それでも、だいたいのものはネット検索や辞書で調べたりしてわかったのですが、 ”カーソル処理”で躓いてしまいました。 どういうもので、どんな働きをするものなのか、 どういうメリットをもっているのかなど教えてください。 よろしくお願いします。

  • カーソルでのデータ取得

    いつもお世話になっております。 カーソルをオープンしたあとに(閉じる前に)、 カーソルのデータ取得元テーブルのデータが変化しても問題ありませんよね? ロジック的には。。。 OPEN カーソル カーソルデータ取得元テーブルのトランケート カーソルデータを1件ずつ編集し、データ取得元テーブルにINSERT CLOSE カーソル って感じなんですが。 キー重複などの関係で、一度テーブルを初期化した後に、もともとそのテーブルから取得したデータを編集し、INSERTしたいんです。 カーソルはOPENした時点の値を持ち続けるんですよね? 質問がわかりにくくてすみません

  • エラー処理の方法と書き方

    csvファイルのデータをOracle 9i Databaseに格納する次のようなプログラムを作成しました。 開始 | ファイルのOPEN | DBへの接続 | 文字列から空白値の削除 | 繰り返しループ UNTIL:EOF | csvファイル中の顧客 コードがOracleテーブル 内に存在するか Yes----update No--------insert | 繰り返しループ終了 | ファイルのCLOSE | 終了 一応プログラムは正常に動作しているのを確認しました。あとはエラー処理を書いて完了だと考えています。プログラムを書いたのが初めてだったので、普通のエラー処理がどんなもんなのかちょっと想像がつかない状態です。 1.このプログラムにできるだけたくさんのケースを考えてエラー処理を書き込みたいのですが、どのようなエラーが考えられるでしょうか。 一応自分的に考えて見たのが、 (1)「開始」の前にcsvファイルがなかった場合 (2)「DB接続」の前にDB接続ができなかった場合 (3)「繰り返しループ」の前にファイルの中身が空だった場合 (4)「insert」「update」の後にSQL文の発行が全て正常に完了しなかった場合 普通はこれがいるとか、こんなのいらないとかありましたら教えてください。 2.エラーが発生した場合は、運用者にそれを伝えるために普通はコンソール上に表示させるのですか?もしそうだとしたらどのような形でそれを実現するのですか? MsgBox?メール?他には? よろしくお願いします。

  • カーソルがコミットするとクローズされてしまう。

    オラクルのDBで環境はUNIX(IBMのマシン)です。 DBについて詳しくありませんが、以下のようなことを行いたいと考えています。 1.あるDB(DB-A)のレコードを特定のキーの昇順に全レコード読み込む。(特定のキーは、例えば商品コードなど) 2.1レコードを読み込む毎に、他のDB(DB-B)を読み込んだレコードを元に、更新したい。 その際、1レコードを読み込む都度、 2-1.トランザクションの開始 2-2.DB-Bの更新 2-3.コミット又はロールバック のようにしたい。 上記のことを考えて以下のような作りにしました。 1.カーソルのオープン 2.以下のループを作成  2-1.DB-Aから1レコードのフェッチ  2-2.トランザクションの開始  2-3.DB-Bの更新  2-4.コミット(ロールバック) しかしながら、コミット(又はロールバック)を行うことにより、カーソルがクローズされてしまい、最初の位置にカーソルが戻ってしまいます。(私がコーディングして試験したわけではありません。このような報告をうけました) それで、カーソルが戻らずに、全レコードを処理するようにしたいのですが、どのようにしたら良いのでしょうか。ご存じの方おりましたらアドバイスをお願いします。