1

Derby を使用するように一部の単体テスト (DB2 で実行されるアプリケーション用) を変更することがどの程度実現可能かを調査しています。DB2 と Derby は非常に互換性があると回答が主張しているこの質問を見つけたので、DDL を DB2 データベースから取り出して、Derby データベースで実行する可能性があるように思われました。しかし、Derby DDL で Derby が動作しないケースが見つかったようです。

したがって、次のような DB2 9.1 用に記述された DDL があります。

CREATE TABLE FOO (
  FOO_ID CHAR(17) NOT NULL,
  FOO_SOMESTUFF CHAR(17) NOT NULL WITH DEFAULT ,
  FOO_MORESTUFF CHAR(1) NOT NULL WITH DEFAULT ,
  FOO_DT DATE NOT NULL WITH DEFAULT 
);

この DDL を ij で実行しても機能しません。次の構文エラーが発生します。

ij> run 'c:/derby/db-derby-10.6.1.0-bin/foo.sql';
ij> CREATE TABLE FOO (
            FOO_ID CHAR(17) NOT NULL,
            FOO_SOMESTUFF CHAR(17) NOT NULL WITH DEFAULT ,
            FOO_MORESTUFF CHAR(1) NOT NULL WITH DEFAULT ,
            FOO_DT DATE NOT NULL WITH DEFAULT
    );
ERROR 42X01: Syntax error: Encountered "," at line 3, column 62.
Issue the 'help' command for general information on IJ command syntax.
Any unrecognized commands are treated as potential SQL commands and executed dir
ectly.
Consult your DBMS server reference documentation for details of the SQL syntax s
upported by your server.

DB2 DDL と同じデフォルト値になる Derby の DDL は何ですか? DDL を変更する必要があるかもしれないことはわかりました。DDL はAUDIT NONEDATA CAPTUREのような奇妙なものでいっぱいでCCSID EBCDIC、Derby が機能するためには取り除かなければなりません。しかし、デフォルトですべて空白にすることは、このコードベースにとって大きな問題です。これで Derby よりも優れた別のメモリ内データベースがあれば、私は提案を受け入れます。

4

2 に答える 2

3

私は実際にダービーでこれを試しませんでした。しかし、私の推測では、次のようにデフォルトが何であるかを明示的に述べればうまくいくと思います:

CREATE TABLE FOO (
  FOO_ID CHAR(17) NOT NULL,
  FOO_SOMESTUFF CHAR(17) NOT NULL WITH DEFAULT ' ' ,
  FOO_MORESTUFF CHAR(1) NOT NULL WITH DEFAULT ' ',
  FOO_DT DATE NOT NULL WITH DEFAULT CURRENT DATE
);
于 2010-10-01T15:08:14.400 に答える
1

上記の回答は、実際には最良の回答ではありません。Apache Derby では、NOT NULL 列のデフォルト値を設定するときに WITH ディレクティブを使用する必要はありません。WITH はサポートされていますが、不要です。この例では、最適な構文を示しています。

CREATE TABLE FOO (
    FOO_GUID integer not null generated by default as identity constraint FOO_PK primary key,
    FOO_STATUS CHAR(1) NOT NULL DEFAULT 'I' ,
    FOO_ACTIVE CHAR(1) DEFAULT 'Y' NOT NULL,
    FOO_BAR CHAR(16) 
);
INSERT INTO FOO(FOO_BAR) VALUES('BAR_FOO');

上記の例が示すように、NOT NULL は DEFAULT ディレクティブの前または後に置くことができます。START および No DATA ディレクティブを使用する場合は、WITH ディレクティブが必要です。

于 2021-03-26T17:13:03.537 に答える