• ベストアンサー

ストアドについて質問

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

  • Oracle
  • 回答数4
  • ありがとう数3

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

  • ベストアンサー
  • 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

  • ストアドの戻り値(配列)について

    ストアドをコールして配列型の戻り値を取得したいのですが、 エラーが出てしまい原因が分かりません。 どなたかご教授頂けないでしょうか? ★PL/SQL★ CREATE OR REPLACE TYPE TBL_NUM10 AS VARRAY(10) OF NUMBER(10); CREATE OR REPLACE PACKAGE TEST_PKG IS TYPE TBL_NUM10 IS VARRAY(10) OF NUMBER(10); PROCEDURE HAIRETU(O_CNT OUT TBL_NUM10); END TEST_PKG; / CREATE OR REPLACE PACKAGE BODY TEST_PKG IS PROCEDURE HAIRETU(O_CNT OUT TBL_NUM10) IS TMP_CNT TBL_NUM10; BEGIN TMP_CNT := TBL_NUM10(0,0,0,0,0,0,0,0,0,0); TMP_CNT(1) := 1; TMP_CNT(2) := 2; TMP_CNT(3) := 3; O_CNT := TMP_CNT; EXCEPTION WHEN OTHERS THEN DBMS_OUTPUT.PUT_LINE(SQLERRM); END HAIRETU; END TEST_PKG; / DECLARE O_CNT TBL_NUM10; BEGIN TEST_PKG.HAIRETU(O_CNT); DBMS_OUTPUT.PUT_LINE(O_CNT(1)); DBMS_OUTPUT.PUT_LINE(O_CNT(2)); DBMS_OUTPUT.PUT_LINE(O_CNT(3)); END; / ★実行結果★ SQL実行中に以下のエラーが発生しました。 ORA-06550: 行4、列4: PLS-00306: 'HAIRETU'の呼出しで、引数の数または型が正しくありません。 ORA-06550: 行4、列4: PL/SQL: Statement ignored よろしくお願いします。

  • MySQLのストアドプロシージャについて

    MySQL5.6のストアドプロシージャが返すSELECT結果のフェッチ方法について教えてください。 delimiter $ create procedure sample_proc() begin select * from TEST_TBL; end$ の様なストアドプロシージャがあり、これを他のストアドプロシージャから呼び出して、 ループしながらフェッチしたいのですが、どうすればよいでしょうか。

  • ストアドプロシージャ作成時のエラーについて

    お世話になっております。 CREATE PROCEDURE AAA (IN param INT) BEGIN SELECT CD, NAME FROM TBL WHERE TBL_KEY = param; END INTEGER型の引数を渡してVARCHAR型のCD、NAMEを取り出す程度のストアドプロシージャを作成しようとすると 1303 - Can't create a PROCEDURE from within another stored routine. なるエラーが表示されて作成ができません。 このエラーの理由についてコメント頂ければ幸いです。

    • ベストアンサー
    • MySQL
  • ストアドファンクション⇒プロシージャ呼出し失敗する

    参考の通りに、ストアドプロシージャ作成SQL文を発行し、 コマンドライン上からは、以下の通りの結果1となり、 レコードがinsertされます。 <結果1> mysql> call logger('ほげ', 'ホゲ'); Query OK, 1 row affected (0.01 sec) mysql> select * from PROCEDURE_LOG; +--------+--------+---------------------+ | NAME | QUERY | EXECUTE_DATE | +--------+--------+---------------------+ | ほげ | ホゲ | 2014-03-26 10:41:26 | +--------+--------+---------------------+ 1 row in set (0.00 sec) ですが、testというストアドファンクションから呼び出してみましたが、 以下の結果2の通り、失敗します。 <結果2> mysql> select test(); ERROR 1336 (0A000): Dynamic SQL is not allowed in stored function or trigger <test> BEGIN CALL logger('test','1'); RETURN CONCAT('END'); END 現在動作している環境では、どこでエラーが発生したかがわからず、 ロガーの処理をなんとしても実装したいのですが、 いろいろ試してみても、解決できませんでした。 ご教示のほど、よろしくお願いします。 <参考> http://treeapps.hatenablog.com/entry/20120106/p1 <ストアドプロシージャ作成SQL文(logger)> SET NAMES UTF8; delimiter // -- ログ出力 DROP PROCEDURE IF EXISTS logger// CREATE PROCEDURE logger( IN PROCEDURE_NAME TEXT, IN SQL_TEXT TEXT ) BEGIN DECLARE CNT INT; CREATE TABLE IF NOT EXISTS PROCEDURE_LOG ( NAME VARCHAR(64), QUERY TEXT, EXECUTE_DATE TIMESTAMP, KEY IDX1 (NAME, QUERY(64), EXECUTE_DATE) ) ENGINE=MYISAM DEFAULT CHARSET=UTF8; -- 古いログを削除 SELECT COUNT(*) INTO CNT FROM PROCEDURE_LOG; IF CNT >= 1000 THEN DELETE FROM PROCEDURE_LOG LIMIT 1; END IF; -- テーブルにログを記録 SET @sql = CONCAT('INSERT INTO PROCEDURE_LOG VALUES (', QUOTE(PROCEDURE_NAME), ',', QUOTE(SQL_TEXT), ', null)'); PREPARE stmt FROM @sql; EXECUTE stmt; END // delimiter ;

    • ベストアンサー
    • MySQL
  • ストアドファンクションがうまく作成できない

    SQL Server 2005 にて、 以下のようなストアドファンクションを作成しようとしても、 「メッセージ 156、レベル 15、状態 1、プロシージャ TestKansu、行 30 キーワード 'end' 付近に不適切な構文があります。」 といったエラーメッセージが表示されてしまい、 うまく作成できません。。 文法など、いろいろ調べてみたところ、特に問題なさそうな 感じではあるのですが。。 どこに問題があるのか、どなたかご教授願えないでしょうか? なにとぞ、よろしくお願いいたします。 -------------------------------- use tempdb go -- 呼び出し形式 create function TestKansu ( @Date as datetime, @Type as varchar(1) ) returns @ReturnTable table ( StartDate varchar(8), EndDate varchar(8) ) as begin if @Type is null begin raiserror('正しいtypeを指定してください',-1,-1) end if @Date is null begin SET @Date = getdate() end if @Type = '0' begin insert into @ReturnTable select convert(varchar(8), dateadd(dd ,-2 ,@Date), 112) as StartDate, convert(varchar(8), dateadd(dd ,-2 ,@Date), 112) as EndDate, end if @Type = '1' begin insert into @ReturnTable select convert(varchar(8), @Date, 112) as StartDate, convert(varchar(8), @Date, 112) as EndDate end return end --------------------------------

  • ストアド内で動的にSQLを作る際のLIKE演算子シングルクォーテーションの数

    現在Access2003とSQLServer2005ExpressEditonで勉強中の者です。 ストアドプロシージャを動的に作成したいと思い 以下のページを参考に、NorthwindCS.adpはダウンロードせず 自前で簡単に環境を作ってストアドプロシージャをつくりテストに成功しました。 http://support.microsoft.com/kb/286828/ja そこで「もし検索対象のテーブルに摘要欄があり、"未"を含む検索をしたい場合はどうすればよいか」と思い、摘要フィールド(Varchar)を作成してストアドプロシージャに変数@TEKIYO(Varchar)を作り、以下の行を足しました。 ---------------------------------------------------------------- --摘要の検索条件がNULLかどうかを確認します。 --ここに値が含まれている場合WHERE句を作成します。 IF @TEKIYO IS NOT NULL BEGIN IF @SQLSTRING IS NOT NULL BEGIN SELECT @SQLSTRING = @SQLSTRING + ' AND TEKIYO LIKE ''%''' + @TEKIYO + '%''' END ELSE BEGIN SELECT @SQLSTRING = 'WHERE TEKIYO LIKE ''%''' + @TEKIYO + '%''' END END ---------------------------------------------------------------- adpの検索フォーム摘要欄に「未」と入力し実行ボタンを押すと「実行時エラー102 '未'付近に不適切な構文があります」と出てしまいました。 シングルクォーテーションの打ち方が間違っているのだろうと色々調べたり、打ち方を変えてみたりしたのですが、解決できず悩んでおります。 正解はどうなのでしょうか?教えてください。 なにとぞよろしくお願いいたします。

  • ストアドプロシージャーでループするとエラー

    ストアドプロシージャーを空の行をつくるために、ループさせようとしていますが、エラーがでます。 #1313 - RETURN is only allowed in a FUNCTION 書いたソースです。 delimiter | CREATE PROCEDURE looptest(OUT param1 INT) begin declare cnt int default 0; declare result varchar(255) default seed; lbl : loop set cnt =cnt +1; if cnt >= param1 then leave lbl; else INSERT INTO `wp_base_posts` (`ID`, `post_author`, `post_date`, `post_date_gmt`, `post_content`, `post_title`, `post_excerpt`, `post_status`, `comment_status`, `ping_status`, `post_password`, `post_name`, `to_ping`, `pinged`, `post_modified`, `post_modified_gmt`, `post_content_filtered`, `post_parent`, `guid`, `menu_order`, `post_type`, `post_mime_type`, `comment_count`) VALUES (NULL, '0', '0000-00-00 00:00:00', '0000-00-00 00:00:00', '', '', '', 'draft', 'open', 'open', '', '', '', '', '0000-00-00 00:00:00', '0000-00-00 00:00:00', '', '0', '', '0', 'page', '', '0'); end if; end loop lbl; return result; END | delimiter; call looptest; #1313 - RETURN is only allowed in a FUNCTION

  • ストアドプロシージャのbegin、end

    下記の様なストアドプロシージャを作成し、VB側から実行させています。 どうしても、★SQL文2★の後のreturn文を実行してくれません。 (VB側ではreturn値が0と判断します。) このreturn文を★SQL文2★の前に移動すると、return値が-1として正常に取得できます。 begin、endのブロックの記述に何か間違いがあるのでしょうか? 環境:sqlserver2000,windows2000,vb6 よろしくお願いします。 CREATE PROCEDURE [sp_AAA] @PARAM1 varchar(16) AS begin if (~) begin ★SQL文1★ if (@@ERROR <> 0) begin return @@ERROR end end ★SQL文2★ return -1 ←ココ end

  • ストアドプロシージャでのパラメータのデータ型の質問

    いつもお世話になっております。たびたびの質問で恐縮です。 ストアドプロシージャでのパラメータのデータ型が設定できず困っております。たとえば次はパラメータの文字を表示させるものです。 CREATE OR REPLACE PROCEDURE test(p VARCHAR2(10)) IS t VARCHAR2(10); BEGIN t:=p; DBMS_OUTPUT.PUT_LINE(t); END; / コンパイルエラーになるので、パラメータのデータ型を、VARCHAR2のように(10)を取るとうまくいきます。しかし、変数定義の「t VARCHAR2(10)」の(10)を取ると文字列の制約制限からはずれるとのエラーになります。 VARCHAR2というのは、PL/SQLの変数あるいはパラメータではどのように記述すればよろしいのでしょうか。 基本的なことを理解しておらず、申し訳ありません。 どうか、よろしくお願いいたします。

  • ストアドファンクションの実行

    CREATE OR REPLACE FUNCTION hoge(str IN VARCHAR2) ~ を作成した後、 PL*SQLにてSQL> exec hoge('fuga'); を実行すると、 行1でエラーが発生しました。: ORA-06550: 行1、列7: PLS-00221: 'hoge'がプロシージャではないか、または未定義です・ ORA-06550: 行1、列7: PL/SQL: Statement ignore と言われます。 どうすればエラーを解決できますでしょうか? 助言を宜しくお願い致します。