質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.51%
Oracle

Oracleは、米オラクルが取り扱うリレーショナルデータベース管理システムです。メインフレームからPCまで、多様なプラットフォームに対応しています。

Oracle Database 11g

Oracle DatabaseはRDBMSの商品です。具体的な発売商品として知られているのが、 Oracle9i、Oracle10g、Oracle 11gとOracle 12cです。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

Q&A

4回答

5807閲覧

Oracleでの重複チェック

退会済みユーザー

退会済みユーザー

総合スコア0

Oracle

Oracleは、米オラクルが取り扱うリレーショナルデータベース管理システムです。メインフレームからPCまで、多様なプラットフォームに対応しています。

Oracle Database 11g

Oracle DatabaseはRDBMSの商品です。具体的な発売商品として知られているのが、 Oracle9i、Oracle10g、Oracle 11gとOracle 12cです。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

0グッド

0クリップ

投稿2016/05/13 07:54

編集2022/01/12 10:55

Oracle 11gにて,あるデータの登録をSPを用いて行いたいと考えています.
その際に登録するデータに重複が無いかを調べ,重複があれば
その時点でSPを終了させる動作を行いたいのですが,その方法がわかりません.

下記のようなSQLを書いていますが,重複チェックの部分でエラーが出てしまいます.
実施したい内容としては次の通りです.

  1. SPが呼びだされた際に引数としてi_no1i_no5に09999のいずれかの値が渡される
  2. i_no1~5を配列に格納し,'0'が入っている行は無視し,'1'以上の値が

入っている行を対象に重複しているかをチェックする

  1. 重複している場合にはユーザー定義例外(user_define_err)にてSPを終了させる

重複が検出されなかった場合には処理を継続させる

SQL

1CREATE OR REPLACE PROCEDURE ** 2( 3 i_no1 IN VARCHAR2, 4 i_no2 IN VARCHAR2, 5 i_no3 IN VARCHAR2, 6 i_no4 IN VARCHAR2, 7 i_no5 IN VARCHAR2, 8) 9IS 10--引数格納用配列 11 TYPE w_type_no_array IS TABLE OF VARCHAR2(5); 12 w_no_array w_type_no_array; 13BEGIN 14 w_no_array(0) := i_no1; 15 w_no_array(1) := i_no2; 16 w_no_array(2) := i_no3; 17 w_no_array(3) := i_no4; 18 w_no_array(4) := i_no5; 19 20--重複チェックを行う 21 FOR i IN 0..5 LOOP 22 SELECT COUNT(DISTINCT w_no_array(i)), 23 CASE 24 WHEN COUNT > 1 THEN 25 RAISE user_define_err 26 END 27 FROM ( 28 SELECT * 29 FROM w_no_array 30 WHERE w_no_array <> '0' 31 ) 32 END LOOP;

エラー内容

Error(237,9): PL/SQL: SQL Statement ignored
Error(240,30): PL/SQL: ORA-00905: キーワードがありません。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

takyafumin

2016/05/13 08:08

> 下記のようなSQLを書いていますが,重複チェックの部分でエラーが出てしまいます. どのようなエラーが発生しているのか、エラーメッセージ等を具体的に記載できますか?
guest

回答4

0

自分だったら、ということで。
まず、ストアドのFUNCTION作ります。

SQL

1CREATE OR REPLACE FUNCTION HOGE ( 2 P1 IN VARCHAR2, 3 P2 IN VARCHAR2, 4 P3 IN VARCHAR2, 5 P4 IN VARCHAR2, 6 P5 IN VARCHAR2) RETURN NUMBER IS 7BEGIN 8 -- 実際の処理 9 -- RETURN 0 -> OK 10 -- RETURN 1 -> NG 11END; 12/

これを使って

SQL

1 SELECT HOGE(P1,P2,P3,P4,P5) INTO RES FROM DUAL; 2 IF RES = 0 THEN 3 -- 登録処理実行 4 ELSE 5 -- エラー処理 6 END IF;

こんな感じで処理を作る感じかなあ。
他の方も書かれているように、本当にこんな書き方で
処理を実装した実績があるのか心配ですな~
あと、なにがしかのプログラムからよばれるものなら、
そのプログラムでやっちゃった方が格段に楽だと思う。

投稿2016/05/13 10:28

takasima20

総合スコア7458

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

何かいろいろとごっちゃになってる気がします。

TYPE w_type_no_array IS TABLE OF VARCHAR2(5);
w_no_array w_type_no_array;

定義したこれはネステッド・テーブルな訳ですが、要するに一次元配列です。
このまま「SELECT」しても無理かと。

RAISE user_define_err

例外の呼び出しはPL/SQL内で行うもので、SQL文の途中ではできません。

まずは、この辺りを参考にしてみてはいかがでしょうか?
PL/SQLの配列=コレクション型
コレクション変数について
PL/SQL入門
PL/SQLを使ってみよう

投稿2016/05/13 09:19

Tommy.103

総合スコア94

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

手元にoracle環境がすぐには作れないので、気づいた点をいくつか。

  • ストアドプロシージャ内では、select文はそのまま使えません。必要であればselect intoを使いましょう。
  • PL/SQL表に対してselect文って利用できるんでしたっけ?(私が無知なだけかもしれません)
  • そもそもselect文ではなく、配列を使った重複の検出ではだめでしょうか?

投稿2016/05/13 08:42

takyafumin

総合スコア2335

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

TYPE w_type_no_array IS TABLE OF VARCHAR2(4);

「TYPE w_type_no_array IS TABLE OF VARCHAR2(5);」ではなくて?

FOR i IN 0..5 LOOP

「w_no_array(4) := i_no5;」が最後なのでi=5の時におかしくなりません?

投稿2016/05/13 08:15

tkturbo

総合スコア5572

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2016/05/13 08:21

ご指摘ありがとうございます. 実際のコードは引数がもっと有り,貼り付けているコードはVARCHAR(5)の間違いです.
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.51%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問