2

derbyDB で興味深い動作に遭遇しました。

次のSQL(Javaコードから)でテーブルを作成します...

Create Table S1.SortieDessai (OBS VARCHAR(9), DateDUSortie TIMESTAMP, ContreIndic BOOLEAN,
Fin BOOLEAN, PdeVu VARCHAR(255), Refus LONG VARCHAR , InvDecisn LONG VARCHAR ,
Admin LONG VARCHAR , Motif_de_la_sortie VARCHAR(255), NomValidee VARCHAR(255),
DateValidee TIMESTAMP )

ただし、ij から記述を呼び出すと、次のようになります...

ij> describe sortiedessai;
COLUMN_NAME         |TYPE_NAME|DEC&|NUM&|COLUM&|COLUMN_DEF|CHAR_OCTE&|IS_NULL&
------------------------------------------------------------------------------
OBS                 |VARCHAR  |NULL|NULL|9     |NULL      |18        |YES
CONTREINDIC         |BOOLEAN  |NULL|NULL|1     |NULL      |NULL      |YES
FIN                 |BOOLEAN  |NULL|NULL|1     |NULL      |NULL      |YES
PDEVU               |VARCHAR  |NULL|NULL|255   |NULL      |510       |YES
REFUS               |LONG VAR&|NULL|NULL|32700 |NULL      |NULL      |YES
INVDECISN           |LONG VAR&|NULL|NULL|32700 |NULL      |NULL      |YES
ADMIN               |LONG VAR&|NULL|NULL|32700 |NULL      |NULL      |YES
MOTIF_DE_LA_SORTIE  |VARCHAR  |NULL|NULL|255   |NULL      |510       |YES
NOMVALIDEE          |VARCHAR  |NULL|NULL|255   |NULL      |510       |YES
DATEDUSORTIE        |DATE     |0   |10  |10    |NULL      |NULL      |YES
DATEVALIDEE         |DATE     |0   |10  |10    |NULL      |NULL      |YES

select * を実行すると、列は上記と同じ順序で報告されます。

これにより、ある DBMS から別の DBMS にテーブルを「コピー」するときに問題が発生しました。他の DBMS (Ms Access) は create ステートメントの順序で列名を報告するため、挿入を行うときに、Access から報告された Derby の順序が「正しい」とは言えません。これは、再生する必要があることを意味します。適切な順序を取得してから、その順序に挿入する値を取得するためにもう少し周ります。大きな苦労ではありませんが、腹立たしいです。

また、テーブルを作成するときは、 select *コマンドが同じ順序で結果を吐き出すと仮定して、最初に見たい情報を create ステートメントの先頭に置きます。

これは、いくつかの質問につながります。

どこかの設定でテーブルを特定の順序 (つまり、作成順序) でレポートするように derby に指示できますか? ダービーはバグである奇妙な動作をしていますか、それともステートメントオブジェクトに関するものですか? (statement.execute(sqlString) と statement.executeUpdate(sqlString) の両方を試してみましたが、どちらも同じ効果があるようです - ij 内でテーブルを作成するかのように、すべてが機能するように、それは Java のことだと思います正しい順序。

derby は、特定のテーブルの列の順序を報告する方法をどのように決定するのですか? それはランダムに見えますが、create ステートメントで列を使用する順序が何であれ、記述は常に同じです!

注: Access には、完全にランダムな順序のように見える情報を吐き出す習慣があることに気付きました (つまり、databaseMetaData からのテーブル名のリストは同じ順序で出力されることはありませんが、resultSetMetadata は正しく順序付けられているようです)。

どんな想いも真摯に受け止めます

部分的な解決策と詳細情報。配列を使用して列名の順序を格納し、データを同じ順序で抽出することについてのコメントを参照してください。あまり「いい」とは言えませんが、問題は解決しました。また、自分のデータ (偶然にも ms Access ソースから取得されたもの) をテストし、状況によっては正しい型を確認することも追加する必要があります (つまり、Access の単一の日時はタイムスタンプ/日付/時刻に簡単にマップされます)。そのため、列のデータ型を変更します。明らかに、この変更は列を追加および削除することによって構造を変更します。これは、最初の挿入の「構造化された」順序を台無しにするのにも役立ちます。適切なテスト ケースを作成する機会が得られるまで、これが問題の根本原因ではないことを保証することはできません。

4

1 に答える 1

0

ij を使用してテーブルを作成するか、Java プログラムからテーブルを作成するかによって、順序が異なるのは非常に奇妙です。これを単純なテスト ケースに切り分けることができる場合は、Derby 開発者にバグとして報告することを検討してください。このようにするべきではないと思います。

詳細をより深く掘り下げるには、SYSCOLUMNSシステム テーブルでの列の配置方法、特にCOLUMNNUMBERそのテーブルの列の値を調べてみてください。

http://db.apache.org/derby/docs/10.9/ref/rrefsistabs22441.html

SYSCOLUMNSij でテーブルを作成した場合と、Java アプリケーションからテーブルを作成した場合とでは、テーブルで同じ結果が得られますか?

于 2012-08-23T14:24:56.030 に答える