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

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

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

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

PL/SQL

PL/SQL (Procedural Language/Structured Query Language) はOracle CorporationによるSQL(非手続き型言語)を手続き型言語に拡張させるために開発されたプログラミング言語です。

SQL

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

Q&A

解決済

1回答

2263閲覧

oracleのプロシージャの配列内の重複した値の削除の仕方

sakaka

総合スコア15

Oracle

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

PL/SQL

PL/SQL (Procedural Language/Structured Query Language) はOracle CorporationによるSQL(非手続き型言語)を手続き型言語に拡張させるために開発されたプログラミング言語です。

SQL

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

0グッド

0クリップ

投稿2022/06/01 14:53

編集2022/06/02 22:12

プロシージャの配列内の重複した値の削除の仕方

いつもお世話になっております。配列について質問です。
プロシージャ内で作成した配列内に重複した値があると仮定します。
そこで配列内にある重複した値を削除したいのですが、削除できないでいます。
また追加で質問ですが、PL/SQLでは変数同士の比較ができないのでしょうか?
ご存じの方がおりましたら、教えていただけないでしょうか。
かれこれ5時間ほど悩んでいます。

内容
質問1配列内にある重複した値を削除
質問2PL/SQLでは変数同士の比較

A,B,Cはカラムは違いますが同じ型です。

SQL

1 2 3CURSOR ASD IS 4 SELECT A,B,C FROM D_TABLE; 5 6BEGIN 7OPEN ASD ; 8 LOOP 9 FETCH ASD INTO CUR; 10 EXIT WHEN ASD %NOTFOUND; 11 12 FOR i IN 1..3 LOOP 13 IF i = 1 THEN 14 Cur_ABC:= CUR.A; 15 END IF; 16 17 IF i = 2 THEN 18 Cur_ABC:= CUR.B; 19 END IF; 20 21 IF i = 3 THEN 22 Cur_ABC:= CUR.C; 23 END IF; 24 25 IF Cur_ABCIS NOT NULL THEN 26 HAIRETU(VNO8):=Cur_ABC; 27 VNO8:=VNO8+1; 28 end if ; 29 END LOOP; 30  END LOOP;  31CLOSE ASD;

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

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

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

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

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

Orlofsky

2022/06/01 17:59

質問に実際のコードを提示しないでアドバイスを求められても? 配列はどうやって値を設定したのでしょうか?SELECT DISTINCT ... で取得した結果を配列にすれば済むことでは? 比較はIFやCASEが使えます。
sakaka

2022/06/01 23:41

修正いたしました。IF,CASEだと値にかかわらず判定が偽になってしまいます。
sakaka

2022/06/02 00:24

KOZ6.0さん NESTED TABLEの際の削除方法が調べても、分からないので教えてもらえませんでょうか?
KOZ6.0

2022/06/02 00:35

>IF,CASEだと値にかかわらず判定が偽になってしまいます。 提示されたコードのどこでその現象が起きるのでしょうか? たしかに IF で変数と変数を比較して、どちらかが NULL なら、どのような比較をしても偽になりますが・・・ >NESTED TABLEの際の削除方法が調べても、分からないので教えてもらえませんでょうか? 提示したURLにコード例が載ってるんですが・・・
Orlofsky

2022/06/02 02:50

CREATE TABLE D_TABLEがないし、 DECLARE がないし、 CUR, Cur_ABCの定義もない。 END LOOP;が1つしかない。 CLOSE ASD; もない。 PL/SQLの最後に記述されるはずの END; / もない。 エラーメッセージは表示された内容をそのまま質問に載せてください。
guest

回答1

0

ベストアンサー

SQL

1DECLARE 2TYPE EXISTS_TYPE IS TABLE OF BOOLEAN INDEX BY D_TABLE.A%TYPE; 3EXISTS_TBL EXISTS_TYPE; 4TYPE HAIRETU_TYPE IS TABLE OF D_TABLE.A%TYPE INDEX BY BINARY_INTEGER; 5HAIRETU HAIRETU_TYPE; 6PROCEDURE MAIN_LOOP(ITEM D_TABLE.A%TYPE) 7IS 8BEGIN 9 IF ITEM IS NOT NULL THEN 10 IF NOT EXISTS_TBL.EXISTS(ITEM) THEN 11 EXISTS_TBL(ITEM) := TRUE; 12 HAIRETU(HAIRETU.COUNT + 1) := ITEM; 13 END IF; 14 END IF; 15END; 16BEGIN 17 FOR R IN (SELECT A, B, C FROM D_TABLE) 18 LOOP 19 MAIN_LOOP(R.A); 20 MAIN_LOOP(R.B); 21 MAIN_LOOP(R.C); 22 END LOOP; 23 FOR i IN 1..HAIRETU.COUNT 24 LOOP 25 DBMS_OUTPUT.PUT_LINE(HAIRETU(i)); 26 END LOOP; 27END;

格納してから削除ではなく、存在していなかったら追加という風にしてみました。

投稿2022/06/02 01:15

編集2022/06/02 07:26
KOZ6.0

総合スコア2622

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

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

sakaka

2022/06/02 02:34 編集

回答ありがとうございます。 説明不足ですいません。A,B,Cがnullでないと仮定して、配列にはA→B→Cと挿入していきたいです。 そのため、uinonだとその順番になりませんでした。 EX) ×A→A→A→B→B→B→C→C→C  〇A→B→C→A→B→C→A→B→C
KOZ6.0

2022/06/02 02:56

重複を除くのでは?
sakaka

2022/06/02 03:18

はい、のぞきます。カラム名で表記いたしました。
KOZ6.0

2022/06/02 03:35

A→B→B→C なんてことにもなりますね。 重複を除いた時点で順序に意味がなくなります。
sakaka

2022/06/02 04:25

説明不足ですいません。A→B→B→Cの順番で大丈夫です。同じ行のA→B→C順番に値をとってきて、次の行に行き、最後に重複した値を削除したいです。
KOZ6.0

2022/06/02 08:13 編集

後から削除だと面倒です(要素数が変わるので)。先に重複していないかチェックするようにしたほうが良いと思います。
sakaka

2022/06/02 13:12

ありがとうございます!!できました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問