質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.50%

  • Java

    15845questions

    Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

  • MySQL

    7005questions

    MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

  • Seasar2

    58questions

    Seasar2はJ2EE/Java EEでの大規模な開発を効率良く行なうためのフレームワークです。 必要な設定ファイルを従来のものと比べて少なくし、依存性を分離して記述しています。 そのため、生産性の高いプログラム開発が可能です。

S2JDBCのmigrateにストアドプロシージャを入れたい

受付中

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 800

funnyraliho

score 2

初めまして。新米プログラマーのfunnyralihoです。

今回あれこれ調べて先輩方に頼ってみてもなかなか解決しなかった問題を
どうしても解決したく、質問させていただきます。
初めての投稿で至らぬ点もあるかと思いますが、
とうかお助け下さい…よろしくお願い致します。

知識はほとんどなく理解のために調べる時間もかなりかかってしまいますが
できるだけ初心者向けの解説が頂けると大変助かります。


質問です。
MySQLのストアドプロシージャをmigrateに入れたいのですが、
やってみるとエラーが出るというパターンです。
※JavaからJdbcManager経由で
 ストアドプロシージャを呼び出して実行することはできています。
 手動でDBに追加するには問題なくCreateもできるSQLです。

S2JDBCは
db\migrate\{db名}\migrate\{バージョン番号}\create\010-table\hoge.sql
                                                        もしくは\drop\010-table\hoge.sql
といったディレクトリ構成でSQLファイルを配置すると、
s2jdbc-gen-build.xmlなどの操作で自動的にDBスキーマ?テーブル?などを
作成してくれると思います。
逆にDBの方からそのmigrateのファイルを作ったり、
Javaのクラスを自動生成してくれると思います。

今回私は自分の仕事でストアドプロシージャを作成しました。
それをmigrateに入れ欲しいということで、いくつかのストアドプロシージャを
以下のディレクトリ構成で保存しました。
db\migrate\{db名}\migrate\{バージョン番号}\create\070-procedure\
                                                        もしくは\drop\070-procedure\


以下そのcreate用SQLです。
※急いで書いてしまっているので例のSQLがおかしいかもしれませんが、
 中身のSELECT文以外はそのままです。
 このストアドプロシージャ単体で実行も、
 Javaからの実行も問題無く出来ます。

delimiter $$
create procedure getHoge(in hoge_sids bigint(20), out status int)
SQL SECURITY INVOKER
begin
declare exit handler for 1205 set status = -1; -- Lock Wait Timeout error
declare exit handler for sqlwarning set status = -1; -- SQL warning error
declare exit handler for sqlexception set status = -1; -- SQL exception error
set status = 0;
set @s = CONCAT('select id (例ですみません、必要ならぼかして書きますので…)
from hoge
inner join hugahuga on huga.id = hoge.huga_id
where hoge.sid IN (' , hoge_sids , ')');
prepare stmt from @s;
execute stmt;
deallocate prepare stmt;
end;
$$
delimiter ;

以下はDrop用SQLです。
drop procedure getHoge;


保存し、ビルドをしてからantの代わりに
batファイルで以下のコマンドでmigrateします。
こちらもストアドプロシージャをいれていなければ問題なく実行され
DBスキーマが整います。
C:\dev\eclipse>cd /d C:\Users\9004037986\gitMDBA\meta-core\meta-jdbc\

C:\Users\9004037986\gitMDBA\meta-core\meta-jdbc>cmd /c mvn -Dmaven.test.skip=true antrun:run -Dant.target=migrate

しかし、
ストアドプロシージャのmigrateを作成すると

C:\Users\{ユーザー}\git\{ディレクトリ}\s2jdbc-gen-build.xml:222: Exception in thread "main" org.seasar.exte
seasar.extension.jdbc.gen.internal.command.MigrateCommand)の実行に失敗しました。バージョンは S2JDBC-Gen 2.4.47 です
n0003]SQLファイル(C:\Users\{ユーザー}\git\{ディレクトリ}\db\{DB名}\migrate\0053\create\070-procedure\getHoge bigint(20), out status int) SQL SECURITY INVOKER begin declare exit handler for 1205 set status = -1)の実行
on: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the ri
sids bigint(20), ou' at line 1
        at org.seasar.extension.jdbc.gen.internal.command.AbstractCommand.execute(AbstractCommand.java:164)
        at org.seasar.extension.jdbc.gen.internal.command.CommandInvokerImpl.invoke(CommandInvokerImpl.java:29)
        at org.seasar.extension.jdbc.gen.command.CommandAdapter.main(CommandAdapter.java:61)
Caused by: org.seasar.extension.jdbc.gen.exception.SqlFailedRuntimeException: [ES2JDBCGen0003]SQLファイル(C:\Users\{ディレクトリ}\getHoge.sql)内の1行目のSQL(delimiter $$ create procedure getHoge(in hoge_sids bigint(20), out sta
実行中に例外が発生しました。理由はcom.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: You have an error in y
e right syntax to use near 'delimiter $$ create procedure getHoge(in hoge_sids bigint(20), ou' at li
        at org.seasar.extension.jdbc.gen.internal.sql.SqlFileExecutorImpl.execute(SqlFileExecutorImpl.java:91)
        at org.seasar.extension.jdbc.gen.internal.command.MigrateCommand$1.create(MigrateCommand.java:578)
        at org.seasar.extension.jdbc.gen.internal.version.MigraterImpl$1.execute(MigraterImpl.java:205)
        at org.seasar.extension.jdbc.gen.internal.sql.SqlUnitExecutorImpl.executeInternal(SqlUnitExecutorImpl.java:
        at org.seasar.extension.jdbc.gen.internal.sql.SqlUnitExecutorImpl.execute(SqlUnitExecutorImpl.java:71)
        at org.seasar.extension.jdbc.gen.internal.version.MigraterImpl.migrateInternal(MigraterImpl.java:197)
        at org.seasar.extension.jdbc.gen.internal.version.MigraterImpl.migrate(MigraterImpl.java:109)
        at org.seasar.extension.jdbc.gen.internal.command.MigrateCommand.doExecute(MigrateCommand.java:561)
        at org.seasar.extension.jdbc.gen.internal.command.AbstractCommand.execute(AbstractCommand.java:162)
        ... 2 more
Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: You have an error in your SQL syntax; check t
ear 'delimiter $$ create procedure getHoge(in hoge_sids bigint(20), ou' at line 1
        at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
        at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57)
        at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
        at java.lang.reflect.Constructor.newInstance(Constructor.java:526)
        at com.mysql.jdbc.Util.handleNewInstance(Util.java:389)
        at com.mysql.jdbc.Util.getInstance(Util.java:372)
        at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:980)
        at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3835)
        at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3771)
        at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2435)
        at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2582)
        at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2531)
        at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2489)
        at com.mysql.jdbc.StatementImpl.execute(StatementImpl.java:848)
        at com.mysql.jdbc.StatementImpl.execute(StatementImpl.java:742)
        at org.seasar.extension.jdbc.gen.internal.sql.SqlFileExecutorImpl.execute(SqlFileExecutorImpl.java:89)
        ... 10 more
ava

上記のエラーが発生します。

ストアドプロシージャはmigrateに入れることはできないのでしょうか?

(他の先輩エンジニアの誰かも同じ過ちをされているようなので
私では解決できない気がして質問致しました)

急いでコピペしたので、
変なところがありましたら、
明日修正します。


もしご存知の方がいらっしゃいましたら、
どうぞアドバイスをお願い致します。

以上です。
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

0

試していませんが、
delimiter $$

$$
delimiter ;
が不要と思います。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

同じタグがついた質問を見る

  • Java

    15845questions

    Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

  • MySQL

    7005questions

    MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

  • Seasar2

    58questions

    Seasar2はJ2EE/Java EEでの大規模な開発を効率良く行なうためのフレームワークです。 必要な設定ファイルを従来のものと比べて少なくし、依存性を分離して記述しています。 そのため、生産性の高いプログラム開発が可能です。