[seasar-dotnet:1363] Re: [DBFlute] take-finally.sql でOracleストアドプロシージャを実行したい。

kubo [E-MAIL ADDRESS DELETED]
2009年 6月 4日 (木) 20:47:47 JST


久保(jflute)です。

実行できたようで、よかったです。
なかなか渋いノウハウになりそうですね。
MLで情報共有できてよかったです。

2009/6/4 西山 はじめ <[E-MAIL ADDRESS DELETED]>:
> お世話になっております。
> 西山です。
>
> 以下の記述方法で実行できました!
> ありがとうございました!
> {call ALL_RECREATE_SEQUENCE}
>
> ;(セミコロン)があるとエラー、
> {}(括弧)が無いとエラー
> でした。
> {}が必要なのは盲点でした。
>
> 以下、エラーになる書き方です。
> {call ALL_RECREATE_SEQUENCE};
> call ALL_RECREATE_SEQUENCE;
> call ALL_RECREATE_SEQUENCE
>
> exec~は全部ダメでした。
>
>> replace-schema.bat(.sh)を編集して、本タスク実行直後に
>> SQL*Plus経由で実行する、というやり方もあります。
> 忘れていました。そんな方法も有ったのですね・・・
>
>
> [2009/06/04 19:59] kubo さんは書きました。:
>> 久保(jflute)です。
>>
>> {call ALL_RECREATE_SEQUENCE};
>>
>> でどうでしょうか?
>> ちょっと調べてみると、そもそもEXEC(UTE)は
>> SQL*Plusのコマンドのようです。
>> (callは標準SQLのストアド呼び出しコマンド)
>>
>> また、参考までにですが、
>> replace-schema.bat(.sh)を編集して、本タスク実行直後に
>> SQL*Plus経由で実行する、というやり方もあります。
>>
>> ちなみに、「IDの最大値+1にする処理」は確かにやりたいですね。
>> PostgreSQLだとスマートにできるのですが、
>> Oracleだとかなりしんどいようで。なので、実業務では
>> よくシーケンスのStartを100000から開始するとか(テストデータは1から)、
>> もしくはテストデータを100000から、
>> (テスト実行だけで10万以上Insertしないだろうという割り切りで)
>> などで回避してたりしますね。
>> 「IDの最大値+1にする処理」のストアドが出来てるなら、
>> それが一番ですね
>>
>> 2009/6/4 西山 はじめ <[E-MAIL ADDRESS DELETED]>:
>>> お世話になっております。
>>> 西山です。
>>>
>>> SQL*PLUSからは正常に実行できます。
>>>
>>> このプロシージャは、replace-shemaによってデータが入った後 に、IDと関連付けたシーケンスの値を、IDの最大値+1にする処理が
>>> 入っております。
>>> Oracleでは、シーケンスを再作成しなければいけない為、このよう に処理しております。
>>>
>>> また、メンテナンスでデータベースを直接編集した際にもシーケン スを再作成することで重複エラーが起きない様する為にも準備して あるものです。
>>>
>>> CREATE SEQUENCE 文に、SELECTを含めることが出来ないという理由 も有ります。
>>>
>>>
>>>> Create文だけを「replace-schema-sequence.sql」みたいな感じで
>>>> 管理することでそのストアド呼び出しを回避はできないでしょ うか?
>>> SQL*PLUSから実行すればいいだけですが、replace-schemaで実行し たほうが管理上楽になるなぁと思った次第です。
>>>
>>> 難しいようでしたらスルーしてください。
>>>
>>>
>>> [2009/06/04 18:30] kubo さんは書きました。:
>>>> 久保(jflute)です。
>>>>
>>>> ありがとうございます。
>>>> take-finallyであることは関係ないようですね。
>>>>
>>>> ちなみに、SQL*Plusとか別のツールから
>>>> EXEC ALL_RECREATE_SEQUENCE;
>>>> は実行できますか?(念のための確認)
>>>>
>>>> JDBCでStatementで単純にその文字列を
>>>> execute(sql)しているだけなので、それでダメなら
>>>> なんともこれ以上どうすれば良いかわかりませんね...
>>>> (ちゃんとCallableStatementとか使わないとダメなのかな!?)
>>>>
>>>> ちなみにシーケンスの管理をストアド内でやってるのでしょうか?
>>>> ReplaceSchemaは既存シーケンスを自動でDropしますので、
>>>> Create文だけを「replace-schema-sequence.sql」みたいな感じで
>>>> 管理することでそのストアド呼び出しを回避はできないでしょうか?
>>>>
>>>> 2009/6/4 西山 はじめ <[E-MAIL ADDRESS DELETED]>:
>>>>> お世話になっております。
>>>>> 西山です。
>>>>>
>>>>> 回答ありがとうございます。
>>>>>
>>>>> replace-schema.sqlでも同じでした。
>>>>>
>>>>> ログに出たメッセージは以下の通りです。
>>>>>
>>>>>  EXEC ALL_RECREATE_SEQUENCE;
>>>>>  >> ORA-00900: SQL文が無効です。
>>>>>    (SQLState=42000 ErrorCode=900)
>>>>>
>>>>> このエラーが出る原因は、以下のようです。
>>>>> 【エラーの原因】
>>>>> 入力した文が有効なSQL文として認められない。このエラーは、SQL の構文が間違っているか、インストール時にPL/SQLがインストー
>>>>> ルされていない場合に発生する。
>>>>> また、サードパーティ製品のツールを使用した場合に標準SQLで ないSQL文がOracleに投げられている可能性もある。
>>>>>
>>>>> 以上よろしくお願いいたします。
>>>>>
>>>>> [2009/06/04 18:09] kubo さんは書きました。:
>>>>>> 久保(jflute)です。
>>>>>>
>>>>>> 西山さん、こんにちは
>>>>>>
>>>>>> 取り急ぎ、replace-schema.sqlで同じことすると
>>>>>> どうなりますでしょうか?
>>>>>> (take-finally.sql固有の話なのかどうかの切り分け)
>>>>>>
>>>>>> あと、「ORA-00900」ってOracle的には
>>>>>> どんなことを示すエラーでしょうか?
>>>>>>
>>>>>> 2009/6/4 西山 はじめ <[E-MAIL ADDRESS DELETED]>:
>>>>>>> お世話になっております。
>>>>>>> 西山です。
>>>>>>>
>>>>>>> DBFluteで、replace-schema.batでテーブルを生成した後、take-
>>>>>>> finally.sqlでストアドプロシージャの実行したいと思っております。
>>>>>>>
>>>>>>> take-finally.sqlに、
>>>>>>> EXEC PROCEDURE_NAME;
>>>>>>>
>>>>>>> と記述しても、ORA-0900:のエラーが出てしまいます。
>>>>>>>
>>>>>>> 何か手段が有りますでしょうか。
>>>>>>>
>>>>>>> 実行環境
>>>>>>> DB:Oracle9i
>>>>>>> DBFlute:0.8.9
>>>>>>>
>>>>>>> 以上よろしくお願いいたします。
>>>>>>>
>>>>>>> --
>>>>>>> ++++++++++++++++++++++++++++++++++++++++++++++++++++++++
>>>>>>> 株式会社フジミック システム開発センター ソフトウェア開発部
>>>>>>> 西山 創
>>>>>>> [E-mail]:[E-MAIL ADDRESS DELETED]
>>>>>>>
>>>>>>> 〒140-0002 品川区東品川3-32-42 フジテレビ別館7F
>>>>>>> [TEL]:03-5495-1060
>>>>>>> ++++++++++++++++++++++++++++++++++++++++++++++++++++++++
>>>>>>>
>>>>>>> _______________________________________________
>>>>>>> seasar-dotnet mailing list
>>>>>>> [E-MAIL ADDRESS DELETED]
>>>>>>> https://ml.seasar.org/mailman/listinfo/seasar-dotnet
>>>>>>>
>>>>>>
>>>>> --
>>>>> ++++++++++++++++++++++++++++++++++++++++++++++++++++++++
>>>>> 株式会社フジミック システム開発センター ソフトウェア開発部
>>>>> 西山 創
>>>>> [E-mail]:[E-MAIL ADDRESS DELETED]
>>>>>
>>>>> 〒140-0002 品川区東品川3-32-42 フジテレビ別館7F
>>>>> [TEL]:03-5495-1060
>>>>> ++++++++++++++++++++++++++++++++++++++++++++++++++++++++
>>>>>
>>>>> _______________________________________________
>>>>> seasar-dotnet mailing list
>>>>> [E-MAIL ADDRESS DELETED]
>>>>> https://ml.seasar.org/mailman/listinfo/seasar-dotnet
>>>>>
>>>> _______________________________________________
>>>> seasar-dotnet mailing list
>>>> [E-MAIL ADDRESS DELETED]
>>>> https://ml.seasar.org/mailman/listinfo/seasar-dotnet
>>>>
>>>>
>>>>
>>>
>>> --
>>> ++++++++++++++++++++++++++++++++++++++++++++++++++++++++
>>> 株式会社フジミック システム開発センター ソフトウェア開発部
>>> 西山 創
>>> [E-mail]:[E-MAIL ADDRESS DELETED]
>>>
>>> 〒140-0002 品川区東品川3-32-42 フジテレビ別館7F
>>> [TEL]:03-5495-1060
>>> ++++++++++++++++++++++++++++++++++++++++++++++++++++++++
>>>
>>> _______________________________________________
>>> seasar-dotnet mailing list
>>> [E-MAIL ADDRESS DELETED]
>>> https://ml.seasar.org/mailman/listinfo/seasar-dotnet
>>>
>>
>>
>>
>
>
> --
> ++++++++++++++++++++++++++++++++++++++++++++++++++++++++
> 株式会社フジミック システム開発センター ソフトウェア開発部
> 西山 創
> [E-mail]:[E-MAIL ADDRESS DELETED]
>
> 〒140-0002 品川区東品川3-32-42 フジテレビ別館7F
> [TEL]:03-5495-1060
> ++++++++++++++++++++++++++++++++++++++++++++++++++++++++
>
> _______________________________________________
> seasar-dotnet mailing list
> [E-MAIL ADDRESS DELETED]
> https://ml.seasar.org/mailman/listinfo/seasar-dotnet
>


seasar-dotnet メーリングリストの案内