電子書籍の厳選無料作品が豊富!

いつもお世話になります。
オラクル初心者です。
宜しくお願い致します。

下記の様な、for~loopで、
tmpM商品単価(主キーなし)と言う一時表テーブルから
M商品単価(主キーは「品番」)へインサートをする際、
tmpM商品単価には、「品番」フィールドにダブった品番
がある為、単価実行日を降順に並べ替え古い行は、
where not exists(~)で、インサートされない様に考えました。

しかし、下記構文では、コミットされる前だからなのか、
ダブった品番の行もインサートされようとされ、エラー
となってしまいます。

どなたかご親切な方、ご教授下さいます様、
宜しくお願い致します。

     記

create or replace
procedure dbInsSyouhinmaster
(
out_valoutpls_integer
)
as

cursor c_1 is
select 品番,商品分類,売上単価,単価実行日,登録日時,登録者
from tmpM商品単価 a
where not exists(select * from M商品単価 b where trim(a.品番) = trim(b.品番))
order by 単価実行日 DESC;

begin
out_val:=0;

for r_emp in c_1 loop

if c_1%FOUND then
INSERT INTO M商品単価
(品番,商品分類,売上単価,単価実行日,登録日時,登録者)
VALUES(r_emp.品番,r_emp.商品分類,r_emp.売上単価,r_emp.単価実行日,
r_emp.登録日時,r_emp.登録者)
;
end if;

out_val := out_val + 1;

end loop;
end;

A 回答 (2件)

こんな感じでどうですか?



BEGIN
   INSERT INTO
      M商品単価(品番,商品分類,売上単価,単価実行日,登録日時,登録者)
   SELECT
      A.品番,A.商品分類,A.売上単価,A.単価実行日,A.登録日時,A.登録者
   FROM
      tmpM商品単価 A,
      (SELECT 品番,MAX(単価実行日) AS MAX_単価実行日 FROM tmpM商品単価 GROUP BY 品番) B,
      (SELECT DISTINCT 品番 FROM M商品単価) C
   WHERE
      A.品番 = B.品番 AND
      A.単価実行日 = B.MAX_単価実行日 AND
      A.品番 = C.品番 (+)
      C.品番 IS NULL;


  out_val := SQL%ROWCOUNT;
END;
    • good
    • 0
この回答へのお礼

有難うございます。
こんなに早くご回答頂けると思いませんでした。
大変参考になります。

すみません一つお教え頂きたいのですが、
A.品番 = C.品番 (+)の(+)はどういう意味でしょうか。

宜しくお願い致します。

お礼日時:2011/04/02 20:57

>すみません一つお教え頂きたいのですが、


>A.品番 = C.品番 (+)の(+)はどういう意味でしょうか。
(+)はleft joinの事です

例えば、以下の(1)と(2)のSQL同等です

(1)
SELECT
   TABLEA.*
FROM
   TABLEA,
   TABLEB
WHERE
   TABLEA.CD =TABLEB.CD (+)

(2)
SELECT
   TABLEA.*
FROM
   TABLEA
      LEFT JOIN TABLEB ON
         TABLEA.CD =TABLEB.CD


A.品番 = B.品番 AND
A.単価実行日 = B.MAX_単価実行日 AND
ここで、単価実行日の最大のものに絞込み

A.品番 = C.品番 (+) AND
C.品番 IS NULL;
ここで、既にM商品単価に入っている品番を除外しています。

先ほど書いたものは、 (+)の後にANDが抜けていましたので訂正します。

   INSERT INTO
      M商品単価(品番,商品分類,売上単価,単価実行日,登録日時,登録者)
   SELECT
      A.品番,A.商品分類,A.売上単価,A.単価実行日,A.登録日時,A.登録者
   FROM
      tmpM商品単価 A,
      (SELECT 品番,MAX(単価実行日) AS MAX_単価実行日 FROM tmpM商品単価 GROUP BY 品番) B,
      (SELECT DISTINCT 品番 FROM M商品単価) C
   WHERE
      A.品番 = B.品番 AND
      A.単価実行日 = B.MAX_単価実行日 AND
      A.品番 = C.品番 (+) AND // ←ANDが抜けてた
      C.品番 IS NULL;
    • good
    • 0
この回答へのお礼

大変分かり易いご回答を頂きまして感謝致します。
今後とも宜しくお願い致します。

お礼日時:2011/04/03 11:26

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