対応データベースについて

714 views
Skip to first unread message

しゃってん

unread,
Nov 25, 2010, 12:10:48 AM11/25/10
to DBFluteユーザの集い
齊藤(Schatten)です。

DBFluteにはいつもお世話になっております。

DBFluteの対応データベースとしては、以下に記載されているものと認識しています。
http://dbflute.sandbox.seasar.org/ja/environment/supported.html#database

しかしながら、以前のバージョン(~0.8.1)ではSybaseもサポート(選択可能)となっていましたが、
0.8.2以降でSybaseが選択できなくなっていました。
Sybaseのサポート打ち切りについて経緯等があれば教えていただきたいと思います。


上記質問の経緯としては、
新規案件にてデータベースにSybaseIQを利用することとなり、
Sybaseを利用した新規案件においてもDBFluteを利用できればと考えているためです。

現状では以下の環境でコンパイル及び単純なSELECT発行まで行えることが確認ができているため、
過去バージョンでの利用も考えております。
・Java6
・DBFlute-0.8.1
・s2-framework-2.4.43
・s2-extension-2.4.43
・s2-tiger-2.4.43
・s2-dao-1.0.51
・SybaseIQ 15.2 (評価版)
・jconn3d.jar (SybaseIQ 15.2 に付属)
#
# SybaseIQと格闘しつつ評価用の環境構築および動作検証を行っているため
# 限られた環境での動作確認となっております。
# (現時点でReplaceSchemaにおいて一度ですべてのSQLが実行出来ない問題(直接SQLを個別に実行することにより回避可能)がありま
す。)
#


なお、過去資産を参考にSybase対応(必要な機能のみ実装)を当方にて行うことも視野に入れています。

#
# アプリとしてはデータ分析が主となるため、集計関数を使ったSQLを外出しにて実装することが多くなると考えています。
# データの更新処理は別システム(アプリ?)にて行われる想定のためDBFluteを利用しての更新処理はないものと考えています。
# Paging処理は現在のところ想定されていません。(データ量を考えるとfech処理にてファイル出力を行う必要があるかもしれません
が・・・)
#

アドバイス等ありましたらご教授願います。

kubo

unread,
Nov 25, 2010, 6:55:57 AM11/25/10
to dbf...@googlegroups.com
jfluteです。

来ましたね、Sybaseを利用されるのですね。
Sybaseをサポートしていないのは、少なくとも
0.8.xの時代の話ですが、

A. フリーで利用できる環境がない
B. Sybaseを使ってるプロジェクトが極少

だからです。
フリーで利用できるエディションがあればサポートはしやすく、
でも、そうでないにしても Sybase を使ってるプロジェクトが
多くて、jflute自身がプロジェクトで触る機会がある、利用者が
実質的にテスターになる、というのであれば、まだいいのですが、
そうでないものはやはりサポートできない、というところです。
(あと、JDBCドライバのライセンスもどうだったっけかな、
あんまり自由に使えなかったような気が...そこは忘れました)

とはいえ、単にある程度動くか動かないかっていう話であれは、
サポートしているものとサポートしていないの差は紙一重とも言えます。
今、最新版で sybase と指定したらどうなるかは試しました?
「デフォルトDB」という扱いで、ある程度動くか、
どこかでつまずいて落ちてしまうかですが、
サポートしてないDBでも、明示的に例外にしていることは
ないので、Firebird の話と似たような感じにはできなくは
ないと思います。
http://d.hatena.ne.jp/jflute/20101015/1287130707

情報を頂けて、試してもらえるのであれば、
SqlClauseのSybase版とか本体にコミット
するのはOKですよ。

> # (現時点でReplaceSchemaにおいて一度ですべてのSQLが実行出来ない問題
> (直接SQLを個別に実行することにより回避可能)があります。)

これなんでしょうね!?
何か具体的な例外は発生?

2010/11/25 しゃってん <schatt...@gmail.com>:

> --
> このメールは Google グループのグループ「DBFluteユーザの集い」の登録者に送られています。
> このグループに投稿するには、dbf...@googlegroups.com にメールを送信してください。
> このグループから退会するには、dbflute+u...@googlegroups.com にメールを送信してください。
> 詳細については、http://groups.google.com/group/dbflute?hl=ja からこのグループにアクセスしてください。
>
>

kubo

unread,
Nov 25, 2010, 7:03:54 AM11/25/10
to dbf...@googlegroups.com
jfluteです。

ちなみに、自分が昔 DBFlute + Sybase やってたときは、
Sybase は、12.x でした。(確か、恐らく)

えらく苦労したのを覚えています。
特にSQLのパフォーマンスチューニング周り。
簡単にインデックス検索を止めてくれるので、
マッピングの型とかすごく微調整しないと
いけなかったかな。あとは、お約束の
「バインド変数を止めると速くなる」
ConditionBeanの超スーパー非推奨機能の
EmbedCondition はそこから来た機能だったかな。

どうせ、若干サポート( < 準サポート < 正式サポート)
をするなら、15.x 対応にしたいですね。

2010/11/25 kubo <dbf...@gmail.com>:

しゃってん

unread,
Nov 25, 2010, 8:30:49 PM11/25/10
to DBFluteユーザの集い
齊藤(Schatten)です。


> A. フリーで利用できる環境がない
> B. Sybaseを使ってるプロジェクトが極少
回答ありがとうございます。
やはりテスト環境や利用するシーンが限られていると難しいですね。
(癖も多いDBな気もします)

> (あと、JDBCドライバのライセンスもどうだったっけかな、
> あんまり自由に使えなかったような気が...そこは忘れました)
JDBCドライバについてはオープンソースでMSのSQLServerと
共用で利用できるものが公開はされているようです。
(http://jtds.sourceforge.net/)

> 今、最新版で sybase と指定したらどうなるかは試しました?
最新版ではまだ試していないので、これから試してみようと思います。
エンティティの生成ができるようであればなんとかなるかもしれません。

>> # (現時点でReplaceSchemaにおいて一度ですべてのSQLが実行出来ない問題
>> (直接SQLを個別に実行することにより回避可能)があります。)
> これなんでしょうね!?
> 何か具体的な例外は発生?
下記のエラーが出てテーブルのCREATE文が正常終了しないことがありました。
(過去の[DBFLUTE-75]と似た現象なのかもしれません)
#
# 本体に付属のSQLPlus的なツール(Interactive SQL Java)でも複数のCREATE文を一度に実行すると
# エラーで返ってきました。
#
com.sybase.jdbc3.jdbc.SybSQLException: SQL Anywhere -1009170 :
IQ_SYSTEM_MAIN DB
-- (s_blockmap.cxx 3789)
at com.sybase.jdbc3.tds.Tds.a(Unknown Source)
at com.sybase.jdbc3.tds.Tds.nextResult(Unknown Source)
at com.sybase.jdbc3.jdbc.ResultGetter.nextResult(Unknown Source)
at com.sybase.jdbc3.jdbc.SybStatement.nextResult(Unknown Source)
at com.sybase.jdbc3.jdbc.SybStatement.nextResult(Unknown Source)
at com.sybase.jdbc3.jdbc.SybStatement.executeLoop(Unknown Source)
at com.sybase.jdbc3.jdbc.SybStatement.execute(Unknown Source)
at com.sybase.jdbc3.jdbc.SybStatement.execute(Unknown Source)
at
org.seasar.dbflute.helper.jdbc.sqlfile.DfSqlFileRunnerExecute.execSQL(DfSqlFileRunnerExecute.java:
70)
at
org.seasar.dbflute.helper.jdbc.sqlfile.DfSqlFileRunnerBase.runTransaction(DfSqlFileRunnerBase.java:
107)
at
org.seasar.dbflute.helper.jdbc.sqlfile.DfSqlFileFireMan.execute(DfSqlFileFireMan.java:
50)
at
org.seasar.dbflute.task.replaceschema.DfCreateSchemaTask.createSchema(DfCreateSchemaTask.java:
136)
at
org.seasar.dbflute.task.replaceschema.DfCreateSchemaTask.doExecute(DfCreateSchemaTask.java:
48)
at
org.seasar.dbflute.task.bs.DfAbstractTask.execute(DfAbstractTask.java:
83)
at org.apache.tools.ant.UnknownElement.execute(UnknownElement.java:
288)
at sun.reflect.GeneratedMethodAccessor5.invoke(Unknown Source)
at
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:
25)
at java.lang.reflect.Method.invoke(Method.java:597)
at
org.apache.tools.ant.dispatch.DispatchUtils.execute(DispatchUtils.java:
105)
at org.apache.tools.ant.Task.perform(Task.java:348)
at org.apache.tools.ant.Target.execute(Target.java:357)
at org.apache.tools.ant.Target.performTasks(Target.java:385)
at org.apache.tools.ant.Project.executeSortedTargets(Project.java:
1329)
at org.apache.tools.ant.Project.executeTarget(Project.java:1298)
at
org.apache.tools.ant.helper.DefaultExecutor.executeTargets(DefaultExecutor.java:
41)
at org.apache.tools.ant.Project.executeTargets(Project.java:1181)
at org.apache.tools.ant.Main.runBuild(Main.java:698)
at org.apache.tools.ant.Main.startAnt(Main.java:199)
at org.apache.tools.ant.launch.Launcher.run(Launcher.java:257)
at org.apache.tools.ant.launch.Launcher.main(Launcher.java:104)

#
# データベースの作成から勝手がわからず苦労してたりします。
# 他のDBに比べて情報が少ないってのもありますね。
#


On 11月25日, 午後9:03, kubo <dbfl...@gmail.com> wrote:
> jfluteです。
>
> ちなみに、自分が昔 DBFlute + Sybase やってたときは、
> Sybase は、12.x でした。(確か、恐らく)
>
> えらく苦労したのを覚えています。
> 特にSQLのパフォーマンスチューニング周り。
> 簡単にインデックス検索を止めてくれるので、
> マッピングの型とかすごく微調整しないと
> いけなかったかな。あとは、お約束の
> 「バインド変数を止めると速くなる」
> ConditionBeanの超スーパー非推奨機能の
> EmbedCondition はそこから来た機能だったかな。
>
> どうせ、若干サポート( < 準サポート < 正式サポート)
> をするなら、15.x 対応にしたいですね。
>
> 2010/11/25 kubo <dbfl...@gmail.com>:
> > 2010/11/25 しゃってん <schatten4...@gmail.com>:

しゃってん

unread,
Nov 25, 2010, 8:52:58 PM11/25/10
to DBFluteユーザの集い
齊藤(Schatten)です。

最新版(0.9.7.5)にて実行したところDBMeta情報の取得に失敗してしまいます。

以下のようなエラーメッセージが「...Connecting to the database:」の後に出ているため環境が不完全なためなのかもしれ
ません。
# *Failed to get connection meta: JZ0SJ: このデータベース上にメタデータ・アクセサの情報が見つかりませ
ん。
# jConnect マニュアルで説明されている必須テーブルをインストールしてください。
(0.8.1では情報の取得はできていました。)

ひとまず報告まで。

kubo

unread,
Nov 25, 2010, 8:58:28 PM11/25/10
to dbf...@googlegroups.com
jfluteです。

> # *Failed to get connection meta: JZ0SJ: このデータベース上にメタデータ・アクセサの情報が見つかりませ
> ん。
> # jConnect マニュアルで説明されている必須テーブルをインストールしてください。
> (0.8.1では情報の取得はできていました。)

うわー、全然わけわかんないねぇ...
スタックトレースある?
0.8.1からちょっと変わったJDBCメソッドの使い方が、
Sybaseと相性が悪いのかもしれない。(Firebirdのときみたいに)
それがわかれば、if (Sybaseだったら) をやってしまえるのだけど。

あと、0.8.1 のときは、ReplaceSchema は動いてたけどなぁ...
実際のプロジェクトで ReplaceSchema をしっかり活用してた。

2010/11/26 しゃってん <schatt...@gmail.com>:

kubo

unread,
Nov 25, 2010, 10:49:56 PM11/25/10
to dbf...@googlegroups.com
jfluteです。

JZ0SJ は、色々と話題になってるね。
http://groups.google.com/group/sybase.public.sqlanywhere.general/search?q=JZ0SJ&start=10&sa=N&

少なくとも、0.8.1 で動くってことなので、
JDBC直接使ったプログラムを書いて、
Connectionを構築してみるといいかも。
すると、違いがわかってくるかも。

あと、DBFluteにSybase枠を作っておきました。
SqlClause とか DBWay とか。
とりあえず、SQLServerと同じものをコピーして
作っただけど、違う部分があれば修正します。
以下が、とりあえずコピーした状態そのまま。

o Identityの取得 => select @@identity
o ブロックコメント => サポートされている
o ラインコメント => サポートされている
o ScrollableCursor => サポートされている
o 一意制約違反のコード => errorCode が 2627
o ページングの offset 処理
=> サポートされてないのでカーソルのポインタシフト
o ページングの limit 処理 => select top N ...
o 更新ロックの取得 => with (updlock)
o NullsFirst/Last => order by 句で case when 方式

しゃってん

unread,
Nov 25, 2010, 11:03:59 PM11/25/10
to DBFluteユーザの集い
齊藤(Schatten)です。

dbflute.logに出力されている内容を貼り付けます。


2010-11-26 12:52:59,109 [main] INFO
(DfDBFluteTaskUtil#getBuildProperties():82) - ...Using
contextProperties: build.properties
2010-11-26 12:52:59,143 [main] INFO
(DfDBFluteTaskUtil#getBuildProperties():125) - [Build-Properties]:
size=1
2010-11-26 12:52:59,144 [main] INFO
(DfDBFluteTaskUtil#getBuildProperties():127) - torque.project = main
2010-11-26 12:52:59,145 [main] INFO
(DfDBFluteTaskUtil#getBuildProperties():129) -
2010-11-26 12:52:59,358 [main] INFO (DfDataSourceHandler#create():72)
- ...Creating data source:
2010-11-26 12:52:59,359 [main] INFO (DfDataSourceHandler#create():73)
- driver = com.sybase.jdbc3.jdbc.SybDriver
2010-11-26 12:52:59,359 [main] INFO (DfDataSourceHandler#create():74)
- url = jdbc:sybase:Tds:localhost:2638/iqdemo
2010-11-26 12:52:59,360 [main] INFO (DfDataSourceHandler#create():75)
- user = DBA
2010-11-26 12:52:59,429 [main] INFO
(DfDataSourceHandler#createConnection():161) - ...Connecting to the
database:
2010-11-26 12:53:00,116 [main] INFO
(DfDataSourceHandler#processConnectionMetaInfo():219) - *Failed to get
connection meta: JZ0SJ: このデータベース上にメタデータ・アクセサの情報が見つかりません。jConnect マニュアルで
説明されている必須テーブルをインストールしてください。
2010-11-26 12:53:00,119 [main] INFO
(TorqueJDBCTransformTask#doExecute():176) -
2010-11-26 12:53:00,120 [main] INFO
(TorqueJDBCTransformTask#doExecute():177) - ...Starting to process
JDBC to SchemaXML
2010-11-26 12:53:00,120 [main] INFO
(TorqueJDBCTransformTask#doLoadPreviousSchema():969) - ...Loading
previous schema (schema diff process)
2010-11-26 12:53:00,147 [main] INFO
(TorqueJDBCTransformTask#doLoadPreviousSchema():972) - -> no
previous (first time)
2010-11-26 12:53:00,172 [main] INFO
(TorqueJDBCTransformTask#generateXML():229) - ...Instantiate DB-driver
2010-11-26 12:53:00,173 [main] INFO
(TorqueJDBCTransformTask#generateXML():232) - ...Getting DB-connection
2010-11-26 12:53:00,173 [main] INFO
(TorqueJDBCTransformTask#generateXML():235) - ...Getting DB-meta-data
2010-11-26 12:53:00,213 [main] INFO (DfTableHandler#doGetTableList():
68) - ...Getting tables:
2010-11-26 12:53:00,213 [main] INFO (DfTableHandler#doGetTableList():
69) - schema = {DBA as main}
2010-11-26 12:53:00,214 [main] INFO (DfTableHandler#doGetTableList():
70) - types = [TABLE, VIEW]
2010-11-26 12:53:00,269 [main] INFO
(TorqueJDBCTransformTask#generateXML():263) -
2010-11-26 12:53:00,270 [main] INFO
(TorqueJDBCTransformTask#generateXML():264) - $ /= = = = = = = = = = =
= = = = = = = = = = = = = = =
2010-11-26 12:53:00,270 [main] INFO
(TorqueJDBCTransformTask#generateXML():265) - $ [Table List]
2010-11-26 12:53:00,271 [main] INFO
(TorqueJDBCTransformTask#processTable():296) - $
iqdemo.DBA.AUTHOR(TABLE)
2010-11-26 12:53:00,409 [main] ERROR (DfDBFluteTaskUtil#logException():
156) - Look! Read the message below.
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
Failed to execute DBFlute Task 'JDBC'.

[Advice]
Check the exception messages and the stack traces.
* * * * * * * * * */
java.lang.IllegalStateException: java.lang.IllegalStateException:
Look! Read the message below.
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
Unknown schema is NOT supported to use SQL prefix!

[Unified Schema]
{iqdemo.DBA as unknown}
* * * * * * * * * */
at
org.apache.torque.task.TorqueJDBCTransformTask.doExecute(TorqueJDBCTransformTask.java:
210)
at
org.seasar.dbflute.task.bs.DfAbstractTask.execute(DfAbstractTask.java:
91)
at org.apache.tools.ant.UnknownElement.execute(UnknownElement.java:
288)
at sun.reflect.GeneratedMethodAccessor3.invoke(Unknown Source)
at
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:
25)
at java.lang.reflect.Method.invoke(Method.java:597)
at
org.apache.tools.ant.dispatch.DispatchUtils.execute(DispatchUtils.java:
105)
at org.apache.tools.ant.Task.perform(Task.java:348)
at org.apache.tools.ant.Target.execute(Target.java:357)
at org.apache.tools.ant.Target.performTasks(Target.java:385)
at org.apache.tools.ant.Project.executeSortedTargets(Project.java:
1329)
at org.apache.tools.ant.Project.executeTarget(Project.java:1298)
at
org.apache.tools.ant.helper.DefaultExecutor.executeTargets(DefaultExecutor.java:
41)
at org.apache.tools.ant.Project.executeTargets(Project.java:1181)
at org.apache.tools.ant.Main.runBuild(Main.java:698)
at org.apache.tools.ant.Main.startAnt(Main.java:199)
at org.apache.tools.ant.launch.Launcher.run(Launcher.java:257)
at org.apache.tools.ant.launch.Launcher.main(Launcher.java:104)
Caused by: java.lang.IllegalStateException: Look! Read the message
below.
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
Unknown schema is NOT supported to use SQL prefix!

[Unified Schema]
{iqdemo.DBA as unknown}
* * * * * * * * * */
at
org.apache.torque.engine.database.model.UnifiedSchema.throwUnknownSchemaCannotUseSQLPrefixException(UnifiedSchema.java:
219)
at
org.apache.torque.engine.database.model.UnifiedSchema.getSqlPrefixSchema(UnifiedSchema.java:
208)
at
org.apache.torque.engine.database.model.UnifiedSchema.buildSqlName(UnifiedSchema.java:
238)
at
org.seasar.dbflute.logic.jdbc.metadata.info.DfTableMetaInfo.buildTableSqlName(DfTableMetaInfo.java:
83)
at
org.seasar.dbflute.logic.jdbc.handler.DfAutoIncrementHandler.isAutoIncrementColumn(DfAutoIncrementHandler.java:
45)
at
org.apache.torque.task.TorqueJDBCTransformTask.isAutoIncrementColumn(TorqueJDBCTransformTask.java:
751)
at
org.apache.torque.task.TorqueJDBCTransformTask.processAutoIncrement(TorqueJDBCTransformTask.java:
422)
at
org.apache.torque.task.TorqueJDBCTransformTask.processTable(TorqueJDBCTransformTask.java:
324)
at
org.apache.torque.task.TorqueJDBCTransformTask.generateXML(TorqueJDBCTransformTask.java:
269)
at
org.apache.torque.task.TorqueJDBCTransformTask.doExecute(TorqueJDBCTransformTask.java:
188)
... 17 more
2010-11-26 12:53:00,485 [main] INFO (DfDataSourceHandler#destroy():
115) - ...closeReally()
2010-11-26 12:53:00,534 [main] INFO
(DfAbstractTask#showFinalMessage():196) -

_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
[Task End]: 00m01s332ms *Abort

DBFLUTE_CLIENT: {main}
database = sybase
language = java
container = seasar
package = sample.dbflute

DBFLUTE_ENVIRONMENT_TYPE: {df:default}
driver = com.sybase.jdbc3.jdbc.SybDriver
url = jdbc:sybase:Tds:localhost:2638/iqdemo
schema = {DBA as main}
user = DBA
props = {}
additionalSchema =
dataLoadingType = ut
refreshProject =
_/_/_/_/_/_/_/_/_/_/ {JDBC}

kubo

unread,
Nov 25, 2010, 11:28:05 PM11/25/10
to dbf...@googlegroups.com
jfluteです。

お、これは。。。
JZ0SJ は別問題ですね。INFOレベルのログなので、
これが原因で落ちているわけじゃないですね。
DatabaseMetaDataの getDatabaseProductName() とか
getDriverName() など接続情報が取得できなかったようですが、
落ちている原因は別のようですね。

> Unknown schema is NOT supported to use SQL prefix!

databaseInfoMap.dfprop の schema って何を指定してる?
(dbo ?)

2010/11/26 しゃってん <schatt...@gmail.com>:

kubo

unread,
Nov 25, 2010, 11:34:59 PM11/25/10
to dbf...@googlegroups.com
jfluteです。

databaseInfoMap.dfprop で

schema = iqdemo

と指定して試してみてください。

2010/11/26 kubo <dbf...@gmail.com>:

kubo

unread,
Nov 25, 2010, 11:43:23 PM11/25/10
to dbf...@googlegroups.com
jfluteです。

> databaseInfoMap.dfprop で
>
> schema = iqdemo
>
> と指定して試してみてください。

間違えた。iqdemoはカタログ名(データベース名)かな。

schema = DBA

が正しいかな!?

2010/11/26 kubo <dbf...@gmail.com>:

kubo

unread,
Nov 25, 2010, 11:50:22 PM11/25/10
to dbf...@googlegroups.com
jfluteです。

さらにもう一個追加、まとめると:

databaseInfoMap.dfpropにて、

schema = DBA
で試すとどうなるか?
(もしかしたら、多分そうなってるのかな)

さらに
catalog = iqdemo
を追加するとどうなるか?


#
# SQLServer はどうなってたかなぁ...
#

しゃってん

unread,
Nov 25, 2010, 11:58:24 PM11/25/10
to DBFluteユーザの集い
齊藤(Schatten)です。

> databaseInfoMap.dfprop で
> schema = iqdemo
> と指定して試してみてください。

schemaにはDBA(ユーザ名)を指定していました。
(iqdemoはデータベース名なので・・・)

schema = iqdemo とすることでエラーの内容はかわりましたが・・・
テーブルが見つからないとなってしまいますね。

schema = dbo にしたらテーブルリストは取得できましたが・・・
取得できた内容はシステムビューばかりですね。
肝心のテーブルを作成したスキーマの情報は取得できていません。


2010-11-26 13:38:09,720 [main] INFO
(DfDBFluteTaskUtil#getBuildProperties():82) - ...Using
contextProperties: build.properties
2010-11-26 13:38:09,729 [main] INFO
(DfDBFluteTaskUtil#getBuildProperties():125) - [Build-Properties]:
size=1
2010-11-26 13:38:09,729 [main] INFO
(DfDBFluteTaskUtil#getBuildProperties():127) - torque.project = main
2010-11-26 13:38:09,729 [main] INFO
(DfDBFluteTaskUtil#getBuildProperties():129) -
2010-11-26 13:38:09,786 [main] INFO (DfDataSourceHandler#create():72)
- ...Creating data source:
2010-11-26 13:38:09,786 [main] INFO (DfDataSourceHandler#create():73)
- driver = com.sybase.jdbc3.jdbc.SybDriver
2010-11-26 13:38:09,787 [main] INFO (DfDataSourceHandler#create():74)
- url = jdbc:sybase:Tds:localhost:2638/iqdemo
2010-11-26 13:38:09,787 [main] INFO (DfDataSourceHandler#create():75)
- user = DBA
2010-11-26 13:38:09,821 [main] INFO
(DfDataSourceHandler#createConnection():161) - ...Connecting to the
database:
2010-11-26 13:38:10,223 [main] INFO
(DfDataSourceHandler#processConnectionMetaInfo():219) - *Failed to get
connection meta: JZ0SJ: このデータベース上にメタデータ・アクセサの情報が見つかりません。jConnect マニュアルで
説明されている必須テーブルをインストールしてください。
2010-11-26 13:38:10,227 [main] INFO
(TorqueJDBCTransformTask#doExecute():176) -
2010-11-26 13:38:10,227 [main] INFO
(TorqueJDBCTransformTask#doExecute():177) - ...Starting to process
JDBC to SchemaXML
2010-11-26 13:38:10,228 [main] INFO
(TorqueJDBCTransformTask#doLoadPreviousSchema():969) - ...Loading
previous schema (schema diff process)
2010-11-26 13:38:10,241 [main] INFO
(TorqueJDBCTransformTask#doLoadPreviousSchema():972) - -> no
previous (first time)
2010-11-26 13:38:10,258 [main] INFO
(TorqueJDBCTransformTask#generateXML():229) - ...Instantiate DB-driver
2010-11-26 13:38:10,258 [main] INFO
(TorqueJDBCTransformTask#generateXML():232) - ...Getting DB-connection
2010-11-26 13:38:10,259 [main] INFO
(TorqueJDBCTransformTask#generateXML():235) - ...Getting DB-meta-data
2010-11-26 13:38:10,264 [main] INFO (DfTableHandler#doGetTableList():
68) - ...Getting tables:
2010-11-26 13:38:10,265 [main] INFO (DfTableHandler#doGetTableList():
69) - schema = {iqdemo as main}
2010-11-26 13:38:10,265 [main] INFO (DfTableHandler#doGetTableList():
70) - types = [TABLE, VIEW]
2010-11-26 13:38:10,295 [main] INFO
(TorqueJDBCTransformTask#generateXML():263) -
2010-11-26 13:38:10,296 [main] INFO
(TorqueJDBCTransformTask#generateXML():264) - $ /= = = = = = = = = = =
= = = = = = = = = = = = = = =
2010-11-26 13:38:10,296 [main] INFO
(TorqueJDBCTransformTask#generateXML():265) - $ [Table List]
2010-11-26 13:38:10,296 [main] INFO
(TorqueJDBCTransformTask#generateXML():273) - $
2010-11-26 13:38:10,297 [main] INFO
(TorqueJDBCTransformTask#generateXML():274) - $ [Table Count]
2010-11-26 13:38:10,297 [main] INFO
(TorqueJDBCTransformTask#generateXML():275) - $ 0
2010-11-26 13:38:10,297 [main] INFO
(TorqueJDBCTransformTask#generateXML():276) - $ = = = = = = = = = =/
2010-11-26 13:38:10,298 [main] INFO
(TorqueJDBCTransformTask#generateXML():277) -
2010-11-26 13:38:10,311 [main] ERROR (DfDBFluteTaskUtil#logException():
156) - Look! Read the message below.
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
Failed to execute DBFlute Task 'JDBC'.

[Advice]
Check the exception messages and the stack traces.
* * * * * * * * * */
java.lang.IllegalStateException:
org.seasar.dbflute.exception.DfTableNotFoundException: Look! Read the
message below.
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
A table was NOT FOUND in the schema!

[Advice]
Please confirm the database connection settings.
If you've not created the schema yet, please create it.
You can create easily by using replace-schema.
Set up ./playsql/replace-schema.sql and execute ReplaceSchema task.

[Connection Settings]
driver = com.sybase.jdbc3.jdbc.SybDriver
url = jdbc:sybase:Tds:localhost:2638/iqdemo
schema = {iqdemo as main}
user = DBA
Caused by: org.seasar.dbflute.exception.DfTableNotFoundException:
Look! Read the message below.
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
A table was NOT FOUND in the schema!

[Advice]
Please confirm the database connection settings.
If you've not created the schema yet, please create it.
You can create easily by using replace-schema.
Set up ./playsql/replace-schema.sql and execute ReplaceSchema task.

[Connection Settings]
driver = com.sybase.jdbc3.jdbc.SybDriver
url = jdbc:sybase:Tds:localhost:2638/iqdemo
schema = {iqdemo as main}
user = DBA
* * * * * * * * * */
at
org.apache.torque.task.TorqueJDBCTransformTask.throwTableNotFoundException(TorqueJDBCTransformTask.java:
519)
at
org.apache.torque.task.TorqueJDBCTransformTask.generateXML(TorqueJDBCTransformTask.java:
281)
at
org.apache.torque.task.TorqueJDBCTransformTask.doExecute(TorqueJDBCTransformTask.java:
188)
... 17 more
2010-11-26 13:38:10,441 [main] INFO (DfDataSourceHandler#destroy():
115) - ...closeReally()
2010-11-26 13:38:10,458 [main] INFO
(DfAbstractTask#showFinalMessage():196) -

_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
[Task End]: 00m00s712ms *Abort

DBFLUTE_CLIENT: {main}
database = sybase
language = java
container = seasar
package = sample.dbflute

DBFLUTE_ENVIRONMENT_TYPE: {df:default}
driver = com.sybase.jdbc3.jdbc.SybDriver
url = jdbc:sybase:Tds:localhost:2638/iqdemo
schema = {iqdemo as main}

しゃってん

unread,
Nov 26, 2010, 12:07:54 AM11/26/10
to DBFluteユーザの集い
齊藤(Schatten)です。

すれ違いになってました。すいません。
schema = DBA
catalog = iqdemo
でテーブル情報の取得ができました!(@0.9.7.5)

(catalog ってオプションをすっかり見落としていました。。。)


On 11月26日, 午後1:50, kubo <dbfl...@gmail.com> wrote:
> jfluteです。
>
> さらにもう一個追加、まとめると:
>
> databaseInfoMap.dfpropにて、
>
> schema = DBA
> で試すとどうなるか?
> (もしかしたら、多分そうなってるのかな)
>
> さらに
> catalog = iqdemo
> を追加するとどうなるか?
>
> #
> # SQLServer はどうなってたかなぁ...
> #
>
> 2010/11/26 kubo <dbfl...@gmail.com>:
>
> > jfluteです。
>
> >> databaseInfoMap.dfprop で
>
> >> schema = iqdemo
>
> >> と指定して試してみてください。
>
> > 間違えた。iqdemoはカタログ名(データベース名)かな。
>
> > schema = DBA
>
> > が正しいかな!?
>
> > 2010/11/26 kubo <dbfl...@gmail.com>:
> >> jfluteです。
>
> >> databaseInfoMap.dfprop で
>
> >> schema = iqdemo
>
> >> と指定して試してみてください。
>
> >> 2010/11/26 kubo <dbfl...@gmail.com>:
> >>> jfluteです。
>
> >>> お、これは。。。
> >>> JZ0SJ は別問題ですね。INFOレベルのログなので、
> >>> これが原因で落ちているわけじゃないですね。
> >>> DatabaseMetaDataの getDatabaseProductName() とか
> >>> getDriverName() など接続情報が取得できなかったようですが、
> >>> 落ちている原因は別のようですね。
>
> >>>> Unknown schema is NOT supported to use SQL prefix!
>
> >>> databaseInfoMap.dfprop の schema って何を指定してる?
> >>> (dbo ?)
>
> >>> 2010/11/26 しゃってん <schatten4...@gmail.com>:

kubo

unread,
Nov 26, 2010, 12:35:15 AM11/26/10
to dbf...@googlegroups.com
jfluteです。

おお、なるほど状況がわかった。

サポートされているDBMSでは、
catalog オプションは指定しなくてもURLから自動判別するけど、
Sybaseには対応していないのでうまくいかないようだ。
かつ、Sybaseが catalog の概念を持っていたと。
(catalog の概念のないDBMSも多いので)

とりあえず、それで試しておいて下さい。
後で、catalog 指定なしでも動くようにしますね。

jdbc:sybase:Tds:localhost:2638/iqdemo

なるほど、こういう形式なのね。

2010/11/26 しゃってん <schatt...@gmail.com>:

kubo

unread,
Nov 26, 2010, 1:35:43 AM11/26/10
to dbf...@googlegroups.com
jfluteです。

Schattenさん

catalog についてドキュメントでも触れるようにしておきました。

// databaseInfoMap - catalog | DBFlute
http://dbflute.sandbox.seasar.org/ja/manual/reference/dfprop/databaseinfo/index.html#catalog

// SQLSerer - データベース接続設定 | DBFlute
http://dbflute.sandbox.seasar.org/ja/manual/reference/dbway/sqlserver/index.html#setting

そして、DBFlute-0.9.7.6-10-SNAPSHOT で以下反映しました。

o catalog 設定なしでもURLから自動判別
o Sybase用の SqlClause と DBWay
o 今回の現象が発生したときの例外メッセージをもちょいリッチに

以下の情報がわかったら教えて頂けると助かります。

[Sybase仕様] ※今のところSQLServerのコピー

しゃってん

unread,
Nov 26, 2010, 2:39:51 AM11/26/10
to DBFluteユーザの集い
齊藤(Schatten)です。

いろいろ試してみてます。

DBFlute-0.9.7.5に初期状態で格納されているDDLがほぼそのまま実行できました。
(テーブルスペースが足りないみたいなエラーはでましたが・・・)

上記を踏まえ現状で判明した点をいくつか。
Commentを付与するSQL文はOracleのものと同じ。
コメントの取得ができるが文字化けが発生。

identity が指定されているカラムの情報が
schemaのxml にdefault="autoincrement" として出力される。
↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓

<column comment="??ID: ??" dbType="int" default="autoincrement"
javaType="Integer" name="MEMBER_ID" pkName="MEMBER_ID"
primaryKey="true" required="true" size="10" type="INTEGER"/>

↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑
# コメントが文字化けしてるのは文字コードがあっていないせいかと思いますが・・・
# (DB側の文字コードはCHAR文字セットエンコードがISO_8859-1:1987でNCHAR文字セットエンコードがUTF-8)
# (同封されていたデモDB以外が起動できていないため文字コードの変更ができていません。)

[Sybase仕様]は少しずつになるかとは思いますが徐々に調べてみます。
> o Identityの取得 => select @@identity
Identityは上記でOKだと思います。(ドキュメントに記載あり)
http://infocenter.sybase.com/help/topic/com.sybase.infocenter.dc01135.1520/pdf/iqrefbb_ja.pdf


On 11月26日, 午後3:35, kubo <dbfl...@gmail.com> wrote:
> jfluteです。
>
> Schattenさん
>
> catalog についてドキュメントでも触れるようにしておきました。
>
> // databaseInfoMap - catalog | DBFlutehttp://dbflute.sandbox.seasar.org/ja/manual/reference/dfprop/database...
>
> // SQLSerer - データベース接続設定 | DBFlutehttp://dbflute.sandbox.seasar.org/ja/manual/reference/dbway/sqlserver...

しゃってん

unread,
Nov 26, 2010, 3:58:36 AM11/26/10
to DBFluteユーザの集い
齊藤(Schatten)です。

> そして、DBFlute-0.9.7.6-10-SNAPSHOT で以下反映しました。
試してみました。

JDBCタスクにてエラーが発生するようになりました。
Identityの情報を取得しようとしてる際に発生しているように思えます。

#
# 以下スタックトレースを貼り付けます。
#
2010-11-26 17:54:04,177 [main] INFO


(DfDBFluteTaskUtil#getBuildProperties():82) - ...Using
contextProperties: build.properties

2010-11-26 17:54:04,184 [main] INFO


(DfDBFluteTaskUtil#getBuildProperties():125) - [Build-Properties]:
size=1

2010-11-26 17:54:04,185 [main] INFO


(DfDBFluteTaskUtil#getBuildProperties():127) - torque.project = main

2010-11-26 17:54:04,185 [main] INFO
(DfDBFluteTaskUtil#getBuildProperties():129) -
2010-11-26 17:54:04,250 [main] INFO (DfDataSourceHandler#create():72)
- ...Creating data source:
2010-11-26 17:54:04,250 [main] INFO (DfDataSourceHandler#create():73)
- driver = com.sybase.jdbc3.jdbc.SybDriver
2010-11-26 17:54:04,251 [main] INFO (DfDataSourceHandler#create():74)


- url = jdbc:sybase:Tds:localhost:2638/iqdemo

2010-11-26 17:54:04,251 [main] INFO (DfDataSourceHandler#create():75)
- user = DBA
2010-11-26 17:54:04,285 [main] INFO


(DfDataSourceHandler#createConnection():161) - ...Connecting to the
database:

2010-11-26 17:54:04,681 [main] INFO


(DfDataSourceHandler#processConnectionMetaInfo():219) - *Failed to get
connection meta: JZ0SJ: このデータベース上にメタデータ・アクセサの情報が見つかりません。jConnect マニュアルで
説明されている必須テーブルをインストールしてください。

2010-11-26 17:54:04,684 [main] INFO
(TorqueJDBCTransformTask#doExecute():176) -
2010-11-26 17:54:04,685 [main] INFO


(TorqueJDBCTransformTask#doExecute():177) - ...Starting to process
JDBC to SchemaXML

2010-11-26 17:54:04,685 [main] INFO


(TorqueJDBCTransformTask#doLoadPreviousSchema():969) - ...Loading
previous schema (schema diff process)

2010-11-26 17:54:04,708 [main] INFO (DTDResolver#resolveEntity():123)
- ...Resolving XML by database.dtd in same package
2010-11-26 17:54:04,793 [main] INFO


(TorqueJDBCTransformTask#generateXML():229) - ...Instantiate DB-driver

2010-11-26 17:54:04,793 [main] INFO


(TorqueJDBCTransformTask#generateXML():232) - ...Getting DB-connection

2010-11-26 17:54:04,794 [main] INFO


(TorqueJDBCTransformTask#generateXML():235) - ...Getting DB-meta-data

2010-11-26 17:54:04,796 [main] INFO (DfTableHandler#doGetTableList():
68) - ...Getting tables:
2010-11-26 17:54:04,797 [main] INFO (DfTableHandler#doGetTableList():
69) - schema = {iqdemo.DBA as main}
2010-11-26 17:54:04,797 [main] INFO (DfTableHandler#doGetTableList():


70) - types = [TABLE, VIEW]

2010-11-26 17:54:04,833 [main] INFO
(TorqueJDBCTransformTask#generateXML():263) -
2010-11-26 17:54:04,833 [main] INFO


(TorqueJDBCTransformTask#generateXML():264) - $ /= = = = = = = = = = =
= = = = = = = = = = = = = = =

2010-11-26 17:54:04,834 [main] INFO


(TorqueJDBCTransformTask#generateXML():265) - $ [Table List]

2010-11-26 17:54:04,834 [main] INFO
(TorqueJDBCTransformTask#processTable():296) - $
iqdemo.DBA.MEMBER(TABLE)
2010-11-26 17:54:04,885 [main] ERROR (DfDBFluteTaskUtil#logException():


156) - Look! Read the message below.
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
Failed to execute DBFlute Task 'JDBC'.

[Advice]
Check the exception messages and the stack traces.
* * * * * * * * * */
java.lang.IllegalStateException:

org.seasar.dbflute.exception.DfJDBCException: Look! Read the message


below.
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *

Failed to execute the SQL for getting auto-increment!

[SQL]
select MEMBER_ID from null where 0 = 1
SQL Anywhere -131 : 'null' 1

* * * * * * * * * */
at
org.apache.torque.task.TorqueJDBCTransformTask.doExecute(TorqueJDBCTransformTask.java:
210)
at
org.seasar.dbflute.task.bs.DfAbstractTask.execute(DfAbstractTask.java:

93)


at org.apache.tools.ant.UnknownElement.execute(UnknownElement.java:
288)
at sun.reflect.GeneratedMethodAccessor3.invoke(Unknown Source)
at
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:
25)
at java.lang.reflect.Method.invoke(Method.java:597)
at
org.apache.tools.ant.dispatch.DispatchUtils.execute(DispatchUtils.java:
105)
at org.apache.tools.ant.Task.perform(Task.java:348)
at org.apache.tools.ant.Target.execute(Target.java:357)
at org.apache.tools.ant.Target.performTasks(Target.java:385)
at org.apache.tools.ant.Project.executeSortedTargets(Project.java:
1329)
at org.apache.tools.ant.Project.executeTarget(Project.java:1298)
at
org.apache.tools.ant.helper.DefaultExecutor.executeTargets(DefaultExecutor.java:
41)
at org.apache.tools.ant.Project.executeTargets(Project.java:1181)
at org.apache.tools.ant.Main.runBuild(Main.java:698)
at org.apache.tools.ant.Main.startAnt(Main.java:199)
at org.apache.tools.ant.launch.Launcher.run(Launcher.java:257)
at org.apache.tools.ant.launch.Launcher.main(Launcher.java:104)

Caused by: org.seasar.dbflute.exception.DfJDBCException: Look! Read


the message below.
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *

Failed to execute the SQL for getting auto-increment!

[SQL]
select MEMBER_ID from null where 0 = 1
SQL Anywhere -131 : 'null' 1

* * * * * * * * * */
at

org.seasar.dbflute.logic.jdbc.handler.DfAutoIncrementHandler.isAutoIncrementColumn(DfAutoIncrementHandler.java:
69)


at
org.apache.torque.task.TorqueJDBCTransformTask.isAutoIncrementColumn(TorqueJDBCTransformTask.java:
751)
at
org.apache.torque.task.TorqueJDBCTransformTask.processAutoIncrement(TorqueJDBCTransformTask.java:
422)
at
org.apache.torque.task.TorqueJDBCTransformTask.processTable(TorqueJDBCTransformTask.java:
324)
at
org.apache.torque.task.TorqueJDBCTransformTask.generateXML(TorqueJDBCTransformTask.java:
269)
at
org.apache.torque.task.TorqueJDBCTransformTask.doExecute(TorqueJDBCTransformTask.java:
188)
... 17 more

2010-11-26 17:54:04,957 [main] INFO (DfDataSourceHandler#destroy():
115) - ...closeReally()
2010-11-26 17:54:04,969 [main] INFO
(DfAbstractTask#showFinalMessage():198) -

_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
[Task End]: 00m00s771ms *Abort

DBFLUTE_CLIENT: {main}
database = sybase
language = java
container = seasar
package = sample.dbflute

DBFLUTE_ENVIRONMENT_TYPE: {df:default}
driver = com.sybase.jdbc3.jdbc.SybDriver
url = jdbc:sybase:Tds:localhost:2638/iqdemo

schema = {iqdemo.DBA as main}

kubo

unread,
Nov 26, 2010, 4:36:07 AM11/26/10
to dbf...@googlegroups.com
jfluteです。

うおっっと、ごめん、これはケアレスミスでした。
ランタイムは変わらず(10-SNAPSHOT)で、
モジュールは、11-SNAPSHOTを出しました。

2010/11/26 しゃってん <schatt...@gmail.com>:

kubo

unread,
Nov 26, 2010, 4:51:57 AM11/26/10
to dbf...@googlegroups.com
jfluteです。

> DB側の文字コードはCHAR文字セットエンコードがISO_8859-1:1987
> でNCHAR文字セットエンコードがUTF-8

ISO_8859 だと、そもそも普通に登録した
日本語データが検索で全部化けなちゃわないかな!?
(どうなんだろう、そんなのやったことない...)

しゃってん

unread,
Nov 26, 2010, 5:26:04 AM11/26/10
to DBFluteユーザの集い
齊藤(Schatten)です。

> ISO_8859 だと、そもそも普通に登録した
> 日本語データが検索で全部化けなちゃわないかな!?
すいません、その通りです。そもそもDB登録時に文字化けしていました。

> モジュールは、11-SNAPSHOTを出しました。
試してみました。
無事、正常終了するようになりました。

<table name="MEMBER" schema="iqdemo.DBA" type="TABLE">
<column dbType="int" default="autoincrement" javaType="Integer"
name="MEMBER_ID" pkName="MEMBER_ID" primaryKey="true"
required="true" size="10" type="INTEGER"/>
・・・
# CREATE TABLE MEMBER
# (
# MEMBER_ID INTEGER IDENTITY NOT NULL PRIMARY KEY,
# ・・・・
# );

カラムの情報として「autoIncrement="true" 」が出力されず、「default="autoincrement"」となってしまい
ますね。
#
# データベース側のカラム情報を付属のブラウザで見ると「デフォルト値」の部分に「システム定義-autoIncrement」が設定されていま
す。
# 「デフォルト値」の部分は他に「ユーザ定義」(通常のデフォルト指定情報?)と「システム定義-global autoIncrement」が存
在しています。
#
デフォルト値が「autoincrement」の場合には、「autoIncrement="true" 」とするようにできますでしょうか?

しゃってん

unread,
Nov 26, 2010, 5:38:56 AM11/26/10
to DBFluteユーザの集い
齊藤(Schatten)です。

ちょっと余談ですが。。。

いろいろテストを行っていて驚いたのですが・・・
SybaseでNull許可のカラムを作成する場合には明示的に「NULL」と宣言しないといけないのですね。
何も付けない場合(デフォルト)は「NOT NULL」が付与されているカラムとして処理されてしまいました。
データベースの設定によるものかもしれませんが不思議な感じがしています。

kubo

unread,
Nov 26, 2010, 5:56:41 AM11/26/10
to dbf...@googlegroups.com
jfluteです。

> デフォルト値が「autoincrement」の場合には、「autoIncrement="true" 」とするようにできますでしょうか?

なるほど、りょうかいです。
Sybase が ResultSetMetaData の方で AutoIncrement 情報を
取得できないってことのようですね。

それでは、if (Sybaseだったら) の第一弾いきますね。
DBFlute-0.9.7.6-12-SNAPSHOT を出しました。
(モジュールだけ)

> いろいろテストを行っていて驚いたのですが・・・
> SybaseでNull許可のカラムを作成する場合には明示的に「NULL」と宣言しないといけないのですね。
> 何も付けない場合(デフォルト)は「NOT NULL」が付与されているカラムとして処理されてしまいました。
> データベースの設定によるものかもしれませんが不思議な感じがしています。

ほー。それはちょっと良い心掛けかもしんない。
NotNull なのに、NotNull を付けないで作ってしまう方が
圧倒的に多いと思うので、デフォルトは NotNull で、
Null を許すなら明示的にね、ってのはいいね。

最初からそうなってないとできないことだと思うので、
もう他の DBMS がそうしようともできないことだけど...

2010/11/26 しゃってん <schatt...@gmail.com>:

kubo

unread,
Nov 27, 2010, 8:39:49 AM11/27/10
to dbf...@googlegroups.com
jfluteです。

DBFlute-0.9.7.6-13-SNAPSHOT を出しました。
来週のリリースを想定してちょっと整理しました。

一意制約違反エラーは、誤動作しても面白くないので、
とりあえずはサポートなし実装にして、一意制約違反エラーの
SQLState or エラーコードが分かり次第対応。
=> 一意制約違反起こして、SQLExceptionを探る

その他は、間違ってたら動かないはずので推測で実装。

更新ロック -> とりあえず "for update" で
=> lockForUpdate()のメソッドを呼んで落ちなければOK

ページングの limit 処理 -> とりあえず "top N" で
カーソルが Scrollable かどうか -> とりあえず true で
=> CBのページングがうまく動作すればOK

NullsFirst/Last は、恐らくサポートしてないと
思われるので OrderBy での CaseWhen 方式で実装。
=> withNullsFirst() を呼んで落ちなければOK

もし、動かせるようであれば、上記を試して情報頂ければ、
次のバージョンに間に合うようにします。

しゃってん

unread,
Nov 28, 2010, 9:45:25 PM11/28/10
to DBFluteユーザの集い
齊藤(Schatten)です。

遅くなりましたがDBFlute-0.9.7.6-13-SNAPSHOTにて以下を簡単にですが動かしてみました。

> => 一意制約違反起こして、SQLExceptionを探る
ErrorCode:21
で返ってきました。

> 更新ロック -> とりあえず "for update" で
> => lockForUpdate()のメソッドを呼んで落ちなければOK
SQLは落ちずに正常終了。(本当にロックされているかは未検証)

> ページングの limit 処理 -> とりあえず "top N" で
> カーソルが Scrollable かどうか -> とりあえず true で
> => CBのページングがうまく動作すればOK
意図した値が正常に取得できました。


> NullsFirst/Last は、恐らくサポートしてないと
> 思われるので OrderBy での CaseWhen 方式で実装。
> => withNullsFirst() を呼んで落ちなければOK
落ちずに正常終了(取得データ未検証)

#
# ReplaceSchema にてOUT_OF_DBSPACE 的なエラーの解消方法が分からず苦戦しているため
# 細かいデータ検証までは行えていません。
# (評価版に付属のデモ用データベース設定が原因な気はしますが・・・?)
# 正規環境が整い次第再度テストを行ってみます。
#

kubo

unread,
Nov 28, 2010, 10:28:18 PM11/28/10
to dbf...@googlegroups.com
jfluteです。

Schattenさん、ありがとうございます。
わかった情報を反映した DBFlute-0.9.7.6-14-SNAPSHOT を出しました。

>>  => 一意制約違反起こして、SQLExceptionを探る
> ErrorCode:21
> で返ってきました。

了解です。
ErrorCode == 21 で EntityAlreadyExistsException にしておきました。
別の制約エラーでも 21 だったら悲しいけど、Sybase を信用しようかなw
(よければ、FK違反やNotNull違反も試して違う値であることを確認できればと)

>> 更新ロック -> とりあえず "for update" で
>>  => lockForUpdate()のメソッドを呼んで落ちなければOK
> SQLは落ちずに正常終了。(本当にロックされているかは未検証)
>
>> ページングの limit 処理 -> とりあえず "top N" で
>> カーソルが Scrollable かどうか -> とりあえず true で
>>  => CBのページングがうまく動作すればOK
> 意図した値が正常に取得できました。

了解です。
この辺は、「そういうSQL」が発行されていればOKとしましょう。
そこまでやっておいて、実はエラーにもならず動きもしない、
なんていったら Sybase 信用できないよねw

> # ReplaceSchema にてOUT_OF_DBSPACE 的なエラーの解消方法が分からず苦戦しているため
> # 細かいデータ検証までは行えていません。
> # (評価版に付属のデモ用データベース設定が原因な気はしますが・・・?)
> # 正規環境が整い次第再度テストを行ってみます。

なるほど、ややこしそうだね。
http://infocenter.sybase.com/help/index.jsp?topic=/com.sybase.infocenter.dc00171.1500/html/iqnew/CEGGHFJG.htm
Sybase IQ 15.0 からの話っぽいね。
(だから、自分が Sybase 12.x でやってたときに
聞いたことないエラーなのかも)

2010/11/29 しゃってん <schatt...@gmail.com>:

しゃってん

unread,
Nov 29, 2010, 6:13:44 AM11/29/10
to DBFluteユーザの集い
齊藤(Schatten)です。

ちょっと残念なお知らせが・・・
(ランタイムのみ0.9.7.6-14-SNAPSHOTに変更での結果ですが。)

> 別の制約エラーでも 21 だったら悲しいけど、Sybase を信用しようかなw
> (よければ、FK違反やNotNull違反も試して違う値であることを確認できればと)
について、ErrorCodeはすべて「21」のようです。
SQLStateがそれぞれ
・一意制約違反 => QGA03
・FK違反 => QSB48
・NotNull違反 => QDB51
となっていました。

#
# DBFluteとは関係ないですが、SQL発行時のエラーで以下のログが気になりました。
# @s2-framework-2.4.43
## [SQLException]
## org.seasar.framework.exception.SSQLException
## [ESSR0072]SQLで例外(SQL=[insert into MEMBER (MEMBER_NAME,
MEMBER_ACCOUNT, MEMBER_STATUS_CODE, REGISTER_DATETIME,
## REGISTER_USER, REGISTER_PROCESS, UPDATE_DATETIME, UPDATE_USER,
UPDATE_PROCESS, VERSION_NO)
## values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)], Message=[21],
ErrorCode=QSB48, SQLState={3})が発生しました
#
# メッセージの置換場所が一つずつずれていたりします。
# (これって他のDBMSの場合は正常に埋まっていましたっけ?)
#

それにしてもSybaseって扱い辛いですね;

デモ用データベースサーバインスタンス上にデータベースサービスは作れたのですが、
JDBCタスクにてUKが存在しないテーブルのUK情報検索時にエラーとなってしまいました。
(本体付属のデモ用データベースサービスでは起きていません。)
データベースの設定やプロシジャの構成に違いがありそうなので、それが原因だと思いますが・・・
(JDBCドライバがDBMeta情報を取得する際に内部でプロシジャをコールしてるようなスタックトレースが出てたりします。)
エラーが発生するときとしないときでの差を探してみます。
(JDBCが利用してるプロシジャのインストールを行っていないためと思いますが。)

2010-11-29 18:56:33,637 [main] INFO
(TorqueJDBCTransformTask#generateXML():265) - $ [Table List]
2010-11-29 18:56:33,637 [main] INFO
(TorqueJDBCTransformTask#processTable():296) - $
sample.DBA.MEMBER(TABLE)
2010-11-29 18:56:33,783 [main] INFO
(TorqueJDBCTransformTask#processTable():296) - $
sample.DBA.MEMBER_ADDRESS(TABLE)
2010-11-29 18:56:33,879 [main] INFO
(TorqueJDBCTransformTask#processTable():296) - $
sample.DBA.MEMBER_LOGIN(TABLE)
2010-11-29 18:56:33,953 [main] INFO
(TorqueJDBCTransformTask#processTable():296) - $
sample.DBA.MEMBER_SECURITY(TABLE)
2010-11-29 18:56:34,022 [main] ERROR (DfDBFluteTaskUtil#logException():
156) - Look! Read the message below.
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
Failed to execute DBFlute Task 'JDBC'.

[Advice]
Check the exception messages and the stack traces.
* * * * * * * * * */
java.lang.IllegalStateException:
com.sybase.jdbc3.jdbc.SybSQLException: RAISERROR が実行されました : There is
no object with the specified owner/name combination
Caused by: com.sybase.jdbc3.jdbc.SybSQLException: RAISERROR が実行されました :
There is no object with the specified owner/name combination

at com.sybase.jdbc3.tds.Tds.a(Unknown Source)
at com.sybase.jdbc3.tds.Tds.nextResult(Unknown Source)
at com.sybase.jdbc3.jdbc.ResultGetter.nextResult(Unknown Source)
at com.sybase.jdbc3.jdbc.SybStatement.nextResult(Unknown Source)
at com.sybase.jdbc3.jdbc.SybStatement.nextResult(Unknown Source)
at com.sybase.jdbc3.jdbc.SybStatement.queryLoop(Unknown Source)
at com.sybase.jdbc3.jdbc.SybCallableStatement.executeQuery(Unknown
Source)
at com.sybase.jdbc3.jdbc.SybDatabaseMetaData.if(Unknown Source)
at com.sybase.jdbc3.jdbc.SybDatabaseMetaData.getIndexInfo(Unknown
Source)
at
org.seasar.dbflute.logic.jdbc.handler.DfUniqueKeyHandler.doGetUniqueKeyMap(DfUniqueKeyHandler.java:
214)
at
org.seasar.dbflute.logic.jdbc.handler.DfUniqueKeyHandler.getUniqueKeyMap(DfUniqueKeyHandler.java:
196)
at
org.seasar.dbflute.logic.jdbc.handler.DfUniqueKeyHandler.getUniqueKeyMap(DfUniqueKeyHandler.java:
181)
at
org.apache.torque.task.TorqueJDBCTransformTask.getUniqueKeyMap(TorqueJDBCTransformTask.java:
730)
at
org.apache.torque.task.TorqueJDBCTransformTask.processUniqueKey(TorqueJDBCTransformTask.java:
455)
at
org.apache.torque.task.TorqueJDBCTransformTask.processTable(TorqueJDBCTransformTask.java:
330)
at
org.apache.torque.task.TorqueJDBCTransformTask.generateXML(TorqueJDBCTransformTask.java:
269)
at
org.apache.torque.task.TorqueJDBCTransformTask.doExecute(TorqueJDBCTransformTask.java:
188)
... 17 more
2010-11-29 18:56:34,101 [main] INFO (DfDataSourceHandler#destroy():
115) - ...closeReally()
2010-11-29 18:56:34,115 [main] INFO
(DfAbstractTask#showFinalMessage():198) -

_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
[Task End]: 00m01s081ms *Abort

DBFLUTE_CLIENT: {main}
database = sybase
language = java
container = seasar
package = sample.dbflute

DBFLUTE_ENVIRONMENT_TYPE: {df:default}
driver = com.sybase.jdbc3.jdbc.SybDriver
url = jdbc:sybase:Tds:localhost:2638/sample
schema = {sample.DBA as main}
user = DBA
props = {SERVICENAME=sample}
additionalSchema =
dataLoadingType = ut
refreshProject =
_/_/_/_/_/_/_/_/_/_/ {JDBC}

> なるほど、ややこしそうだね。http://infocenter.sybase.com/help/index.jsp?topic=/com.sybase.infocen...
> Sybase IQ 15.0 からの話っぽいね。
> (だから、自分が Sybase 12.x でやってたときに
> 聞いたことないエラーなのかも)
>
> 2010/11/29 しゃってん <schatten4...@gmail.com>:

kubo

unread,
Nov 29, 2010, 6:34:27 AM11/29/10
to dbf...@googlegroups.com
jfluteです。

>> 別の制約エラーでも 21 だったら悲しいけど、Sybase を信用しようかなw
>> (よければ、FK違反やNotNull違反も試して違う値であることを確認できればと)
> について、ErrorCodeはすべて「21」のようです。
> SQLStateがそれぞれ
> ・一意制約違反 => QGA03
> ・FK違反 => QSB48
> ・NotNull違反 => QDB51
> となっていました。

わーいw、ありがとう。
SQLStateの "QGA03" を使うようにしました。

こちら DBFlute-0.9.7.6-RC4 にて反映しました。
モジュールとランタイム両方反映が必要です。
(いよいよ大詰め)

> ErrorCode=QSB48, SQLState={3})が発生しました
> #
> # メッセージの置換場所が一つずつずれていたりします。
> # (これって他のDBMSの場合は正常に埋まっていましたっけ?)

ずれてる、っぽい...(h2 と oracle で試した)
色々と落ち着いたらフィードバックしてみるといいかも。

> デモ用データベースサーバインスタンス上にデータベースサービスは作れたのですが、
> JDBCタスクにてUKが存在しないテーブルのUK情報検索時にエラーとなってしまいました。
> (本体付属のデモ用データベースサービスでは起きていません。)
> データベースの設定やプロシジャの構成に違いがありそうなので、それが原因だと思いますが・・・
> (JDBCドライバがDBMeta情報を取得する際に内部でプロシジャをコールしてるようなスタックトレースが出てたりします。)
> エラーが発生するときとしないときでの差を探してみます。
> (JDBCが利用してるプロシジャのインストールを行っていないためと思いますが。)

ややこしいねぇ...がんばれー

しゃってん

unread,
Nov 30, 2010, 3:12:04 AM11/30/10
to DBFluteユーザの集い
齊藤(Schatten)です。

遅くなりましたがDBFlute-0.9.7.6-RC4にて、
対応していただいた内容を確認いたしました。

一意制約違反のみEntityAlreadyExistsExceptionをスロー、
その他の制約違反はSQLFailureExceptionとなりました。
その他のSQL発行もエラーなしで実行出来ました。

いろいろと試してる中で、catalog を url から取得できるようにしていただきましたが、
明示的に指定するほうがいいかもしれないことに気がつきました。
(直前ですいません。)
理由は、URLにその他のパラメータを付与することが可能であったり、
マシン上にデータベースサービスが1つのみの場合、データベース名の指定を省略できてしまうためです。
(データベース名を省略したところ、ポート番号がカタログ名に出力されてしまいました。)

kubo

unread,
Nov 30, 2010, 3:54:08 AM11/30/10
to dbf...@googlegroups.com
jfluteです。

> 一意制約違反のみEntityAlreadyExistsExceptionをスロー、
> その他の制約違反はSQLFailureExceptionとなりました。
> その他のSQL発行もエラーなしで実行出来ました。

ありがとう!

> いろいろと試してる中で、catalog を url から取得できるようにしていただきましたが、
> 明示的に指定するほうがいいかもしれないことに気がつきました。
> (直前ですいません。)
> 理由は、URLにその他のパラメータを付与することが可能であったり、
> マシン上にデータベースサービスが1つのみの場合、データベース名の指定を省略できてしまうためです。
> (データベース名を省略したところ、ポート番号がカタログ名に出力されてしまいました。)

なるほど。
パラメータは付与されても大丈夫なはず(考慮して実装してるはず)。

jdbc:sybase:Tds:localhost:2638/exampledb&charSet=UTF-8
jdbc:sybase:Tds:localhost:5432/exampledb?charSet=UTF-8

テストでは、上記どちらでも exampledb を抽出できています。

ただ、省略はやっかいだね。まあ、したら sybase の場合は、
とりあえず catalog を明示的に指定していた方が確実、って扱いで。


したら、日付変わったらリリースされる予定です。
また、何かあれば、それは次のバージョンのSNAPSHOTにて。


2010/11/30 しゃってん <schatt...@gmail.com>:

kubo

unread,
Nov 30, 2010, 3:58:41 AM11/30/10
to dbf...@googlegroups.com
jfluteです。

> パラメータは付与されても大丈夫なはず(考慮して実装してるはず)。
>
> jdbc:sybase:Tds:localhost:2638/exampledb&charSet=UTF-8
> jdbc:sybase:Tds:localhost:5432/exampledb?charSet=UTF-8
>
> テストでは、上記どちらでも exampledb を抽出できています。

余談。実装はこんな感じ。

final String pureUrl = Srl.substringFirstFront(_url, ";", "?", "&");
final String catalog = Srl.substringLastRear(pureUrl, "/", ":");
return !catalog.equals(pureUrl) ? catalog : null;

kubo

unread,
Nov 30, 2010, 11:19:18 AM11/30/10
to dbf...@googlegroups.com
jfluteです。

RC4 そのままで、DBFlute-0.9.7.6 をリリースしました。
さて、この後 Sybase でどんなびっくりが待っていることやら...

2010/11/30 kubo <dbf...@gmail.com>:

しゃってん

unread,
Nov 30, 2010, 11:32:42 PM11/30/10
to DBFluteユーザの集い
齊藤(Schatten)です。

DBFlute-0.9.7.6試しました。
対応ありがとうございます。

> java.lang.IllegalStateException:
> com.sybase.jdbc3.jdbc.SybSQLException: RAISERROR が実行されました : There is
> no object with the specified owner/name combination
JDBCタスクにて上記エラーが発生するのは解消されていませんが原因がつかめました。
データベース作成時のオプションでCaseSensitiveというのがあるのですが、
このパラメータの違いにより発生していました。

処理的には、DfUniqueKeyHandlerのgetUniqueKeyMapで
ユニークキーを取得する際に対象テーブルのUKが0件だった場合、
テーブル名をLowerCase及びUpperCaseして検索する部分で
存在しないテーブル名(大文字小文字を区別)が指定されるとSQLExceptionが発生するみたいです。
(FKの取得でも同様)

# JDBCがインデックス情報取得時に利用しているプロシジャに以下の記述を見つけました。
# if(select count() from dbo.sysobjects
# where user_name(uid) like @table_owner escape '\\'
# and name = @table_name) = 0
# begin
# raiserror 17208
# 'There is no object with the specified owner/name combination'
# return(1)
# end
# なんともおせっかいな・・・(エラーとせず0件で返してほしいものです。)

で、CaseSensittiveの値を「off」に変更するとデータ上大文字小文字の区別がなくなり、
テーブル名の大文字小文字の違いが無視されて存在するテーブルとして認識されJDBCタスクは正常に終了するのですが、
ユーザテーブルのUK項目に「AAA」というデータと「aaa」というデータが共存できなくなる副作用がでてくるという。

もっと早く気が付ければよかったのですが、申し訳ないです。

#
# しかし、どう対処すべきか悩みます。
# DBFluteのタスク実行用に「CaseSensittive=off」のデータベースを用意すべきかもしれません。
#

On 12月1日, 午前1:19, kubo <dbfl...@gmail.com> wrote:
> jfluteです。
>
> RC4 そのままで、DBFlute-0.9.7.6 をリリースしました。
> さて、この後 Sybase でどんなびっくりが待っていることやら...
>
> 2010/11/30 kubo <dbfl...@gmail.com>:

kubo

unread,
Dec 1, 2010, 12:37:54 AM12/1/10
to dbf...@googlegroups.com
jfluteです。

なるほど、CaseSensitiveというオプションがあって、
かつ、存在しない場合にエラーなんだね。

> ユーザテーブルのUK項目に「AAA」というデータと
> 「aaa」というデータが共存できなくなる副作用がでてくるという。

これは、まあ大丈夫です。
というのは、そもそもDBFluteで大文字小文字
区別したカラムはサポートされていないので。
どっちしろ、getAaa(), getAaa() でバッティングします。
Sybase と組み合わせる場合は「CaseSensittive=off」が
必須という扱いでいいかなと。

ただ、しゃってんさんの環境では、実務的にどうなのかな。
その設定で動かせそうなのかな?
(off にできないようであれば if (Sybase) かなぁ)


2010/12/1 しゃってん <schatt...@gmail.com>:

しゃってん

unread,
Dec 1, 2010, 1:19:39 AM12/1/10
to DBFluteユーザの集い
齊藤(Schatten)です。

> ユーザテーブルのUK項目に「AAA」というデータと
> 「aaa」というデータが共存できなくなる副作用がでてくるという。
について、テーブル名やカラム名のみに作用するならいいのですが、
作成したテーブルに格納するデータ全てに影響します。※ここが問題

業務上のデータを登録する際にももちろん影響します。
業務上のデータ検索においても条件の大文字小文字の区別がなくなります。

業務上のデータで大文字小文字の区別が無ければ「CaseSensittive=off」にできるのですが・・・


On 12月1日, 午後2:37, kubo <dbfl...@gmail.com> wrote:
> jfluteです。
>
> なるほど、CaseSensitiveというオプションがあって、
> かつ、存在しない場合にエラーなんだね。
>
> > ユーザテーブルのUK項目に「AAA」というデータと
> > 「aaa」というデータが共存できなくなる副作用がでてくるという。
>
> これは、まあ大丈夫です。
> というのは、そもそもDBFluteで大文字小文字
> 区別したカラムはサポートされていないので。
> どっちしろ、getAaa(), getAaa() でバッティングします。
> Sybase と組み合わせる場合は「CaseSensittive=off」が
> 必須という扱いでいいかなと。
>
> ただ、しゃってんさんの環境では、実務的にどうなのかな。
> その設定で動かせそうなのかな?
> (off にできないようであれば if (Sybase) かなぁ)
>
> 2010/12/1 しゃってん <schatten4...@gmail.com>:

しゃってん

unread,
Dec 1, 2010, 1:32:31 AM12/1/10
to DBFluteユーザの集い
齊藤(Schatten)です。

> (off にできないようであれば if (Sybase) かなぁ)
については、「if (Sybase) 」よりも「if (isCaceSencitiveDBName)」のようなプロパティを作るほうがいいかもし
れません。
他のDBでも大文字小文字での再検索を抑止できるようにもできますし。

今回のPJでは2つ開発用とテスト/本番用で設定を変える方向で検討してみます。

kubo

unread,
Dec 1, 2010, 2:15:08 AM12/1/10
to dbf...@googlegroups.com
jfluteです。

そうか、なるほど。
その CaseSensitive ってテーブル名の区別じゃなくて、
データの区別ってところなのかな。
で、メタデータの取得で指定するテーブル名は、
SQL上のテーブル名じゃなくて、内部テーブルの
データとしてテーブル名に当てると。
(CaseSensitive=On でも、SQL上のテーブル名や
カラム名は大文字小文字区別なく実行されるかな?)

ちなみに、以前MySQLでも似たようなことがあって、
PKのメタデータ取得だけパッチ処理してました。
整理して、Lower/Upperのリトライ取得に関しては、
例外を無視するようにしました。
(リトライなので、もともとそうするべきだったかも)
これで、どっちでも(OnでもOffでも)動くと思います。

DBFlute-0.9.7.7-00-SNAPSHOT (モジュールだけ)
に反映しました。

ちなみに、データとしての大文字小文字を区別も、
DBFluteとしては「あんまり」サポートしてません。
ほとんどの場面ではそのこと自体に関与しませんが、
例えば、PKの値が "AAA" と "aaa" で二つのレコード
に分かれているとき、(そもそもDB設計として非推奨)
LoadReferrer では一緒のレコードとして扱います。
(コード値の大文字小文字は区別しない)


2010/12/1 しゃってん <schatt...@gmail.com>:

kubo

unread,
Dec 1, 2010, 2:28:37 AM12/1/10
to dbf...@googlegroups.com
jfluteです。

> ちなみに、データとしての大文字小文字を区別も、
> DBFluteとしては「あんまり」サポートしてません。
> ほとんどの場面ではそのこと自体に関与しませんが、
> 例えば、PKの値が "AAA" と "aaa" で二つのレコード
> に分かれているとき、(そもそもDB設計として非推奨)
> LoadReferrer では一緒のレコードとして扱います。
> (コード値の大文字小文字は区別しない)

正確には、データとしての大文字小文字を区別する設定は
別にOKだけど、PKの値で別レコードで「A」と「a」とある場合は、
LoadReferrer や区分値メソッドではサポートされない、ってところかな。

// LoadReferrer - PKの値の大文字小文字 | DBFlute
// (ExBehaviorのオーバーライドでどうにでもなるけど)
http://dbflute.sandbox.seasar.org/ja/manual/function/ormapper/behavior/select/loadreferrer.html#caseinsensitive

※CDef の codeOf() も大文字小文字区別なしで探しに行きます。

kubo

unread,
Dec 1, 2010, 3:27:05 AM12/1/10
to dbf...@googlegroups.com
jfluteです。

っという間に、
DBFlute-0.9.7.7-01-SNAPSHOT
(モジュール、ランタイム両方)
を出しました。

LoadReferrer でオーバーライドで大文字小文字の区別しない挙動を
変更しやすいように、メソッド名をそれっぽいのに変更しました。
(いざってときの回避のために)

PKは一万歩譲って回避できるようにしても、区分値のコード値で、
"FOO" と "foo" は、やはり完全サポート対象外(にしたい)ですね。
(まあ、これもテンプレート触れば幾らでもですが)

2010/12/1 kubo <dbf...@gmail.com>:

kubo

unread,
Dec 5, 2010, 8:56:33 AM12/5/10
to dbf...@googlegroups.com
jfluteです。

別件も絡んで、
DBFlute-0.9.7.7-03-SNAPSHOT
が出ています。

あと、大文字小文字違いのPK値とか、
DBFluteで非推奨のDB構造をドキュメントに
まとめてみました。
http://dbflute.sandbox.seasar.org/ja/environment/supported.html#deprecateddata

2010/12/1 kubo <dbf...@gmail.com>:

しゃってん

unread,
Dec 6, 2010, 7:54:28 PM12/6/10
to DBFluteユーザの集い
齊藤(Schatten)です。

遅くなりましたがDBFlute-0.9.7.7-03-SNAPSHOTでも動作することを確認しました。


> あと、大文字小文字違いのPK値とか、
> ・・・
読ませていただきました。

確かにユニークな項目や(特に)区分値では大文字小文字で重複した登録というのは
業務的にも避けるべき内容かもしれませんね。

参考にさせていただきます。



On 12月5日, 午後10:56, kubo <dbfl...@gmail.com> wrote:
> jfluteです。
>
> 別件も絡んで、
> DBFlute-0.9.7.7-03-SNAPSHOT
> が出ています。
>
> あと、大文字小文字違いのPK値とか、
> DBFluteで非推奨のDB構造をドキュメントに
> まとめてみました。http://dbflute.sandbox.seasar.org/ja/environment/supported.html#depre...
>
> 2010/12/1 kubo <dbfl...@gmail.com>:
>
> > jfluteです。
>
> > っという間に、
> > DBFlute-0.9.7.7-01-SNAPSHOT
> > (モジュール、ランタイム両方)
> > を出しました。
>
> > LoadReferrer でオーバーライドで大文字小文字の区別しない挙動を
> > 変更しやすいように、メソッド名をそれっぽいのに変更しました。
> > (いざってときの回避のために)
>
> > PKは一万歩譲って回避できるようにしても、区分値のコード値で、
> > "FOO" と "foo" は、やはり完全サポート対象外(にしたい)ですね。
> > (まあ、これもテンプレート触れば幾らでもですが)
>
> > 2010/12/1 kubo <dbfl...@gmail.com>:
> >> jfluteです。
>
> >>> ちなみに、データとしての大文字小文字を区別も、
> >>> DBFluteとしては「あんまり」サポートしてません。
> >>> ほとんどの場面ではそのこと自体に関与しませんが、
> >>> 例えば、PKの値が "AAA" と "aaa" で二つのレコード
> >>> に分かれているとき、(そもそもDB設計として非推奨)
> >>> LoadReferrer では一緒のレコードとして扱います。
> >>> (コード値の大文字小文字は区別しない)
>
> >> 正確には、データとしての大文字小文字を区別する設定は
> >> 別にOKだけど、PKの値で別レコードで「A」と「a」とある場合は、
> >> LoadReferrer や区分値メソッドではサポートされない、ってところかな。
>
> >> // LoadReferrer - PKの値の大文字小文字 | DBFlute
> >> // (ExBehaviorのオーバーライドでどうにでもなるけど)
> >>http://dbflute.sandbox.seasar.org/ja/manual/function/ormapper/behavio...
>
> >> ※CDef の codeOf() も大文字小文字区別なしで探しに行きます。

kubo

unread,
Dec 6, 2010, 8:49:40 PM12/6/10
to dbf...@googlegroups.com
jfluteです。

しゃってんさん、確認ありがとうございます。
正式版は急がないかな?
どのみち、色々な人がSNAPSHOT使っているので、
予定より早めにリリースはしようと思ってるけど。
(本当は、元旦になった瞬間にリリースするつもりだった)

> 確かにユニークな項目や(特に)区分値では大文字小文字で重複した登録というのは
> 業務的にも避けるべき内容かもしれませんね。

区分値は論外として、まあ、万が一、業務コードに
そういうコードがあったとしても、サロゲートキーを
使っていれば問題はないんだけどね。
http://dbflute.sandbox.seasar.org/ja/manual/topic/dbdesign/surrogatekey.html

でも、業務コードでの大文字小文字の違いも業務する人の
こと考えてもやはり非推奨だけどね。電話とかでのコードの
やりとりで間違えまくりだし。大文字小文字だけでなく、
そもそも業務コードに「9」と「Q」を使わないとか、
一生懸命考えるもんだから。
(業務設計の現場で学んだ。会話で勘違いしやすいコードはOUT)


2010/12/7 しゃってん <schatt...@gmail.com>:

しゃってん

unread,
Dec 6, 2010, 11:44:05 PM12/6/10
to DBFluteユーザの集い
齊藤(Schatten)です。

正式版については現状急ぐことはありません。
(本格的な実装自体は年明けからとなる予定です。)
また、現状の0.9.7.7でも十分に対応可能であるとも思っております。
(大文字小文字の設定しだいですが)


「サロゲートキーと複合主キー」についてはRDBを取り扱う人には
是非読んでもらいたい感じになってますね。
(DBFluteを使う使わないによらず、テーブル設計を行わない人も含め)


On 12月7日, 午前10:49, kubo <dbfl...@gmail.com> wrote:
> jfluteです。
>
> しゃってんさん、確認ありがとうございます。
> 正式版は急がないかな?
> どのみち、色々な人がSNAPSHOT使っているので、
> 予定より早めにリリースはしようと思ってるけど。
> (本当は、元旦になった瞬間にリリースするつもりだった)
>
> > 確かにユニークな項目や(特に)区分値では大文字小文字で重複した登録というのは
> > 業務的にも避けるべき内容かもしれませんね。
>
> 区分値は論外として、まあ、万が一、業務コードに
> そういうコードがあったとしても、サロゲートキーを
> 使っていれば問題はないんだけどね。http://dbflute.sandbox.seasar.org/ja/manual/topic/dbdesign/surrogatek...
>
> でも、業務コードでの大文字小文字の違いも業務する人の
> こと考えてもやはり非推奨だけどね。電話とかでのコードの
> やりとりで間違えまくりだし。大文字小文字だけでなく、
> そもそも業務コードに「9」と「Q」を使わないとか、
> 一生懸命考えるもんだから。
> (業務設計の現場で学んだ。会話で勘違いしやすいコードはOUT)
>
> 2010/12/7 しゃってん <schatten4...@gmail.com>:

kubo

unread,
Dec 7, 2010, 8:48:46 AM12/7/10
to dbf...@googlegroups.com
jfluteです。

了解しました。
まあ、他の課題などと合わせてリリースタイミング計りますね。
実際には元旦にリリースしても同日のダウンロードは、
ほとんどないんですよね。

> 「サロゲートキーと複合主キー」についてはRDBを取り扱う人には
> 是非読んでもらいたい感じになってますね。
> (DBFluteを使う使わないによらず、テーブル設計を行わない人も含め)

ありがとう。正解がどうのこうのっていうより、
メリット・デメリットを分析してアプローチするっていう
考え方のきっかけになってほしいなと思っています。

※こういった記事、まだまだ書きたいことたくさんあるのだ...

2010/12/7 しゃってん <schatt...@gmail.com>:

しゃってん

unread,
Dec 7, 2010, 11:11:25 PM12/7/10
to DBFluteユーザの集い
齊藤(Schatten)です。

dbflute-basic-exampleをベースにDDLと接続設定をSybaseに合わせてテストしようとしたところ・・・
ReplaceSchemaのデータロードでつまづいてしまいました、、、
# 今までのテストでIdentityカラムが存在するテーブルへのデータのロードはしていなかったため気がつきませんでした;;
# 申し訳ないです。

原因はIdentityのカラムに値を代入できないというものです。
方法はあるようで、INSERT文を実行する前にトランザクション(?)に対して
set identity_insert TABLE_NAME on
というSQL文を実行し、インサートやデータロードを行うみたいです。
(参考:http://www.ujp.jp/modules/tech/index.php/DB/Sybase/Common/Identity/
IdentityColumns.html)

ReplaseSchema においてデータロード前後(トランザクション単位?)に同一セッションで特定のSQLを発行とかってできませんか?
(他のDBで利用するシーンが思い浮かびませんが・・・)

検討よろしくお願いいたします。

On 12月7日, 午後10:48, kubo <dbfl...@gmail.com> wrote:
> jfluteです。
>
> 了解しました。
> まあ、他の課題などと合わせてリリースタイミング計りますね。
> 実際には元旦にリリースしても同日のダウンロードは、
> ほとんどないんですよね。
>
> > 「サロゲートキーと複合主キー」についてはRDBを取り扱う人には
> > 是非読んでもらいたい感じになってますね。
> > (DBFluteを使う使わないによらず、テーブル設計を行わない人も含め)
>
> ありがとう。正解がどうのこうのっていうより、
> メリット・デメリットを分析してアプローチするっていう
> 考え方のきっかけになってほしいなと思っています。
>
> ※こういった記事、まだまだ書きたいことたくさんあるのだ...
>
> 2010/12/7 しゃってん <schatten4...@gmail.com>:

kubo

unread,
Dec 7, 2010, 11:16:33 PM12/7/10
to dbf...@googlegroups.com
jfluteです。

ああ、なるほど、SQLServerと全く同じですね。
(って、歴史的経緯からそりゃそうなんだけど)

SELECT IDENT_CURRENT (テーブル名) AS IDENT_CURRENT

ってSQL通るかな?
Identityカラムを持ったテーブルであれば、
なんか値が帰ってくるはず。
これが通れば、SQLServer用のクラスを
そのままSybaseでも利用できるので。

2010/12/8 しゃってん <schatt...@gmail.com>:

kubo

unread,
Dec 7, 2010, 11:38:14 PM12/7/10
to dbf...@googlegroups.com
jfluteです。

> SELECT IDENT_CURRENT (テーブル名) AS IDENT_CURRENT

テーブル名をシングルクォートで囲う必要がありました。
SELECT IDENT_CURRENT ('テーブル名') AS IDENT_CURRENT

2010/12/8 kubo <dbf...@gmail.com>:

しゃってん

unread,
Dec 8, 2010, 2:14:22 AM12/8/10
to DBFluteユーザの集い
齊藤(Schatten)です。

> SELECT IDENT_CURRENT ('テーブル名') AS IDENT_CURRENT
を実行してみましたがプロシジャが存在しないというエラーになりました。

また、
×「set identity_insert TABLE_NAME on 」
ではなく、
○「set OPTION identity_insert = TABLE_NAME」
をINSERT文の直前に実行することでIdentityカラムに値を代入することができました。
別のテーブルのIdentityカラムに値を代入する際には
「set OPTION identity_insert = ’’」
でオプションを一度解除し、再度
「set OPTION identity_insert = TABLE_NAME」
にて設定しなおす必要がありました。

このとき対象カラムに格納されている値の最大値にIdentityの値が自動調整されている感じです。
(データをロールバックしたら次に取得されるIdentityの値も元に戻っていました。)

シーケンスとはちょっと違った動きをしてる感じですね・・・


On 12月8日, 午後1:38, kubo <dbfl...@gmail.com> wrote:
> jfluteです。
>
> > SELECT IDENT_CURRENT (テーブル名) AS IDENT_CURRENT
>
> テーブル名をシングルクォートで囲う必要がありました。
> SELECT IDENT_CURRENT ('テーブル名') AS IDENT_CURRENT
>
> 2010/12/8 kubo <dbfl...@gmail.com>:
>
> > jfluteです。
>
> > ああ、なるほど、SQLServerと全く同じですね。
> > (って、歴史的経緯からそりゃそうなんだけど)
>
> > SELECT IDENT_CURRENT (テーブル名) AS IDENT_CURRENT
>
> > ってSQL通るかな?
> > Identityカラムを持ったテーブルであれば、
> > なんか値が帰ってくるはず。
> > これが通れば、SQLServer用のクラスを
> > そのままSybaseでも利用できるので。
>
> > 2010/12/8 しゃってん <schatten4...@gmail.com>:

kubo

unread,
Dec 8, 2010, 2:21:06 AM12/8/10
to dbf...@googlegroups.com
jfluteです。

なーるほど、微妙に違うんだね。

set identity_insert TABLE_NAME on
-> set option identity_insert = 'TABLE_NAME'

set identity_insert TABLE_NAME off
-> set option identity_insert = ''

って、対応かな。
(テーブル名はクォートするでOKだよね?)

>> SELECT IDENT_CURRENT ('テーブル名') AS IDENT_CURRENT
> を実行してみましたがプロシジャが存在しないというエラーになりました。

で、こっちに対応するのが無いのね。
メタデータのデフォルト値の autoincrement を
見ないと判別できないのかな...ちょっと頑張ってみます。

ちなみに、Identityを持っていないテーブルで、
set option identity_insert = 'TABLE_NAME'
とやって insert したら例外になるかな?

2010/12/8 しゃってん <schatt...@gmail.com>:

kubo

unread,
Dec 8, 2010, 2:39:35 AM12/8/10
to dbf...@googlegroups.com
jfluteです。

とりあえず、やってみました。

DBFlute-0.9.7.7-07-SNAPSHOT でお試し下さい。
ログでも set option identity_insert が表示されるはずです。

2010/12/8 kubo <dbf...@gmail.com>:

しゃってん

unread,
Dec 8, 2010, 3:02:22 AM12/8/10
to DBFluteユーザの集い
齊藤(Schatten)です。

> DBFlute-0.9.7.7-07-SNAPSHOT でお試し下さい。
> ログでも set option identity_insert が表示されるはずです。
試してみました。
見事正常にデータが登録されました!
しっかりとログも出ており、どのテーブルで設定が変更されたかがちゃんとわかりますね。

> ちなみに、Identityを持っていないテーブルで、
> set option identity_insert = 'TABLE_NAME'
> とやって insert したら例外になるかな?
について結果は
「テーブルに Identity/Autoincrement カラムがありません。」
でエラーとなりました。

> set identity_insert TABLE_NAME on
> -> set option identity_insert = 'TABLE_NAME'
> (テーブル名はクォートするでOKだよね?)
ですが、クォートの有無はどちらでも正常に実行されます。

細かい点ではありますが、
set option identity_insert = 'TABLE_NAME'
よりも
set TEMPORARY option identity_insert = 'TABLE_NAME'
のほうがいいかもしれません。
「TEMPORARY」を付けておくとその接続中のみ有効となるみたいです。
また、オプションの優先度も高くなるようです。
( TEMPORARY > USER > PUBLIC )

よろしくお願いいたします。

On 12月8日, 午後4:39, kubo <dbfl...@gmail.com> wrote:
> jfluteです。
>
> とりあえず、やってみました。
>
> DBFlute-0.9.7.7-07-SNAPSHOT でお試し下さい。
> ログでも set option identity_insert が表示されるはずです。
>
> 2010/12/8 kubo <dbfl...@gmail.com>:
>
> > jfluteです。
>
> > なーるほど、微妙に違うんだね。
>
> > set identity_insert TABLE_NAME on
> > -> set option identity_insert = 'TABLE_NAME'
>
> > set identity_insert TABLE_NAME off
> > -> set option identity_insert = ''
>
> > って、対応かな。
> > (テーブル名はクォートするでOKだよね?)
>
> >>> SELECT IDENT_CURRENT ('テーブル名') AS IDENT_CURRENT
> >> を実行してみましたがプロシジャが存在しないというエラーになりました。
>
> > で、こっちに対応するのが無いのね。
> > メタデータのデフォルト値の autoincrement を
> > 見ないと判別できないのかな...ちょっと頑張ってみます。
>
> > ちなみに、Identityを持っていないテーブルで、
> > set option identity_insert = 'TABLE_NAME'
> > とやって insert したら例外になるかな?
>
> > 2010/12/8 しゃってん <schatten4...@gmail.com>:
> ...
>
> もっと読む ≫

kubo

unread,
Dec 8, 2010, 3:10:40 AM12/8/10
to dbf...@googlegroups.com
jfluteです。

ありがとう。それでは、
07-SNAPSHOTを上書きしました。
「temporary」になるはず。

>> ちなみに、Identityを持っていないテーブルで、
>> set option identity_insert = 'TABLE_NAME'
>> とやって insert したら例外になるかな?
> について結果は
> 「テーブルに Identity/Autoincrement カラムがありません。」
> でエラーとなりました。

なるほど、やっぱりダメだよね...

2010/12/8 しゃってん <schatt...@gmail.com>:

しゃってん

unread,
Dec 8, 2010, 3:36:50 AM12/8/10
to dbf...@googlegroups.com
齊藤(Schatten)です。

> 07-SNAPSHOTを上書きしました。
> 「temporary」になるはず。
「temporary」に変更されていることを確認いたしました。


MavenのSurfireレポートが出力できたので添付いたします。
ベースはdbflute-basic-exampleです。
DDL及びDBへの接続設定はSybaseに置き換え、
JDBC->Genarateを再実行しています。
replace-schema-30-sequence.sql 及び -replace-schema-90-vendorcheck.sql は
SQLの構文エラーが発生するため実行していません。
(take-finally.sqlもSQL構文エラーが出たので実行されないようにしています。)
外出しSQLで MemberBhv_selectPurchaseSummaryMember.sql だけ多少細工をしています。
・ページングでの limit をコメントアウト
・order by のコメントアウト(order by 区でサブクエリの結果を用いることができなかったため)

いくつかエラーが出てますがDB依存系のものと判断できるものばかりなので問題ないかと思います。


2010年12月8日17:10 kubo <dbf...@gmail.com>:

dbflute-basic-example-sybase.zip

kubo

unread,
Dec 8, 2010, 3:50:11 AM12/8/10
to dbf...@googlegroups.com
jfluteです。

確認ありがとう。レポートも見ました。
ほとんどの機能が使えてますね。

「correlated UNION subqueries はサポートされていません」
そうなんだねぇ。

日時のミリ秒の精度がちょっと気になるかな。
SQLServerと同じような感じかな!?

2010/12/8 しゃってん <schatt...@gmail.com>:

kubo

unread,
Dec 12, 2010, 8:10:15 PM12/12/10
to dbf...@googlegroups.com
jfluteです。

バッチ更新のスレッドでもメールしましたが、
DBFlute-0.9.7.7-RC1 出しました。
(バッチ更新のカラム指定が反映されています)

これを使うと、そちらの sybase-example にて、
BehaviorPlatinumTest のバッチ更新が落ちると思います。
処理後の VersionNo の比較をしているところですが、
バッチ更新でも処理後のインクリメントされた VersionNo を
それぞれの Entity に反映するようにした影響です。
(直下の日本語の "F" だったかな!? の制限が改善されました)

2010/12/8 kubo <dbf...@gmail.com>:

しゃってん

unread,
Dec 13, 2010, 4:27:10 AM12/13/10
to DBFluteユーザの集い
齊藤(Schatten)です。

> これを使うと、そちらの sybase-example にて、
> BehaviorPlatinumTest のバッチ更新が落ちると思います。
> 処理後の VersionNo の比較をしているところですが、
> バッチ更新でも処理後のインクリメントされた VersionNo を
> それぞれの Entity に反映するようにした影響です。
> (直下の日本語の "F" だったかな!? の制限が改善されました)
上記事象を確認いたしました。
VersionNoを比較用に退避する場所で+1して保存し、Assertで正常に終了することも確認しました。

# F. 更新後のEntityのVersionNoは更新前と全く同じ値がそのまま保持される。
# ->更新後のEntityにはOnMemoryでインクリメントされたVersionNoが格納される。(0.9.7.7~)
ということですね?


On 12月13日, 午前10:10, kubo <dbfl...@gmail.com> wrote:
> jfluteです。
>
> バッチ更新のスレッドでもメールしましたが、
> DBFlute-0.9.7.7-RC1 出しました。
> (バッチ更新のカラム指定が反映されています)
>
> これを使うと、そちらの sybase-example にて、
> BehaviorPlatinumTest のバッチ更新が落ちると思います。
> 処理後の VersionNo の比較をしているところですが、
> バッチ更新でも処理後のインクリメントされた VersionNo を
> それぞれの Entity に反映するようにした影響です。
> (直下の日本語の "F" だったかな!? の制限が改善されました)
>
> 2010/12/8 kubo <dbfl...@gmail.com>:
>
> > jfluteです。
>
> > 確認ありがとう。レポートも見ました。
> > ほとんどの機能が使えてますね。
>
> > 「correlated UNION subqueries はサポートされていません」
> > そうなんだねぇ。
>
> > 日時のミリ秒の精度がちょっと気になるかな。
> > SQLServerと同じような感じかな!?
>
> > 2010/12/8 しゃってん <schatten4...@gmail.com>:
> >> 齊藤(Schatten)です。
>
> >>> 07-SNAPSHOTを上書きしました。
> >>> 「temporary」になるはず。
> >> 「temporary」に変更されていることを確認いたしました。
>
> >> MavenのSurfireレポートが出力できたので添付いたします。
> >> ベースはdbflute-basic-exampleです。
> >> DDL及びDBへの接続設定はSybaseに置き換え、
> >> JDBC->Genarateを再実行しています。
> >> replace-schema-30-sequence.sql 及び -replace-schema-90-vendorcheck.sql は
> >> SQLの構文エラーが発生するため実行していません。
> >> (take-finally.sqlもSQL構文エラーが出たので実行されないようにしています。)
> >> 外出しSQLで MemberBhv_selectPurchaseSummaryMember.sql だけ多少細工をしています。
> >> ・ページングでの limit をコメントアウト
> >> ・order by のコメントアウト(order by 区でサブクエリの結果を用いることができなかったため)
>
> >> いくつかエラーが出てますがDB依存系のものと判断できるものばかりなので問題ないかと思います。
>
> >> 2010年12月8日17:10 kubo <dbfl...@gmail.com>:
> >>> jfluteです。
>
> >>> ありがとう。それでは、
> >>> 07-SNAPSHOTを上書きしました。
> >>> 「temporary」になるはず。
>
> >>>>> ちなみに、Identityを持っていないテーブルで、
> >>>>> set option identity_insert = 'TABLE_NAME'
> >>>>> とやって insert したら例外になるかな?
> >>>> について結果は
> >>>> 「テーブルに Identity/Autoincrement カラムがありません。」
> >>>> でエラーとなりました。
>
> >>> なるほど、やっぱりダメだよね...
>
> >>> 2010/12/8 しゃってん <schatten4...@gmail.com>:
> ...
>
> もっと読む ≫

kubo

unread,
Dec 13, 2010, 4:44:24 AM12/13/10
to dbf...@googlegroups.com
jfluteです。

>> (直下の日本語の "F" だったかな!? の制限が改善されました)
> 上記事象を確認いたしました。
> VersionNoを比較用に退避する場所で+1して保存し、Assertで正常に終了することも確認しました。

おお、ありがとう!

> #  F. 更新後のEntityのVersionNoは更新前と全く同じ値がそのまま保持される。
> #   ->更新後のEntityにはOnMemoryでインクリメントされたVersionNoが格納される。(0.9.7.7~)
> ということですね?

Yes it is.

近日、正式版をリリースします。

2010/12/13 しゃってん <schatt...@gmail.com>:

kubo

unread,
Dec 15, 2010, 1:12:09 AM12/15/10
to dbf...@googlegroups.com
jfluteです。

DBFlute-0.9.7.7 をリリースしました。
http://d.hatena.ne.jp/jflute/20101215

また、何かあればその後のバージョンでね。
本当はクリスマスイブの夜中にリリースして、
バッチ更新とかDerivedReferrerのネストとかScalarSelectとか、
サンタさんからのプレゼントだよ、ってしようかと思ったんだけど、
それで誰からも突っ込まれなかったら寂しいからね。

2010/12/13 kubo <dbf...@gmail.com>:

kubo

unread,
Jan 9, 2011, 12:50:07 AM1/9/11
to dbf...@googlegroups.com
jfluteです。

しゃってんさん、もしよければというところですが、
DBFlute-0.9.7.9-RC1 を Sybase で試して頂けないでしょうか?

o Behavior.varyingInsert() のオプションで IdentityInsert ができるように

new InsertOption().disablePrimaryKeyIdentity()
と指定すると、ReplaceSchemaのときと同じように、
set temporary_... が発行されて、指定したIDを直接登録する
ことができるはずです。(SQLServerでは確認済み)

できたばかりの varyingQueryInsert() でも同様です。
(これは、insert into ... select ... のオプションメソッド)

後は、デグレってないかどうか。
ReplaceSchema で IdentityInsert が変わらずできるかどうか。

2010/12/15 kubo <dbf...@gmail.com>:

しゃってん

unread,
Jan 14, 2011, 9:26:14 AM1/14/11
to DBFluteユーザの集い
しゃってんです。

返信遅くなり申し訳ございません。

> DBFlute-0.9.7.9-RC1 を Sybase で試して頂けないでしょうか?
> ReplaceSchema で IdentityInsert が変わらずできるかどうか。
DBFlute-0.9.7.9-RC1におけるSybaseに関して、
上記ReplaceSchemaの実行および、BehaviorBasicTestが
正常に実行できたことを報告いたします。

> o Behavior.varyingInsert() のオプションで IdentityInsert ができるように
の確認につきましては、もう少々お時間をいただきたいと思います。



On 1月9日, 午後2:50, kubo <dbfl...@gmail.com> wrote:
> jfluteです。
>
> しゃってんさん、もしよければというところですが、
> DBFlute-0.9.7.9-RC1 を Sybase で試して頂けないでしょうか?
>
> o Behavior.varyingInsert() のオプションで IdentityInsert ができるように
>
> new InsertOption().disablePrimaryKeyIdentity()
> と指定すると、ReplaceSchemaのときと同じように、
> set temporary_... が発行されて、指定したIDを直接登録する
> ことができるはずです。(SQLServerでは確認済み)
>
> できたばかりの varyingQueryInsert() でも同様です。
> (これは、insert into ... select ... のオプションメソッド)
>
> 後は、デグレってないかどうか。
> ReplaceSchema で IdentityInsert が変わらずできるかどうか。
>
> 2010/12/15 kubo <dbfl...@gmail.com>:
>
> > jfluteです。
>
> > DBFlute-0.9.7.7 をリリースしました。
> >http://d.hatena.ne.jp/jflute/20101215
>
> > また、何かあればその後のバージョンでね。
> > 本当はクリスマスイブの夜中にリリースして、
> > バッチ更新とかDerivedReferrerのネストとかScalarSelectとか、
> > サンタさんからのプレゼントだよ、ってしようかと思ったんだけど、
> > それで誰からも突っ込まれなかったら寂しいからね。
>
> > 2010/12/13 kubo <dbfl...@gmail.com>:
> >> jfluteです。
>
> >>>> (直下の日本語の "F" だったかな!? の制限が改善されました)
> >>> 上記事象を確認いたしました。
> >>> VersionNoを比較用に退避する場所で+1して保存し、Assertで正常に終了することも確認しました。
>
> >> おお、ありがとう!
>
> >>> # F. 更新後のEntityのVersionNoは更新前と全く同じ値がそのまま保持される。
> >>> # ->更新後のEntityにはOnMemoryでインクリメントされたVersionNoが格納される。(0.9.7.7~)
> >>> ということですね?
>
> >> Yes it is.
>
> >> 近日、正式版をリリースします。
>
> >> 2010/12/13 しゃってん <schatten4...@gmail.com>:
> ...
>
> もっと読む ≫

kubo

unread,
Jan 14, 2011, 6:42:12 PM1/14/11
to dbf...@googlegroups.com
jfluteです。

しゃってんさん、ご確認ありがとうございます。

>> o Behavior.varyingInsert() のオプションで IdentityInsert ができるように
> の確認につきましては、もう少々お時間をいただきたいと思います。

了解です。ありがとう。
実装はこんな感じです。

Foo foo = new Foo();
foo.setFooId(3); // identity (本来は無視されるはずのIDが insert される)
foo.setFooName("test");
fooBhv.varyingInsert(foo, new
InsertOption<FooCB>().disablePrimaryKeyIdentity());

2011/1/14 しゃってん <schatt...@gmail.com>:

kubo

unread,
Jan 15, 2011, 3:04:48 AM1/15/11
to dbf...@googlegroups.com
jfluteです。

あと、DBFlute-0.9.7.9-RC2 が出ています(EMechaから)。
(Sybase周りの処理では RC1 から変わってないけど)
0.9.7.9 はやることやったという感じになるので、
そっちの Sybase 周りの話で何かあればというところで。

2011/1/15 kubo <dbf...@gmail.com>:

しゃってん

unread,
Jan 17, 2011, 11:46:34 PM1/17/11
to DBFluteユーザの集い
しゃってんです。

DBFlute-0.9.7.9-RC2にて正常な動作を確認いたしました。

あわせて、varyingInsert、varyingQueryInsert 及び varyingBatchInsert の動作も確認いたしまし
た。
このとき、実行時のログに
set temporary option identity_insert ・・・
が出力されていることも確認できました。


On 1月15日, 午後5:04, kubo <dbfl...@gmail.com> wrote:
> jfluteです。
>
> あと、DBFlute-0.9.7.9-RC2 が出ています(EMechaから)。
> (Sybase周りの処理では RC1 から変わってないけど)
> 0.9.7.9 はやることやったという感じになるので、
> そっちの Sybase 周りの話で何かあればというところで。
>
> 2011/1/15 kubo <dbfl...@gmail.com>:
>
> > jfluteです。
>
> > しゃってんさん、ご確認ありがとうございます。
>
> >>> o Behavior.varyingInsert() のオプションで IdentityInsert ができるように
> >> の確認につきましては、もう少々お時間をいただきたいと思います。
>
> > 了解です。ありがとう。
> > 実装はこんな感じです。
>
> > Foo foo = new Foo();
> > foo.setFooId(3); // identity (本来は無視されるはずのIDが insert される)
> > foo.setFooName("test");
> > fooBhv.varyingInsert(foo, new
> > InsertOption<FooCB>().disablePrimaryKeyIdentity());
>
> > 2011/1/14 しゃってん <schatten4...@gmail.com>:
> ...
>
> もっと読む ≫

kubo

unread,
Jan 18, 2011, 6:25:45 AM1/18/11
to dbf...@googlegroups.com
jfluteです。

おおお、しゃってんさん、ありがとう。
insert into select も動きましたか、良かった。
(ドキュメントないのにも関わらずありがとう)

ちなみに、これにて query 三兄弟のできあがり。
「queryInsert(), queryUpdate(), queryDelete()」

ということで、近いうちに正式リリースしますね。

2011/1/18 しゃってん <schatt...@gmail.com>:

kubo

unread,
May 30, 2011, 10:32:07 AM5/30/11
to dbf...@googlegroups.com
jfluteです。

SQLServerの曖昧検索では、正規表現(っぽいこと!?)を利用する
ためのワイルドカード "[" と "]" が存在するのですが、
(というかさっき知ったのですが)
ConditionBean や ParameterBean の LikeSearchOption で
一致の方向が定まった時にエスケープするようにしました。
DBFlute-0.9.8.4-10-SNAPSHOT (以降) にて反映されています。

恐らく Sybase も同じなんじゃないかと思うので対応しましたが、
しゃってんさんの方で確認して頂けないでしょうか?

まあ、DBFlute を Sybase で使っているのは、しゃってんさんだけ
だと踏んでいるので、特に困っていなければ気の向いたときにでも
という感じで。

※SQLServerでは確認が取れているので、Sybaseでの確認が
遅れてもリリース時期が来たらリリースしちゃいます。

2011/1/18 kubo <dbf...@gmail.com>:

しゃってん

unread,
May 30, 2011, 11:01:53 AM5/30/11
to DBFluteユーザの集い
しゃってんです。

なんと・・・
LIKEで正規表現が指定できるなんて・・・
# OracleだとREGEXP_LIKEを利用しないと正規表現での
# LIKEは出来ないと思っているので驚きです。

http://www.ianywhere.com/developer/product_manuals/sqlanywhere/0902/ja/html/dbrfja9/00000033.htm
↑がSybase内部で利用されているエンジンの情報だとすれば同様になりそうですね。

環境を触れるときに確認してみます。


On 5月30日, 午後11:32, kubo <dbfl...@gmail.com> wrote:
> jfluteです。
>
> SQLServerの曖昧検索では、正規表現(っぽいこと!?)を利用する
> ためのワイルドカード "[" と "]" が存在するのですが、
> (というかさっき知ったのですが)
> ConditionBean や ParameterBean の LikeSearchOption で
> 一致の方向が定まった時にエスケープするようにしました。
> DBFlute-0.9.8.4-10-SNAPSHOT (以降) にて反映されています。
>
> 恐らく Sybase も同じなんじゃないかと思うので対応しましたが、
> しゃってんさんの方で確認して頂けないでしょうか?
>
> まあ、DBFlute を Sybase で使っているのは、しゃってんさんだけ
> だと踏んでいるので、特に困っていなければ気の向いたときにでも
> という感じで。
>
> ※SQLServerでは確認が取れているので、Sybaseでの確認が
> 遅れてもリリース時期が来たらリリースしちゃいます。
>
> 2011/1/18 kubo <dbfl...@gmail.com>:
>
>
>
>
>
>
>
> > jfluteです。
>
> > おおお、しゃってんさん、ありがとう。
> > insert into select も動きましたか、良かった。
> > (ドキュメントないのにも関わらずありがとう)
>
> > ちなみに、これにて query 三兄弟のできあがり。
> > 「queryInsert(), queryUpdate(), queryDelete()」
>
> > ということで、近いうちに正式リリースしますね。
>
> > 2011/1/18 しゃってん <schatten4...@gmail.com>:
> ...
>
> もっと読む ≫

しゃってん

unread,
Jun 15, 2011, 7:08:28 AM6/15/11
to DBFluteユーザの集い
しゃってんです。


報告が遅くなり申し訳ありません。
SybaseのLike検索でも同様に特殊な正規表現っぽい記述で検索ができました。

DBFlute-0.9.8.4にてSybaseのLike検索に「[0-9]」を渡してみたところSQLの実行時エラーとなってしまいました。
ログに出力されたSQLは「where dfloc.ITEM_CD like '|[0-9|]%' escape '|' 」となっており、
SQLExceptionのエラーの内容は、以下の内容が出力されました。
# com.sybase.jdbc3.jdbc.SybSQLException
# SQL Anywhere エラー -1001047 : Cannot compile Like pattern: either bad
pattern or pattern too long.
# -- (dfp_Like.cxx 255)

直接SQLを実行してみたところ、どうやら「]」をエスケープしようとするとエラーとなるようです。
(エスケープする場合は「[]」で括る方法もあるようです。@Sybase)
http://infocenter.sybase.com/help/index.jsp?topic=/com.sybase.help.ase_15.0.blocks/html/blocks/blocks290.htm
※「where dfloc.ITEM_CD like '[[]0-9[]]%'」 で「[」と「]」がエスケープされているのと同義になるようで
す。

# 試しにOracleで上記と同様のSQLを直接実行したところ、
# 「ORA-01424: エスケープ文字に続く文字がないか、または無効です。」
# というエラーとなりました。
# Sybaseの場合も「]」がエスケープが不要な文字の為にエラーとなっているように思われます。


なお、現在のプロジェクトではあえて正規表現的な検索条件で検索できてもいいのでは?という意見もあり、
最新版の適用は保留しております。


On 5月31日, 午前12:01, しゃってん <schatten4...@gmail.com> wrote:
> しゃってんです。
>
> なんと・・・
> LIKEで正規表現が指定できるなんて・・・
> # OracleだとREGEXP_LIKEを利用しないと正規表現での
> # LIKEは出来ないと思っているので驚きです。
>
> http://www.ianywhere.com/developer/product_manuals/sqlanywhere/0902/j...
> ...
>
> もっと読む ≫

kubo

unread,
Jun 15, 2011, 9:03:34 AM6/15/11
to dbf...@googlegroups.com
jfluteです。

Sybaseでの確認ありがとう。
なんともすごい結果で...

独自のエスケープ文字っていうか、
エスケープ方法自体が独自っての、
ちょっと許せない感じだよねw

とりあえず、動かないんじゃしょうがないので、
Sybaseでの [ と ] のエスケープ処理は外します。
WayOfSybaseクラスで getOriginalWildCardList()
を空っぽにすればいいだけなのだ。

次のバージョンでは、結局 Sybase の [ と ] に関しては、
「DBFluteとしては何もしない」というもともとの挙動に
戻ります。

2011/6/15 しゃってん <schatt...@gmail.com>:

kubo

unread,
Jun 15, 2011, 9:34:27 AM6/15/11
to dbf...@googlegroups.com
jfluteです。

一応、DBFlute-0.9.8.5-RC1にて反映しておきました。

2011/6/15 kubo <dbf...@gmail.com>:

しゃってん

unread,
Jul 8, 2011, 6:21:36 AM7/8/11
to DBFluteユーザの集い
しゃってんです。

Sybase でのLike検索の動作として追加の事象があったため報告いたします。

半角の「%」と「_」は他のDB同様エスケープが正常に行われますが、
全角の「%」と「_」をエスケープするとエラーとなってしまいます。

そこで generateRealValue を拡張して、入力文字列の「%」「_」「[」及びエスケープ文字を
エスケープ対象文字列としてエスケープ処理を行うようにしております。
# 現在のプロジェクトでは重大な問題が無い限りライブラリのバージョンアップを凍結しているため、
# 独自の LikeSearchOption を作成し generateRealValue を拡張して対応しております。


また、一定文字数(全角のみ84文字以上、半角のみ127文字以上)を超えると
正規表現のコンパイルエラーとなってしまいます。
# 入力文字数の制限は業務処理にて行うことが必須となります。

kubo

unread,
Jul 8, 2011, 7:10:31 AM7/8/11
to dbf...@googlegroups.com
jfluteです。

おおぅ、しゃってんさん、ありがとう。
全角に関しては、最新では
「全角にエスケープが必要なDBMSだけエスケープ」
という仕様になっているので、回避できているはずです。

正規表現のコンパイルエラーはちょっとアプローチできないね。
っていうか、正規表現のエスケープ自体もアプローチしてないので、
Sybaseはそんな感じで...

※SQLServerはどうなっちゃうんだろうなぁ....

2011/7/8 しゃってん <schatt...@gmail.com>:

しゃってん

unread,
Oct 16, 2011, 10:55:41 PM10/16/11
to dbf...@googlegroups.com
しゃってん(齊藤)です。

随分と間があいてしまいましたが・・・
SybaseにおいてOracleと同様な方法でページング検索を行う場合のSQLを試してみました。


select *
  from (
select plain.*,  ROW_NUMBER() over (order by ... ,plain.c10 desc) as rn
  from (
select ... ,dfloc.UPDATE_DATETIME as c10
  from MEMBER dfloc
 where ...
 order by ... ,dfloc.UPDATE_DATETIME desc
       ) plain
       ) ext
 where ext.rn > 80
   and ext.rn <= 100


# over の中で指定する order by を データソート用の order by と同等とする必要があります。
# テーブル及びカラムのエイリアス名がデータのソートと over 内での指定で異なることに注意が必要となります。
# 元のSQL で order by に指定したカラムは select 区に記述して over の order by 区で参照できるようにする必要があります。


以上、参考までに。

kubo

unread,
Oct 17, 2011, 10:02:15 AM10/17/11
to dbf...@googlegroups.com
jfluteです。

しゃってんさん、ありがとう!

そうなんだよね、そのROW_NUMBER()の方式、
他のDBMSでも若干見かけるのだけどOrderByの同期がつらいんだよね。
なんで、こんなへんてこりんな仕様になっちゃうんだろう...

とにもかくにも貴重な情報ありがとう。、

2011/10/17 しゃってん <schatt...@gmail.com>:

> --
> このメールは Google グループのグループ「DBFluteユーザの集い」の登録者に送られています。

> このディスカッションをウェブ上で閲覧するには、https://groups.google.com/d/msg/dbflute/-/dXM--fSeFkMJ
> にアクセスしてください。

Reply all
Reply to author
Forward
0 new messages