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

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

新規登録して質問してみよう
ただいま回答率
85.48%
MySQL

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

Java

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

Seasar2

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

Q&A

1回答

2155閲覧

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

funnyraliho

総合スコア8

MySQL

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

Java

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

Seasar2

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

0グッド

0クリップ

投稿2015/11/24 13:57

編集2015/11/24 14:04

初めまして。新米プログラマーの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からの実行も問題無く出来ます。

MySQL

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

以下はDrop用SQLです。

MySQL

1drop 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を作成すると

J[INFO]

1C:\Users\{ユーザー}\git\{ディレクトリ}\s2jdbc-gen-build.xml:222: Exception in thread "main" org.seasar.exte 2seasar.extension.jdbc.gen.internal.command.MigrateCommand)の実行に失敗しました。バージョンは S2JDBC-Gen 2.4.47 です 3n0003]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)の実行 4on: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the ri 5sids bigint(20), ou' at line 1 6 at org.seasar.extension.jdbc.gen.internal.command.AbstractCommand.execute(AbstractCommand.java:164) 7 at org.seasar.extension.jdbc.gen.internal.command.CommandInvokerImpl.invoke(CommandInvokerImpl.java:29) 8 at org.seasar.extension.jdbc.gen.command.CommandAdapter.main(CommandAdapter.java:61) 9Caused 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 10実行中に例外が発生しました。理由はcom.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: You have an error in y 11e right syntax to use near 'delimiter $$ create procedure getHoge(in hoge_sids bigint(20), ou' at li 12 at org.seasar.extension.jdbc.gen.internal.sql.SqlFileExecutorImpl.execute(SqlFileExecutorImpl.java:91) 13 at org.seasar.extension.jdbc.gen.internal.command.MigrateCommand$1.create(MigrateCommand.java:578) 14 at org.seasar.extension.jdbc.gen.internal.version.MigraterImpl$1.execute(MigraterImpl.java:205) 15 at org.seasar.extension.jdbc.gen.internal.sql.SqlUnitExecutorImpl.executeInternal(SqlUnitExecutorImpl.java: 16 at org.seasar.extension.jdbc.gen.internal.sql.SqlUnitExecutorImpl.execute(SqlUnitExecutorImpl.java:71) 17 at org.seasar.extension.jdbc.gen.internal.version.MigraterImpl.migrateInternal(MigraterImpl.java:197) 18 at org.seasar.extension.jdbc.gen.internal.version.MigraterImpl.migrate(MigraterImpl.java:109) 19 at org.seasar.extension.jdbc.gen.internal.command.MigrateCommand.doExecute(MigrateCommand.java:561) 20 at org.seasar.extension.jdbc.gen.internal.command.AbstractCommand.execute(AbstractCommand.java:162) 21 ... 2 more 22Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: You have an error in your SQL syntax; check t 23ear 'delimiter $$ create procedure getHoge(in hoge_sids bigint(20), ou' at line 1 24 at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) 25 at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57) 26 at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) 27 at java.lang.reflect.Constructor.newInstance(Constructor.java:526) 28 at com.mysql.jdbc.Util.handleNewInstance(Util.java:389) 29 at com.mysql.jdbc.Util.getInstance(Util.java:372) 30 at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:980) 31 at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3835) 32 at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3771) 33 at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2435) 34 at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2582) 35 at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2531) 36 at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2489) 37 at com.mysql.jdbc.StatementImpl.execute(StatementImpl.java:848) 38 at com.mysql.jdbc.StatementImpl.execute(StatementImpl.java:742) 39 at org.seasar.extension.jdbc.gen.internal.sql.SqlFileExecutorImpl.execute(SqlFileExecutorImpl.java:89) 40 ... 10 more 41ava 42

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

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

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

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

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

以上です。

気になる質問をクリップする

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

試していませんが、

delimiter $$

$$ delimiter ;

が不要と思います。

投稿2015/11/25 01:10

eripong

総合スコア1546

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問