いつもお世話になります。
オラクル初心者です。
宜しくお願い致します。
下記の様な、for~loopで、
tmpM商品単価(主キーなし)と言う一時表テーブルから
M商品単価(主キーは「品番」)へインサートをする際、
tmpM商品単価には、「品番」フィールドにダブった品番
がある為、単価実行日を降順に並べ替え古い行は、
where not exists(~)で、インサートされない様に考えました。
しかし、下記構文では、コミットされる前だからなのか、
ダブった品番の行もインサートされようとされ、エラー
となってしまいます。
どなたかご親切な方、ご教授下さいます様、
宜しくお願い致します。
記
create or replace
procedure dbInsSyouhinmaster
(
out_val out pls_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;
こんな感じでどうですか?
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;
>すみません一つお教え頂きたいのですが、
>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;
お礼
有難うございます。 こんなに早くご回答頂けると思いませんでした。 大変参考になります。 すみません一つお教え頂きたいのですが、 A.品番 = C.品番 (+)の(+)はどういう意味でしょうか。 宜しくお願い致します。