1

私は HSQLDB を使用する統合テストを書いていますが、本番環境ではアプリケーションは Oracle DB を使用しています。Oracle では、特定のテーブルの主キーが空の場合、シーケンスの次の値を使用して入力されるというトリガーがあります。このトリガーが HSQLDB で機能する必要がありますが、スクリプトを両方の DB で機能させる方法を見つけることができるようです。以下は、Oracle SQL Dev Studio によって生成されたトリガーです。

CREATE OR REPLACE TRIGGER "WFMEXTENSIONS"."WORK_TRG" 
BEFORE INSERT ON WORK 
FOR EACH ROW 
BEGIN
  <<COLUMN_SEQUENCES>>
  BEGIN
    IF INSERTING AND :NEW.WORK_ID IS NULL THEN
      SELECT WORK_SEQ.NEXTVAL INTO :NEW.WORK_ID FROM SYS.DUAL;
    END IF;
  END COLUMN_SEQUENCES;
END;
/

HSQL DB は、「Oracle 互換モード」を使用して実行されています。

SET DATABASE SQL SYNTAX ORA TRUE;

両方の DB で動作するようにトリガーを変更する方法はありますか?

4

2 に答える 2

0

HSQL トリガー構文で気付いたことの 1 つは、Oracle のように行参照 (古いものと新しいもの) の前にコロンが付けられないことです。「REFERENCING NEW AS :new」を受け入れるかどうかなどの項目をテストするために HSQL DB にアクセスすることはできませんが、とにかく Oracle と互換性がないため、役に立ちません。

同様に、デフォルトのシーケンス アクセスも異なるようです。

INSERT INTO childtable VALUES 4, CURRENT VALUE FOR mysequence

したがって、問題は、Oracle 互換モードがどの程度互換性があるかということです。ストアド コード構文の互換性を意味しますか? それとも、ステートメントの互換性だけですか? ガイドは私に楽観主義を与えません:

SQL ルーチンは一般に移植可能ですが、いくつかの変更が必要です。

「必要かもしれない」ではありません。「必要です」。率直に言って、成功する可能性が低いことに挑戦しているのかもしれません。

于 2016-02-17T15:28:50.017 に答える
0

HSQLDBでは次のようになります

CREATE TRIGGER "WFMEXTENSIONS"."WORK_TRG" 
BEFORE INSERT ON WORK REFERENCING NEW ROW AS NEW
FOR EACH ROW 
BEGIN ATOMIC
  BEGIN ATOMIC
    IF NEW.WORK_ID IS NULL THEN
      SELECT WORK_SEQ.NEXTVAL INTO NEW.WORK_ID FROM DUAL;
    END IF;
  END;
END

ストアド プロシージャの構文は Oracle と多少異なりますが、個々の SQL ステートメントでは、サポートされている Oracle 構文 (NEXTVALおよびなど) を使用できます。DUAL

于 2016-02-17T19:12:04.660 に答える