pl/sqlでのパッケージ内のプロシージャ内での例外について

このQ&Aのポイント
  • 例外検出について質問です。pl/sqlでのパッケージ内のプロシージャ内で、特定のデータが存在しない場合にエラー文を表示したいです。
  • 具体的には、注文表に指定した年度のデータが存在しない場合に「データが存在しません。」というエラー文を表示したいです。
  • これを実現するために、プロシージャ内で指定した年度のデータの存在を確認し、存在しない場合にユーザ定義例外を発生させる方法を考えています。他に何かいい案があれば教えてください。
回答を見る
  • ベストアンサー

例外検出

pl/sqlでのパッケージ内のプロシージャ内での例外について質問です。 元となる表、注文表(主キー→年度、注文番号との複合主キー)があります。例えばここに、2008年代のデータしかはいっていないとします。 プロシージャにパラメータ2007を入れて呼び出すと、注文表には2007年代のデータはないのでエラー文”データが存在しません。"と表示したいんです。プロシージャ内に BEGIN SELECT COUNT(*) INTO COUNTER FROM 注文表 WHERE 年度=パラメータ(ここでは2007) IF COUNTER=0 THEN RAISE ユーザ定義例外; これで実現できますか??他に何かいい案があれば教えてください

  • Oracle
  • 回答数1
  • ありがとう数0

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

  • ベストアンサー
回答No.1

プロシジャの挙動として、想定されるエラーの場合に、例外を返すというところは、議論がありそうですが、 データが存在しないチェックの仕方としては、select count(*)で良いと思います。(判りやすいから) ただ、データが存在する場合の処理が、その後に続くなら、データが存在する場合の処理と存在しない場合の処理を 一度の問い合わせで処理可能なので、事前に存在チェックだけを行わずに処理する方が合理的な方法だと思います。 実際どちらが良いかは、ケースバイケースだと思いますよ。

関連するQ&A

  • PL/SQLの例外

    PL/SQLの例外処理で、 プロシージャからファンクションをコールしてデータを取得しています。 ファンクションでデータを取得できたのか、NO_DATA_FOUNDだったのか、WHEN OTHERS THENブロックに入ったのか、呼び出し元に通知したいのです。 ・データが取得できた場合、RETURN TRUE ・NO_DATA_FOUND、またはWHEN OTHERS THENブロックに入ってきた場合にRETURN FALSE とすると、呼び出し元のプロシージャで区別が付かないのです。 ファンクションでWHEN OTHERS THENブロックに入った場合、プロシージャのWHEN OTHERS THENブロックに飛ばしたいと思います。 この場合の方法ですが、ファンクションのWHEN OTHERS THENでRAISE 独自例外Aとし、プロシージャのEXCEPTIONでWHEN 独自例外A THENとすると、 プロシージャのファンクション呼び出し以降の処理は行なわれず、処理は終了しますか? この方法ができるかどうかと、他に方法があれば教えてください。

  • ストアドプロシージャでのパラメータのデータ型の質問

    いつもお世話になっております。たびたびの質問で恐縮です。 ストアドプロシージャでのパラメータのデータ型が設定できず困っております。たとえば次はパラメータの文字を表示させるものです。 CREATE OR REPLACE PROCEDURE test(p VARCHAR2(10)) IS t VARCHAR2(10); BEGIN t:=p; DBMS_OUTPUT.PUT_LINE(t); END; / コンパイルエラーになるので、パラメータのデータ型を、VARCHAR2のように(10)を取るとうまくいきます。しかし、変数定義の「t VARCHAR2(10)」の(10)を取ると文字列の制約制限からはずれるとのエラーになります。 VARCHAR2というのは、PL/SQLの変数あるいはパラメータではどのように記述すればよろしいのでしょうか。 基本的なことを理解しておらず、申し訳ありません。 どうか、よろしくお願いいたします。

  • PL/SQLの例外処理で出力しないようにしたい

    いつもお世話になっております。 PL/SQLの例外処理で分からないところがあるのですが どなたかお分かりになる方がいましたら、 教えていただけないでしょうか?? コーディングの悩んでる部分だけしか貼れないのですが↓↓ BEGIN FOR c_rec IN c_cur LOOP /*事業者テーブルからデータを探す*/ BEGIN SELECT cust_id, unit_sec INTO v_cust_id, v_unit_sec FROM m_cust WHERE op = c_rec.call AND vc = c_rec.isdn; EXCEPTION WHEN TOO_MANY_ROWS THEN v_err_msg := '該当業者が複数見つかりました'; WHEN NO_DATA_FOUND THEN       ★★ END; ★★のところで、何も見つからないエラーの場合、 何も文字を出力しないで、カーソルFOR LOOPの 次のレコードに行ってほしいのです。 何かしらエラー処理をしないと、プロシージャが正常に 完了してくれないので今はエラー番号を表示させているのですが ここに何を記入すればよいでしょうか?? よろしくお願いいたします。

  • ストアドプロシージャについて

    お世話になります。 SQLServseのストアドプロシージャで、あるテーブルのテストデータを100件ほど作成したいと思っています。 しかし、プロシージャを実行すると「プライマリキーが重複しています」とエラーが出ます。 テーブル内にはすでにCODE='0001'と'0101'の2件が存在します。そのため挿入開始コードは'0002'としたのですが・・・。まだ同じエラーが発生します。 テーブル名:MST_USER  CODE char(4) ←キー  KBN  char(2)  NAME varchar(40)  PASS varchar(10) 作成したプロシージャ CREATE PROCEDURE dbo.test_update_USER AS declare @count int declare @kbn int set @count = 2 set @kbn = 0 while 1 = 1 begin update MST_USER set CODE = right('0000' + ltrim(str@count)), 4), KBN = right('00' + ltrim(str(@kbn)), 2), NAME = 'test' + ltrim(str(@count)), PASS = 'test' + ltrim(str(@count)) set @count = @count + 1 if (@count > 100) break if (@kbn > 3) set @kbn = 0 else set @kbn = @kbn + 1 end GO 何か間違えているのか自分ではわからなくなっている状態です。 どなたかご指摘いただけると幸いです。

  • ストアドでのwhile文の利用法

    SQLServerでのストアドについてはこちらでうかがってもよろしいのでしょうか? ストアド内にてwhileでのループ文作成についてなんですが、 以下のようなストアドでSELECT内でA.NO1....とあるとおもうのですが、 これを@numRankの数だけ、A.NO(フィールド)を増やしたいのですが、 ここからどのようにつくればよろしいのでしょうか? CREATE PROCEDURE usp_Enquete @ask_idvarchar(10) AS DECLARE @strvarchar(1000) DECLARE @numRankint DECLARE @Counterint BEGIN SELECT @numRank = count(*) FROM B_Answer WHERE ask_id = @ask_id END SET NOCOUNT ON SET @Counter = 1 WHILE @Counter <= @numRank BEGIN SET @str = ' SELECT count(ansList.NO1) AS NumAns, A.NO1, A.NO2, A.NO3 FROM ・ ・ ・

  • SQL文でどこが悪いのか教えて下さい

    初心者ですが教えて下さい。 表Aと表Bで表Aに含まれていないものを表Cに入れたいのですが、下記のやり方では表Aのものしか入れることができません。 どこが悪いのか教えて下さい。 ・コードは複雑なため、簡略化しています。UNIONは使わない方向で。 CREATE OR REPLACE PROCEDURE SAMPLE IS CURSOR SELLINE1 IS SELECT * FROM A ORDER BY KEY1,KEY2; CURSOR SELLINE2 IS SELECT * FROM B ORDER BY KEY1,KEY2; CNT1 NUMBER; CNT2 NUMBER; BEGIN SELECT COUNT(*) INTO CNT1 FROM C; IF CNT1 = 0 THEN FOR SELREC IN SELLINE1 LOOP INSERT INTO C VALUES (KEY1,KEY2,値);COMMIT; END LOOP; FOR SELREC IN SELLINE2 LOOP SELECT COUNT(*) INTO CNT2 FROM C WHERE (KEY1 = SELREC.KEY1) AND (KEY2 = SELREC.KEY2); IF CHK_CNT2 = 0 THEN INSERT INTO C VALUES (KEY1,KEY2,値);COMMIT; END IF; END LOOP; END IF; END; /

  • 【初歩的な質問ですが・・・】 SQL文書き方がわかりません

    SQLの知識に乏しい者です。 よろしくお願い致します。 ●テーブルA ・会計コード ・年度 ・部署番号 ・社員番号 ・その他幾つかのデータ ※Where句で「年度>2002年」以降を抽出 のテーブルがあります。 この時、Bテーブルで ●テーブルB ・会計コード(主キー) ・年度 ・部署番号(主キー) ・社員番号(主キー) ・その他幾つかのデータ ※Aテーブルで抽出されたデータの中から絞り込む というテーブルを抽出するSQL文を組みたいのですが、効率の良いやり方がわかりません。 副問合せで  Select [B表で抽出した列名…]  From B表  Where 会計コード = (Select 会計コード               From A表               Where 年度 > '2002')  AND 部署番号 = (Select 部署番号             From A表               Where 年度 > '2002') ・・・・以下省略 の様に書くと効率が悪い気がしました。 (実際には、副問合せが6個書くことになるため) 良い書き方を知っている方がいらっしゃいましたら、よろしくお願い致します。

  • 別のテーブルの値でUPDATEしたいのですが

    Oracle8iデータベースのSQL文で困っています。 以下のような2つの表があります。 ※表の構成は似ていますが、同じではありません。 [表A]  列1 ・・・ 主キー  列2 ・・・ 主キー  列3  列4 [表B]  列1 ・・・ 主キー  列2 ・・・ 主キー  列3  列4 表Aと表Bの主キーが一致するデータについて、 表Aを表Bの値でUPDATEしたいのですが、 どのように記述すればよいでしょうか? よろしくお願いします。

  • EXCELで出来るでしょうか?

    はじめまして。EXCELについて教えて下さい。 例えば  No 顧客 注文No 種類  1    A    1    ○  2    C    5    ○  3    B    3    ○  4    A    1    □  5    B    4    ○  6    C    5    ○  7    B    3    △  8    B    4    □  9    C    6    △ といった表で、顧客をキーに【顧客Aの注文No1の○の個数は?】 といったCOUNTが出来るでしょうか?顧客は事前には分かりません。 最終的には下の様な表になればと考えています。  A  ○  △  □  計  1   1         1  2   1         1  B  ○  △  □  計  3   1   1      2  4   1      1   2  C  ○  △  □  計  5   2         2  6       1     1 データは2000件程度です。 よろしくお願いします。    

  • VB6でのPL/SQLの実行について

    現在VB6(SP6)でORACLEのデータベースに接続後、プロシージャを実行してOUTのパラメータを取得したいと思ってプログラムを作っております。 ORACLEへの接続はいろいろ調べてできたのですが、プロシージャの実行(呼び出し)のしかたがわからず困っております。 PL/SQL(プロシージャ名"TEST_DATA") out1 = TEST(OUTパラメータ1) out2 = これはテストです。(OUTパラメータ2) VB6(SP6) Dim OraSession As OraSession Dim OraDatabase As OraDatabase Dim OraDynaset As OraDynaset Dim P1 AS String Dim P2AS String '接続処理 Set OraSession = CreateObject("OracleInProcServer.XOraSession") Set OraDatabase = OraSession.OpenDatabase("TEST", "TEST/TEST DB_DEFAULT) OraSession.BeginTrans 'ここでPL/SQLを実行して、パラーメタを取得したいです。 '取得したパラメータをセット P1 = パラメータ1(TEST) P2 = パラメータ1(これはテストです。) OraSession.CommitTrans '結果表示 Call MsgBox(P1 & "結果" & P2) ご教授のほどをお願いいたします。