プロが教える店舗&オフィスのセキュリティ対策術

初心者ですが教えて下さい。
表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;
/

A 回答 (2件)

処理が途中ではいるのでPROCEDUREにしていると判断して回答します。


(そうでない場合はNo.1の方の回答で)
1.B表のCURSORをOPEN
2.B表上のA表との重複を比較したい項目でA表を検索
(CURSORを作りCOUNTをとるのが望ましいです
直書きでもいいですが・・・)
3.存在しない場合(COUNTが0の場合)INSERT
存在した場合は処理をしない
この流れではないでしょうか?

ちなみに、MINUSでSELECTを作りINSERTするのも手です。
(項目が同じでない場合手間が増えますが・・・)
    • good
    • 0
この回答へのお礼

ご回答ありがとうございました。
下記の通り、格納データに問題があったようです・・・すみませんでした。
同じ処理をするにしてもいろいろなやり方があるので、持ってる知識でどこまでやれるか悪戦苦闘中です。

お礼日時:2006/01/09 11:00

RDBの理論は数学の「集合」です。


ご所望の動作はとてもシンプルに記述できます。

insert into c select i from b where not exists(select * from a where a.i=b.i)

UNIONは使わないとか条件が付いているところをみると
本当の初心者ではないですよね?(実は職業プログラマ?)
集合演算は教養として身につけるとよいですよ。
    • good
    • 0
この回答へのお礼

ご回答ありがとうございました。
調べてみた結果、表に格納されているデータの方に問題があったみたいです。
他の言語、DBはやった事があるのですが、ORACLEはまったく初めてで・・・結果的に単純な事ですみませんでした。
集合演算の知識もなかったので、これから勉強したいと思います。

お礼日時:2006/01/09 10:56

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

関連するカテゴリからQ&Aを探す