0

HSQL(インメモリ・テスト用)とOracle DB(プロダクション用)で実行する必要があるネイティブ・クエリはありますが、問合せキーワード "RECURSIVE"はHSQLデータベースであり、Oracleでは許可されていません。両方のステートメントを両方のエンジンで実行する必要があるので、いくつかの共通の類似した演算子がありますか?oracleからのオペレータをhsqlデータベースで動作させる

のOracleクエリは次のとおりです。

WITH contexts (ID, CONTEXT_ID, NAME, LABEL_KEY, VERSION, parent_name, parent_id, lev) 
AS (
    SELECT t1.ID, t1.CONTEXT_ID, t1.NAME, LABEL_KEY, VERSION, NULL AS parent_name, NULL AS parent_id, 1 AS lev 
    FROM PIM_CONTEXT t1 WHERE t1.ID =1 
    UNION ALL 
    SELECT t2.ID, t2.CONTEXT_ID, t2.NAME, t2.LABEL_KEY, t2.VERSION, contexts.NAME AS parent_name, contexts.ID AS parent_id, lev + 1 AS lev 
    FROM contexts 
    JOIN PIM_CONTEXT t2 ON t2.context_id = contexts.id 
) 
SELECT ID, CONTEXT_ID, NAME, LABEL_KEY, VERSION, parent_name, parent_id FROM contexts; 

とHSQLで同じ出力を持つクエリは、次のとおりです。私は両方のエンジン上で実行することができますいくつかの代替が必要

WITH contexts recursive (ID, CONTEXT_ID, NAME, LABEL_KEY, VERSION, parent_name, parent_id, lev) 
AS (
    SELECT t1.ID, t1.CONTEXT_ID, t1.NAME, LABEL_KEY, VERSION, NULL AS parent_name, NULL AS parent_id, 1 AS lev 
    FROM PIM_CONTEXT t1 WHERE t1.ID =1 
    UNION ALL 
    SELECT t2.ID, t2.CONTEXT_ID, t2.NAME, t2.LABEL_KEY, t2.VERSION, contexts.NAME AS parent_name, contexts.ID AS parent_id, lev + 1 AS lev 
    FROM contexts 
    JOIN PIM_CONTEXT t2 ON t2.context_id = contexts.id 
) 
SELECT ID, CONTEXT_ID, NAME, LABEL_KEY, VERSION, parent_name, parent_id FROM contexts; 

+0

再帰的CTEをサポートするOracle 12cにアップグレードします。 –

+0

すでにOracle 12cとCTEがありますが、問題はH2SQLデータベースに必要な「再帰的」キーワードだけです。 –

+2

@ GordonLinoff再帰CTEは、Oracle 11gでもサポートされています。 – Sentinel

答えて

1

最新のHSQLDBコード(2.3.4以降)は、Oracleの構文互換モードでこれをサポートしています。スナップショットjarは、Mavenリポジトリから入手できます。

https://oss.sonatype.org/content/repositories/snapshots/org/hsqldb/hsqldb/SNAPSHOT/

+0

ありがとう@fredt、私は最終版をリリースするときに更新されます、私はスナップショットを使用することはできません。 –

関連する問題