AS400のDB2への接続

2,038 views
Skip to first unread message

よし

unread,
Aug 1, 2016, 6:35:11 AM8/1/16
to DBFluteユーザの集い
 こんばんは、yoshiです。

新しい案件で、ibm AS400のDB2へ接続する必要が出てきました。

DBFluteはDB2をサポートされていますが、AS400のDB2も同様でしょうか?

AS400の場合「JTOpen」という、JAVAのライブラリがあり、そこにJDBCも

含まれているようなのですが、こちらを使うことになるのでしょうか?

それとも、通常のdb2jcc.jarを使用することになりますでしょうか?

ざっくりとした質問で申し訳ないですが、もし前例がありましたら教えてください。

「JTOpen」

kubo

unread,
Aug 1, 2016, 7:06:54 AM8/1/16
to DBFluteユーザの集い
jfluteです

yoshiさん、こんばんは

> DBFluteはDB2をサポートされていますが、AS400のDB2も同様でしょうか?
残念ながら自分はその辺詳しくないので、
とりあえず答えられるのは…

「JDBCドライバがDB2と同じ、もしくは、
固有のドライバでもDB2と同じような挙動をする」
であれば、basicInfoMapのdatabaseは db2 で自動生成できます。

発行するSQL (ページングなど) もDB2と同じであれば、
DB2のクラスをそのまま使うことで動作するかもしれません。

なので、AS400で動かす環境があるなら、
もう試してみるっきゃない、という感じですね...

> ざっくりとした質問で申し訳ないですが、もし前例がありましたら教えてください。

jfluteはAS400につないだことないので、
(というかさわったこともない...)
どなたか情報ありましたらプリーズ。

※Twitterでも投げておきます。

kubo

unread,
Aug 1, 2016, 7:32:52 AM8/1/16
to DBFluteユーザの集い
jfluteです

とりあえず、Twitter, Facebookで投げてみました。

https://twitter.com/jflute/status/760069626696839169
https://www.facebook.com/dbflute/posts/691101134372966?pnref=story

リツイートしてくれたり、
シェアしてくれたりしている方々に深く感謝します。
ありがとうございます。

よし

unread,
Aug 1, 2016, 8:24:01 PM8/1/16
to DBFluteユーザの集い
jfluteさん

 返信有り難うございます。

 現状、まだ接続のための情報(IPアドレスとか)がもらえていないので、
まだ試せていない状態です。

 試すことができましたら、また、フィードバックします。


yuichi...@gmail.com

unread,
Aug 1, 2016, 8:26:29 PM8/1/16
to dbf...@googlegroups.com
Kanekoです。

8年ほど前ですが、チャレンジしてみたことがあります。
結果的には、メタデータがちゃんと取得できずにダメでした。。。。

ConnitionBeanの利用は、当時のままなら厳しいかもしれません。

・INDEX周りのメタデータが取れるのか?
(AS400ではINDEXと言いますが、一般的なRDBのVIEWに相当)

・各種データ型が正しく取れるか?
(特に全角型など、一般的なRDBに無い型。結局、Stringだろうから、タイプセーフにはできないと思われる。)

・シフトコードの制御は結局自前では?

※当時、CBが使いたかったので、メタデータちゃんと取れない時点で私は諦めましたが。。。。

また、設定によっては、UPDATE/INSERT/DELETEがJDBC経由では発行できないので、それも注意が必要です。

若干、うろ覚えですが、知ってる範囲での情報共有まで。
※情報が古かったら、申し訳ないです。

以上です。

2016/08/01 20:32、kubo <dbf...@gmail.com> のメッセージ:
> --
> このメールは Google グループのグループ「DBFluteユーザの集い」の登録者に送られています。
> このグループから退会し、グループからのメールの配信を停止するには dbflute+u...@googlegroups.com にメールを送信してください。
> このグループに投稿するには、dbf...@googlegroups.com にメールを送信してください。
> https://groups.google.com/group/dbflute からこのグループにアクセスしてください。
> その他のオプションについては、https://groups.google.com/d/optout にアクセスしてください。

山本学

unread,
Aug 1, 2016, 9:41:24 PM8/1/16
to DBFluteユーザの集い
山本です。

 現在絶賛開発中です。

 設定内容などは以下のとおりです。
 ・basicInfoMap.dfpropのdatabaseをdb2に設定。
 ・extlibへjt400.jar(https://mvnrepository.com/artifact/net.sf.jt400/jt400)をコピー
 ・更新が必要なファイルについてはadditionalPrimaryKeyMap.dfpropでPKを定義
 ・必要に応じてadditionalForeignKeyMap.dfpropを定義

 JDBCタスクを実行すると次のようなエラーが発生しますが、今のところ利用できています。
 ・[SQL0204] SYSCATのタイプ*FILEのCOLUMNSが見つからない。
 ・[SQL0204] SYSCATのタイプ*FILEのSEQUENCESが見つからない。

 参考になりましたら嬉しいです。

2016年8月1日月曜日 19時35分11秒 UTC+9 よし:

kubo

unread,
Aug 2, 2016, 12:15:16 AM8/2/16
to DBFluteユーザの集い
jfluteです

Kanekoさん、山本さん、情報ありがとうございます。

> ・basicInfoMap.dfpropのdatabaseをdb2に設定。
> ・extlibへjt400.jar(https://mvnrepository.com/artifact/net.sf.jt400/jt400)をコピー
> ・更新が必要なファイルについてはadditionalPrimaryKeyMap.dfpropでPKを定義
> ・必要に応じてadditionalForeignKeyMap.dfpropを定義

おおおぉぉ、これは貴重な情報ですねー。
なるほど、メタデータが取れないようなので、
additional系で頑張って補完という感じですかね。

いざとなったら additionalTable を使って、
もうメタデータに頼らないってのもアリかもですね。

> JDBCタスクを実行すると次のようなエラーが発生しますが、今のところ利用できています。
> ・[SQL0204] SYSCATのタイプ*FILEのCOLUMNSが見つからない。
> ・[SQL0204] SYSCATのタイプ*FILEのSEQUENCESが見つからない。

たぶん、DBコメントの取得とか、
シーケンスオブジェクト周りの自動制御系の機能とかが
使えないだけで、通常の自動生成はうまくいきそうですね。
(よかった…DB2のバージョン違いで該当テーブルがないかもしれない
ことを想定して例外をつぶすようにしていたのが功を奏しましたね(^^)



# にしても、AS400のDB2にDBFluteがアクセスする案件が
# 世の中に二つあるってことだけで感動です(^^

よし

unread,
Aug 2, 2016, 5:17:03 AM8/2/16
to DBFluteユーザの集い
yoshiです

jfluteさん、Kanekoさん、山本さん、情報ありがとうございます。 

取り急ぎ、regenerateまで問題なく動作しましたのでご報告いたします。

1.[DBFlute New Client]でデータベースを[DB2]にして作成。

2.[databaseInfoMap.dfprop]を以下の様に変更

    ; driver   = com.ibm.as400.access.AS400JDBCDriver
    ; url      = jdbc:as400://[HostIP]/JDBC
    ; schema   = [schema]
    ; user     = [user]
    ; password = [password]

3.extlibへjt400.jarをコピー 
 ドライバーは以下からダウンロードしました。
 上記ダウンロードページの以下のファイル
 Released /JTOpen-full/9.1/jtopen_9_1.zip

4.regenerateを実行
 山本さんの書かれている通りJDBCタスクで以下のエラーが発生していましたが、
 処理としては[BUILD SUCCESSFUL]で終了しています。 
> ・[SQL0204] SYSCATのタイプ*FILEのCOLUMNSが見つからない。 
> ・[SQL0204] SYSCATのタイプ*FILEのSEQUENCESが見つからない。 


実装で何か問題が発生しましたら、また報告させていただきます。

皆様ありがとうございました。

よし

unread,
Aug 2, 2016, 8:59:17 PM8/2/16
to DBFluteユーザの集い
yoshiです

additionalSchemaMap で少し躓いたので報告します。

【現象】
別のスキーマのテーブルを見る必要があり
databaseInfoMap.dfpropのadditionalSchemaMapを設定したのですが、
対象のテーブルが取り込まれませんでした。

【対応】
メインのスキーマの設定でtableTargetListで対象テーブルを指定しており、
そこにサブのスキーマで必要なテーブルの設定を追加すると取り込まれました。


これは、今回のAS400だったための現象でしょうか?

それとも元々の仕様でしょうか?

kubo

unread,
Aug 2, 2016, 11:01:20 PM8/2/16
to DBFluteユーザの集い
jfluteです

> 取り急ぎ、regenerateまで問題なく動作しましたのでご報告いたします。

おおぉ、とりあえず良かったです。
jfluteは何もやってないですけど笑、
DBFluteユーザー同士で情報交換して問題を解決するって、
ちょっと嬉し過ぎて涙ものですね(^^。

> メインのスキーマの設定でtableTargetListで対象テーブルを指定しており、
> そこにサブのスキーマで必要なテーブルの設定を追加すると取り込まれました。

状況整理すると、

メインスキーマのtableTargetList: あり ※Additionalのテーブルなし
AdditionalスキーマのtableTargetList: なし
 => Additionalスキーマ取り込まれない

メインスキーマのtableTargetList: あり ※Additionalのテーブルあり
AdditionalスキーマのtableTargetList: なし
 => Additionalスキーマ取り込まれた

ってところですかね。

ぼくも tableTargetList と合わせてAdditionalSchemaを
使ったことないので、少し試してみます。

(tableExceptList と AdditionalSchema なら問題なく動いてますが、
tableTargetListでAdditionalSchemaを弾いてしまっているのかもですね...)

DBFluteのバージョン教えてもらってもいいですか?
Java6版(1.0.x)か、Java8版(1.1.x)か。

kubo

unread,
Aug 2, 2016, 11:26:10 PM8/2/16
to DBFluteユーザの集い
jfluteです

取り急ぎ、MySQLの環境ではありますが、
1.0.5N と 1.1.1 の両方で試してみました。
メインスキーマの tableTargetList に関係なく、
AdditionalSchema のテーブル情報取得できました。

一応、期待する挙動としては、
dfpropのコメントにも書いてありましたが、
メインとAdditionalでtableTargetListは独立という感じです。
なので、

> メインのスキーマの設定でtableTargetListで対象テーブルを指定しており、
> そこにサブのスキーマで必要なテーブルの設定を追加すると取り込まれました。

は、ちょっと変な状況ですね。
メインのtableTargetListがAdditionalSchemaの
テーブル取得有無に影響してしまっていると。

ちょっと試して頂きたいのが、

A. メインのスキーマの設定でtableTargetListを空っぽにすると、
どうなりますでしょうか? (AdditionalSchemaの設定は残したまま)
 => 本当にtableTargetListがAdditionalのテーブルに影響しているのか確認

B. メインのスキーマの設定でtableTargetListを空っぽにして、
AdditionalSchemaの設定も削除するとどうなりますでしょうか?
 => AdditionalSchemaの設定に関係なく取得してしまっていないか確認

あと確認です。

C. 元々の状況で、schema/project-schema-xxx.xml の中で、
AdditionalSchemaのテーブルのメタデータで、
schema名が含まれていますでしょうか?

よし

unread,
Aug 3, 2016, 12:13:53 AM8/3/16
to DBFluteユーザの集い
yoshiです。


取り急ぎ、MySQLの環境ではありますが、
1.0.5N と 1.1.1 の両方で試してみました。
メインスキーマの tableTargetList に関係なく、
AdditionalSchema のテーブル情報取得できました。

テスト、ありがとうございます。

こちらの環境は1.0.5N になります。

 
A. メインのスキーマの設定でtableTargetListを空っぽにすると、
どうなりますでしょうか? (AdditionalSchemaの設定は残したまま)
 => 本当にtableTargetListがAdditionalのテーブルに影響しているのか確認


こちらを実行すると
The same-name table between different schemas is unsupported. 
のエラーになってしまいました。

B. メインのスキーマの設定でtableTargetListを空っぽにして、
AdditionalSchemaの設定も削除するとどうなりますでしょうか?
 => AdditionalSchemaの設定に関係なく取得してしまっていないか確認


こちらなのですが、メインスキーマのテーブル数が多く、なかなか終わらないので断念しました。

tableTargetListを空っぽにしないで、AdditionalSchemaの設定を削除した場合は
AdditionalSchemaのテーブルは取得されませんでした。
なのでAdditionalSchemaは効いているように思います。

 
あと確認です。

C. 元々の状況で、schema/project-schema-xxx.xml の中で、
AdditionalSchemaのテーブルのメタデータで、
schema名が含まれていますでしょうか?

含まれていました。

schema="データベース名.スキーマ名"

という形になっていました。
 

kubo

unread,
Aug 3, 2016, 12:47:06 AM8/3/16
to DBFluteユーザの集い
jfluteです

ありがとうございます。

> こちらを実行すると
> The same-name table between different schemas is unsupported.
> のエラーになってしまいました。

これですが、同じ名前のテーブルが、
メインスキーマとAdditionalSchemaの両方に
存在してますでしょうか?
(単にそれで落ちただけなのか...)

よし

unread,
Aug 3, 2016, 1:17:12 AM8/3/16
to DBFluteユーザの集い
yoshiです。



これですが、同じ名前のテーブルが、
メインスキーマとAdditionalSchemaの両方に
存在してますでしょうか?
(単にそれで落ちただけなのか...)

すみません、AS400が自社の環境ではないので、余り詳しいところがわかりません。 
以下のメッセージが出ていましたのでおそらくこのテーブルが問題なのだと思います。
[Duplicate Table]
[テーブル名1, テーブル名2]

よし

unread,
Aug 3, 2016, 1:23:11 AM8/3/16
to DBFluteユーザの集い
yoshiです。

 ちなみに、今回の開発の環境は、

 メインのデータベースはOracleで、

 基幹システムとしてAS400が有って、

 AS400は必要なマスターの取得や実績データのインサートをする。
 ※全テーブルは必要ない

 というような環境になっています。

 なので、複数DBの環境にもなっています。

kubo

unread,
Aug 3, 2016, 1:46:28 AM8/3/16
to DBFluteユーザの集い
jfluteです

> すみません、AS400が自社の環境ではないので、余り詳しいところがわかりません。
なるほど…大変ですね…

> 以下のメッセージが出ていましたのでおそらくこのテーブルが問題なのだと思います。
> [Duplicate Table]
> [テーブル名1, テーブル名2]
ありがとうございます。
まあ、たぶんあるのでしょう、きっと。

> メインのデータベースはOracleで、
>
>  基幹システムとしてAS400が有って、
OracleのためのDBFluteクライアントが一つ、
AS400のためのDBFluteクライアントが一つ、
AS400の方は、さらにAdditionalSchemaってところですね。


とりあえず、AdditionalSchemaのtableTargetListの件は…

期待する動作:
メインスキーマの tableTargetList は AdditionalSchema に影響しない。
DBFlute的にはそういう挙動のつもりで作っている。

MySQLだと:
jfluteの環境のMySQLだと、期待通りの挙動になる。

AS400だと:
yoshiさんの方でAS400だと、メインの方の tableTargetList が
AdditionalSchema のテーブル取得に影響してしまっている。

他の環境だと:
試せていない。
DB2でどうなのか、試したいがちょっと環境がない。
(作れなくはないはずだが検証には少し時間かかりそう)

ホワイトボックスには:
コードを読んでも、メインスキーマの tableTargetList が、
AdditionalSchema の判定に影響はできないようになっているが、
うむぅ…という感じ。AS400の方でメタデータのxmlみても、
スキーマ名はちゃんと取得できているので、
ちゃんと分岐するはずだが...何かしらの原因で分岐できてないのか…
(AS400を気軽に試せる環境がないのがつらい)

という状況ですね。
フィードバックありがとうございます。
ひとまず、わりきってメインスキーマの tableTargetList で
全部制御するって形でお願いします。
本来の仕様と違う使い方をしていることになるので、
dfpropにコメントでもろもろの経緯を書いておいて頂ければと。
(このMLスレッドへのリンクを貼付けちゃってもいいですし)

よし

unread,
Aug 3, 2016, 2:39:33 AM8/3/16
to DBFluteユーザの集い
yoshiです。

jfluteさん、いろいろありがとうございました。

ひとまず、わりきってメインスキーマの tableTargetList で
全部制御するって形でお願いします。

AS400 DB2での特殊な動きということで承知しました。

insert,update,delete,selectは一通り動作しました。
やりたいことはできているので全然問題ありません。
 
本来の仕様と違う使い方をしていることになるので、
dfpropにコメントでもろもろの経緯を書いておいて頂ければと。
(このMLスレッドへのリンクを貼付けちゃってもいいですし)

承知しました。
 

山本学

unread,
Aug 22, 2016, 8:26:52 PM8/22/16
to DBFluteユーザの集い
山本です。

本番環境への移行でつまづきました。

本番環境と開発環境ではサーバー名(JDBCでのcatalogに対応)が異なるのですが、
SQLが[catalog-name].[schema-name].[table-name]の形式になっているため、
SQLを実行すると例外が発生してしまいます。

littleAdjustmentMapを参照したところ、デフォルトではcatalogとschemaはSQLに含まないとのことでした。
littleAdjustmentMapはデフォルトのままなのに、なぜcatalogとschemaがSQLに含まれるのでしょうか。
また、SQLからcatalogとschemaを取り除くにはどのようにすればよろしいでしょうか。

よろしくお願いします。


2016年8月1日月曜日 19時35分11秒 UTC+9 よし:

kubo

unread,
Aug 22, 2016, 9:18:13 PM8/22/16
to DBFluteユーザの集い
jfluteです

山本さん、おはようございます。

> SQLが[catalog-name].[schema-name].[table-name]の形式になっているため、

いま、現状でその形式で ConditionBean のSQLが出力されているということですね?
littleAdjustmentMap.dfprop で特に設定もしていないのに。
(isAvailableAddingSchemaToTableSqlName も、
isAvailableAddingCatalogToTableSqlName も、falseなのに)

AS400の自動生成は、AdditionalSchemaを使っていますか?

SQLのテーブル名を決めているのはこの箇所です。
https://github.com/seasarorg/dbflute/blob/master/dbflute/src/main/java/org/apache/torque/engine/database/model/UnifiedSchema.java#L261

kubo

unread,
Aug 22, 2016, 11:05:33 PM8/22/16
to DBFluteユーザの集い
jfluteです

DBFluteの挙動をまとめておきます。

<< mainSchema >>
mainSchemaの場合 (databaseInfoMap.dfprop で直接接続しているDB) は、
littleAdjustmentMap.dfpropの設定次第でテーブル名のprefixが
付く付かないが決まります。
(なので、この状態で付与されるとなると想定外の挙動です)


<< additionalSchema >>
additionalSchemaの場合は、
デフォルトでテーブル名のprefixが付与されます。
これは、mainSchemaのConnectionで接続するので、
スキーマを識別する必要があるからです。

そして、additionalSchemaを使うような状況の場合、
DBFluteに関係なくSQLにスキーマ名を埋め込まないといけないので、
インフラ的に開発と本番とズレるような状況にはならないという前提です。
(もし、ズレるようであればDBFluteに関係なく大困りします)

もし、ConditionBeanだけの問題であれば、
DBFluteConfig の tableSqlNameFilter を使って、
本番のときは開発用のスキーマ名を置換するという方法もあります。
http://dbflute.seasar.org/ja/manual/function/ormapper/runtime/allcommon/dbfluteconfig.html#tablesqlnamefilter

ただ、外だしSQLの場合はどこにテーブル名があるかわからないですから、
ちょっと強引な置換になってしまうと思います。

山本学

unread,
Aug 23, 2016, 3:42:24 AM8/23/16
to DBFluteユーザの集い
山本です。

jfluteさん、返信有り難うございます。

いったんDBFluteConfig の tableSqlNameFilter で対応することにしました。

いま、現状でその形式で ConditionBean のSQLが出力されているということですね?
はい。ただし、上記のようにカタログを置換するようにしました。 

AS400の自動生成は、AdditionalSchemaを使っていますか? 
AdditionalSchemaは使っていません。
関係ないと思いますが、DBFluteのクライアントは複数あります。

DBFluteクライアントのproject-schema-xxx.xmlを確認したところ、tableタグのschema属性が
[catalog-name].[schema-name] となっていることに気づきましたが、関係ありますか?

以上


2016年8月23日火曜日 12時05分33秒 UTC+9 jflute:

kubo

unread,
Aug 23, 2016, 4:26:34 AM8/23/16
to DBFluteユーザの集い
jfluteです

> DBFluteクライアントのproject-schema-xxx.xmlを確認したところ、tableタグのschema属性が
> [catalog-name].[schema-name] となっていることに気づきましたが、関係ありますか?
関係ないですね。情報としては取れていて、
SQLのテーブル名にするときに付与するかしないかの判定がまた別です。

参考までに、databaseInfoMap.dfprop ってどのように設定されています?
(catalog や schema あたり)

#
# mainSchemaとして認識されていないとか...!?!?
#

山本学

unread,
Aug 24, 2016, 9:01:56 PM8/24/16
to DBFluteユーザの集い
山本です。

urlとschemaは以下のように設定しています。
  url = jdbc:as400://192.168.1.1/XXL
  schema = XXL
  # IPアドレスとschema名は仮のもの

catalogについては特に設定していません。

kubo

unread,
Aug 24, 2016, 9:49:40 PM8/24/16
to DBFluteユーザの集い
jfluteです
山本さん、情報ありがとうございます。
ということは、catalog名は特にdatabaseInfoMap.dfprop 上では
設定していないということですね。

すると、project-schema-xxx.xml 上の
[catalog-name].[schema-name] の [catalog-name] って、
どんな値でしょうか?(AS400における何かの名前?)

# 普通のDB2だと、project-schema-xxx.xml 上は、
# schema="[schema-name]" という感じで、
# catalog-nameまでは取得されないですね…

kubo

unread,
Aug 25, 2016, 12:17:25 AM8/25/16
to DBFluteユーザの集い
jfluteです

> dfpropで設定していないのに、SQLにcatalog,schema名が付いちゃう件

なんとなく仮説が一つ立ちました。
ConditionBeanのSQLのテーブル名にcatalog,schema名が
付くかどうかの判定は…

A. littleAdjustmentMap.dfpropのプロパティをtrueにしているかどうか
B. AdditionalSchemaかどうか
C. MainSchemaではない、かどうか

C は、通常はあり得ない状況で、
メタデータのSchema名とdatabaseInfoMap.dfpropで
指定されたSchema名が食い違うようなケースです。
Schema名に % とかワイルドカードを指定しない限り、
想定されない状況です。

山本さんの環境だと、AとBには合致していません。
で、C なんですけど…

通常のDB2:
o databaseInfoMap.dfprop: catalog名は指定しない
o JDBCのメタデータ: catalog名は取得されない

AS400のDB2:
o databaseInfoMap.dfprop: catalog名は指定しない
o JDBCのメタデータ: catalog名は取得される

という状況と予想され、
dfpropとメタデータで食い違いが発生してしまい、
それぞれのテーブルがMainSchemaのものと認識されず、
Cの状況としてテーブル名のprefixになってしまっている
のではないかと思います。

> DBFluteクライアントのproject-schema-xxx.xmlを確認したところ、tableタグのschema属性が
> [catalog-name].[schema-name] となっていることに気づきましたが、関係ありますか?

すいません、ここ関係ないと言ってしまったのですが、
厳密には、schema属性が存在すること自体は問題ありませんし、
他のDBMSだと [catalog-name].[schema-name] 形式になっていることも
問題ありませんが、普通のDB2だと [schema-name] 形式が期待値なので、
[catalog-name].[schema-name] とcatalogがくっ付いているのは想定外です。
「AS400のJDBCドライバだと [catalog-name] が取得できるちゃうんだー」
という感じで。

他のDBMSで [catalog-name] が取得できる場合は、
databaseInfoMap.dfprop の接続URLの中に[catalog-name]が含まれていて、
DBFluteが明示的な [catalog-name] を認識できるので、
メタデータの [catalog-name] と比較してMainSchemaであることを
判断することができます。
AS400だと、そこがズレちゃってるようで。


<< ということで >>

山本さん、
databaseInfoMap.dfprop にて、

url = ...
catalog = カタログ名 (要はデータベース名)
schema = ...
user = …

というように、catalog を指定して自動生成し直して、
ConditionBeanのSQLを見てみて頂けないでしょうか?
恐らく、これで SQL のテーブル名prefixが無くなるんじゃないかと。

山本学

unread,
Aug 25, 2016, 8:56:06 PM8/25/16
to DBFluteユーザの集い
山本です。

catalogを指定して自動生成し直してSQLを実行したところ、catalogとschemaが出力されなくなりました。

すると、project-schema-xxx.xml 上の 
[catalog-name].[schema-name] の [catalog-name] って、 
どんな値でしょうか?(AS400における何かの名前?) 
私もAS/400は詳しくないのですが、「システム名」というそうです。 

丁寧に対応していただき、ありがとうございました。助かりました。

kubo

unread,
Aug 26, 2016, 12:56:25 AM8/26/16
to DBFluteユーザの集い
jfluteです

> catalogを指定して自動生成し直してSQLを実行したところ、catalogとschemaが出力されなくなりました。

山本さん、確認ありがとうございます。
よかったです。
そして、こちらこそ有用な情報を共有頂きありがとうございます。

> 私もAS/400は詳しくないのですが、「システム名」というそうです。

なるほど、そのシステム名がちょうど、
JDBCのcatalog名として取得されるということなんですね。
(でも、接続URLには別に指定しなくてもいいのに…みたいな^^)


改めて、AS400版のDB2におけるDBFluteのポイントをまとめてみます。

_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
[AS400版のDB2におけるDBFlute]

<< 問題 >>
o メタデータでPK情報が取得できない
 => insert(), update() などが生成されない
o メタデータでFK情報が取得できない
 => setupSelect_[Relation](), query[Relation]() などが生成されない
o CBのSQLのテーブル名がデフォルトで [catalog].[schema].[table] になってしまう
 => 単純にうっとおしいし、本番と名前が違うとつらい

<< 利用方法 >>
o basicInfoMap.dfprop の database を db2 に設定
o databaseInfoMap.dfprop にて catalog 設定を追加 (システム名を指定)
; url = ...
; catalog = カタログ名 (要はデータベース名)
; schema = ...
; user = …
o extlib へ jt400.jar
(https://mvnrepository.com/artifact/net.sf.jt400/jt400) をコピー
o 更新が必要なテーブルについては additionalPrimaryKeyMap.dfprop でPKを定義
o 必要なリレーションシップがあったら additionalForeignKeyMap.dfprop でFKを定義

<< その他 >>
JDBCタスクを実行すると次のようなエラーが発生するが一応利用はできる。
(恐らくDBコメントや、シーケンス周りの自動解決機能が使えないと思われる)
[SQL0204] SYSCATのタイプ*FILEのCOLUMNSが見つからない。
SQL0204] SYSCATのタイプ*FILEのSEQUENCESが見つからない。
_/_/_/_/_/_/_/_/_/_/


よしさんも、
こちらの catalog はしておいた方が良いかと思います。
もし今、CBのSQLのテーブル名が長いのであれば、
まさしく同じ現象が発生していると思われます。

よし

unread,
Aug 29, 2016, 3:49:48 AM8/29/16
to DBFluteユーザの集い
よしです。

ありがとうございます。

2016年8月26日金曜日 13時56分25秒 UTC+9 jflute:
よしさんも、
こちらの catalog はしておいた方が良いかと思います。
もし今、CBのSQLのテーブル名が長いのであれば、
まさしく同じ現象が発生していると思われます。

はい、発生していました。 (笑)

こちらの環境でもcatalogの設定をすることで、データベースとスキーマがSQLから外れました。

ついでにAdditionalSchemaでのtableTargetListの設定が効かない件も直りました。



別件で、一つ問題発生しましたので報告いたします。

like検索で以下のエラーが発生いたしました。

[SQL0414] LIKE述部のオペランドが正しくない。

調べてみますと、AS400のDB2の場合「DBCS フィールド」という、
2バイト文字専用の型の設定ができるようです。
※今回のDBでは「J」が設定されています


この型の項目に対して、like検索をするときに、エスケープ文字の指定(escape '|'のような)
を行うとこのエラーになるようです。


今回の開発では今のところlike検索をする必要が無いのでとりあえず問題はありません。





kubo

unread,
Sep 1, 2016, 12:58:47 AM9/1/16
to DBFluteユーザの集い
jfluteです

> こちらの環境でもcatalogの設定をすることで、データベースとスキーマがSQLから外れました。
> ついでにAdditionalSchemaでのtableTargetListの設定が効かない件も直りました。

なるほど、そーゆーことかーーーーーーーーーー!
よしさん、ご報告ありがとうございます。
もろもろ良かったです。

> [SQL0414] LIKE述部のオペランドが正しくない。
>
> 調べてみますと、AS400のDB2の場合「DBCS フィールド」という、
> 2バイト文字専用の型の設定ができるようです。
> ※今回のDBでは「J」が設定されています
> この型の項目に対して、like検索をするときに、エスケープ文字の指定(escape '|'のような)
> を行うとこのエラーになるようです。

おおぉ、共有ありがとうございます。

回避するとすれば、
new LikeSearchOption().notEscape()
でエスケープしないとか、
As400LikeSearchOption とか継承クラスを自前で作って、
オーバーライドで全角のエスケープ文字になるように細工するとか、
なんとかなりそうな気はします。

もし、必要になった人がいたら、
ということでここに書いておきます。
Reply all
Reply to author
Forward
0 new messages