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

質問をご覧いただきまして有難うございます。

初めてストアドプロシージャを作成しており、サンプルでいろいろと作ってみようと思い、作成コードを実行しようとしたんですが、以下のようなメッセージが表示され、正常に実行できません。

ORA-00001: 一意制約(OES4.PK_SITT_IKO_LOG)に反しています
ORA-06512: "OES2.PRA002",行16
ORA-06512: 行4

以下はストアドです。
CREATE OR REPLACE PROCEDURE PRACTICE001

IS
BEGIN
DECLARE

--ループ
CNT NUMBER;

BEGIN

CNT := 0;
LOOP
EXIT WHEN CNT >= 10;
CNT := CNT + 1;
insert into LOG_TBL values(systimestamp,'test','comments are...');
END LOOP;

END;
END;

テーブル(LOG_TBL)定義は次のようになっています。
LOG_TIME timestamp NOT NULL
COMMENT1 varchar2(20)
COMMENT2 varchar2(200)

タイムスタンプであれば重複もないと思うんですが。。。

原因がよくわからないです。。。

宜しくお願い致します!

A 回答 (4件)

>タイムスタンプであれば重複もないと思うんですが。

。。
実際に確認してみればいいじゃないですか。
下は私の環境(Win2Kpro+OracleXE)で試したものです。

SQL> set serveroutput on
SQL> begin
2 for i in 1..10 loop
3 dbms_output.put_line(systimestamp);
4 end loop;
5 end;
6 /
09-11-09 18:43:48.642000000 +09:00
09-11-09 18:43:48.642000000 +09:00
09-11-09 18:43:48.642000000 +09:00
09-11-09 18:43:48.642000000 +09:00
09-11-09 18:43:48.642000000 +09:00
09-11-09 18:43:48.642000000 +09:00
09-11-09 18:43:48.642000000 +09:00
09-11-09 18:43:48.642000000 +09:00
09-11-09 18:43:48.642000000 +09:00
09-11-09 18:43:48.642000000 +09:00

PL/SQLプロシージャが正常に完了しました。
    • good
    • 0
この回答へのお礼

早速のご回答ありがとうございます。

自身でも確認してみました!

変化無しですね。。。。
なぜそうなるのかがわからないです。。。
また調べます。。

お礼日時:2009/11/09 18:58

エラーの内容は、


>ORA-00001: 一意制約(OES4.PK_SITT_IKO_LOG)に反しています
ですから、表にPrimary key句があるか、unique索引があるはずです。
その制限事項に引っかかってます。
タイムスタンプでもWindowsの場合の精度は1/100秒で、Unix/Linuxでも1/1000秒くらいです。
LoopしてInsertしたら同じTimeStampの値になるのは当然です。
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。

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

お礼日時:2009/11/26 09:53

蛇足ではありますが……


テーブルの設計変更が可能であれば
シーケンスなどを主キーにするほうがいいと思いますよ。
    • good
    • 0
この回答へのお礼

ありがとうございます。
設計段階のため、仕様が変更になりました。

ご回答ありがとうございました。

お礼日時:2009/11/26 09:51

どうしてもsystimestampを使うのなら……



SQL> set serveroutput on
SQL> begin
2 for i in 1..10 loop
3 dbms_output.put_line(systimestamp);
4 dbms_lock.sleep(0.1);
5 end loop;
6 end;
7 /
09-11-09 19:05:00.830000000 +09:00
09-11-09 19:05:00.960000000 +09:00
09-11-09 19:05:01.060000000 +09:00
09-11-09 19:05:01.160000000 +09:00
09-11-09 19:05:01.260000000 +09:00
09-11-09 19:05:01.361000000 +09:00
09-11-09 19:05:01.461000000 +09:00
09-11-09 19:05:01.561000000 +09:00
09-11-09 19:05:01.661000000 +09:00
09-11-09 19:05:01.761000000 +09:00

PL/SQLプロシージャが正常に完了しました。

ですかねえ……思いつくのは

DBMS_LOCKパッケージの実行権限が必要です。
    • good
    • 0

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

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