こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

Insertの質問

いつもお世話になっております。
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;

投稿日時 - 2011-01-31 22:42:01

QNo.6489098

困ってます

質問者が選んだベストアンサー

どうしても今のストアドプロシジャでしたいなら、
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.更新者
)
;
としてください。

投稿日時 - 2011-02-01 00:13:59

お礼

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

投稿日時 - 2011-02-02 09:54:46

このQ&Aは役に立ちましたか?

1人が「このQ&Aが役に立った」と投票しています

回答(4)

ANo.4

回答は既に出ていますので、プログラムの記述方法についてです。
このようなカーソルループであれば for loop文の方が楽に書けますよ。
ご参考まで。

http://download.oracle.com/docs/cd/E16338_01/appdev.112/b56260/static.htm#CIHBBCEC

投稿日時 - 2011-02-01 12:18:40

お礼

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

投稿日時 - 2011-02-02 09:55:31

ANo.2

なぜストアドプロシジャで実行するのでしょうかね。
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と書いてもカウントアップされないです。

投稿日時 - 2011-01-31 23:14:56

ANo.1

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

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

投稿日時 - 2011-01-31 23:13:14

あなたにオススメの質問