dポイントプレゼントキャンペーン実施中!

いつもお世話になっております。
Oracle11gとC#.NETで開発している初心者です。

ストアドプロシージャによるテーブルからテーブルへの
インサートがうまくいかず悪戦苦闘しております。
下記の様な記述をしており、コンパイルは通ったのですが、
D売上見通台帳のIDをプライマリーキーにしており、
実際.NETで動かしてみると、一意制約違反でエラーとなって
しまいます。
どなたかご親切な方ご教授頂きたく、
宜しくお願い申し上げます。

      記

create or replace
procedure dbInsert台帳追加
(
out_valoutpls_integer
)
as
cursor cur is
SELECT 注文主,受注NO,売上日,品番,品名,数量,
登録日時,登録者
FROM D売上台帳
WHERE 売上日 = TO_CHAR(sysdate,'YYYY/MM/DD')
;

cur_rec cur%rowtype;
begin
open cur;
loop
fetch cur into cur_rec;
exit when cur%notfound;

INSERT INTO D売上見通台帳
(
ID,注文主,受注NO,売上日,品番,品名,数量,
登録日時,登録者,更新日時,更新者
)
VALUES
(
seqD売上台帳ID.nextval,cur_rec.注文主,cur_rec.受注NO,cur_rec.品番,cur_rec.品名,
cur_rec.数量,cur_rec.登録日時,cur_rec.登録者,cur_rec.更新日時,cur_rec.更新者
)
;

end loop;
close cur;

out_val := sql%rowcount;

end;

A 回答 (4件)

どうしても今のストアドプロシジャでしたいなら、


seqD売上台帳 number;
と定義して、
fetch cur into cur_rec;
exit when cur%notfound;
の次に
select seqD売上台帳ID.nextval into seqD売上台帳 from dual ;
を実行して、
INSERT INTO D売上見通台帳
(
ID,注文主,受注NO,売上日,品番,品名,数量,
登録日時,登録者,更新日時,更新者
)
VALUES
(
seqD売上台帳,cur_rec.注文主,cur_rec.受注NO,cur_rec.品番,cur_rec.品名,
cur_rec.数量,cur_rec.登録日時,cur_rec.登録者,cur_rec.更新日時,cur_rec.更新者
)
;
としてください。
    • good
    • 0
この回答へのお礼

大変参考になりました。
ありがとうございました。
また宜しくお願いします。

お礼日時:2011/02/02 09:54

回答は既に出ていますので、プログラムの記述方法についてです。


このようなカーソルループであれば for loop文の方が楽に書けますよ。
ご参考まで。

http://download.oracle.com/docs/cd/E16338_01/app …
    • good
    • 0
この回答へのお礼

ありがとうございます。
勉強いたします。

お礼日時:2011/02/02 09:55

なぜストアドプロシジャで実行するのでしょうかね。


INSERT INTO D売上見通台帳
(
ID,注文主,受注NO,売上日,品番,品名,数量,
登録日時,登録者,更新日時,更新者
)
SELECT seqD売上台帳ID.nextval,
注文主,受注NO,売上日,品番,品名,数量,
登録日時,登録者
FROM D売上台帳
WHERE 売上日 = TO_CHAR(sysdate,'YYYY/MM/DD')
;
ってやればいいのでは。

そもそも、seqD売上台帳ID.nextvalはselectしないと番号が進みません。
単にinsetのvalue句の中でseqD売上台帳ID.nextvalと書いてもカウントアップされないです。
    • good
    • 0

seqD売上台帳ID.nextvalで取得される値が現在のD売上見通台帳のIDで存在する値が取得されるため、エラーになっているのではないですか?



seqD売上台帳IDのシーケンス値を別途、D売上見通台帳の最大IDより大きくする必要があると思われます。
    • good
    • 0

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

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