質問: Oracle 11gにて,あるデータの登録をSPを用いて行いたいと考えています. その際に登録するデータに重複が無いかを調べ,重複があれば その時点でSPを終了させる動作を行いたいのですが,その方法がわかりません. 下記のようなSQLを書いていますが,重複チェックの部分でエラーが出てしまいます. 実施したい内容としては次の通りです. 1. SPが呼びだされた際に引数としてi_no1~i_no5に0~9999のいずれかの値が渡される 2. i_no1~5を配列に格納し,'0'が入っている行は無視し,'1'以上の値が 入っている行を対象に重複しているかをチェックする 3. 重複している場合にはユーザー定義例外(user_define_err)にてSPを終了させる 重複が検出されなかった場合には処理を継続させる ``` CREATE OR REPLACE PROCEDURE ** ( i_no1 IN VARCHAR2, i_no2 IN VARCHAR2, i_no3 IN VARCHAR2, i_no4 IN VARCHAR2, i_no5 IN VARCHAR2, ) IS --引数格納用配列 TYPE w_type_no_array IS TABLE OF VARCHAR2(5); w_no_array w_type_no_array; BEGIN w_no_array(0) := i_no1; w_no_array(1) := i_no2; w_no_array(2) := i_no3; w_no_array(3) := i_no4; w_no_array(4) := i_no5; --重複チェックを行う FOR i IN 0..5 LOOP SELECT COUNT(DISTINCT w_no_array(i)), CASE WHEN COUNT > 1 THEN RAISE user_define_err END FROM ( SELECT * FROM w_no_array WHERE w_no_array <> '0' ) END LOOP; ``` ### エラー内容 Error(237,9): PL/SQL: SQL Statement ignored Error(240,30): PL/SQL: ORA-00905: キーワードがありません。
回答: 自分だったら、ということで。 まず、ストアドのFUNCTION作ります。 ``` CREATE OR REPLACE FUNCTION HOGE ( P1 IN VARCHAR2, P2 IN VARCHAR2, P3 IN VARCHAR2, P4 IN VARCHAR2, P5 IN VARCHAR2) RETURN NUMBER IS BEGIN -- 実際の処理 -- RETURN 0 -> OK -- RETURN 1 -> NG END; / ``` これを使って ``` SELECT HOGE(P1,P2,P3,P4,P5) INTO RES FROM DUAL; IF RES = 0 THEN -- 登録処理実行 ELSE -- エラー処理 END IF; ``` こんな感じで処理を作る感じかなあ。 他の方も書かれているように、本当にこんな書き方で 処理を実装した実績があるのか心配ですな~ あと、なにがしかのプログラムからよばれるものなら、 そのプログラムでやっちゃった方が格段に楽だと思う。