• ベストアンサー

ストアドについて質問

質問をご覧いただきまして有難うございます。 初めてストアドプロシージャを作成しており、サンプルでいろいろと作ってみようと思い、作成コードを実行しようとしたんですが、以下のようなメッセージが表示され、正常に実行できません。 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) タイムスタンプであれば重複もないと思うんですが。。。 原因がよくわからないです。。。 宜しくお願い致します!

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

  • ベストアンサー
  • dda167
  • ベストアンサー率76% (55/72)
回答No.1

>タイムスタンプであれば重複もないと思うんですが。。。 実際に確認してみればいいじゃないですか。 下は私の環境(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プロシージャが正常に完了しました。

velvet_emo
質問者

お礼

早速のご回答ありがとうございます。 自身でも確認してみました! 変化無しですね。。。。 なぜそうなるのかがわからないです。。。 また調べます。。

その他の回答 (3)

  • SaKaKashi
  • ベストアンサー率24% (755/3136)
回答No.4

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

velvet_emo
質問者

お礼

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

  • dda167
  • ベストアンサー率76% (55/72)
回答No.3

蛇足ではありますが…… テーブルの設計変更が可能であれば シーケンスなどを主キーにするほうがいいと思いますよ。

velvet_emo
質問者

お礼

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

  • dda167
  • ベストアンサー率76% (55/72)
回答No.2

どうしても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パッケージの実行権限が必要です。

関連するQ&A