JDBC ラッパー

JDBC ラッパー は JDBC を介してデータベースからデータを抽出します。

CREATE WRAPPER JDBC ステートメントの構文
CREATE [ OR REPLACE ] WRAPPER JDBC <name:identifier>
    [ FOLDER = <literal> ]
    DATASOURCENAME = <name:identifier>
    {
          [ CATALOGNAME = <name:literal> ] [ SCHEMANAME = <name:literal> ]
          RELATIONNAME = <name:literal>
        | [ CATALOGNAME = <name:literal> ] [ SCHEMANAME = <name:literal> ]
          [ PACKAGENAME = <name:literal> ] PROCEDURENAME = <name:literal>
        | SQLSENTENCE = <literal>
    }
    [ OUTPUTSCHEMA ( <field> [, <field> ]* ) ]
    [ ALIASES ( <alias> [, <alias> ]* ) ]
    [ SOURCECONFIGURATION ( [ <source configuration property>
                            [, <source configuration property> ]* ] ) ]
    [ <primary_key> ]
    [ <foreign_key> [, <foreign_key> ] ]*
    [ <index> [, <index> ] ]*

<field> ::=
    <name:identifier> [ = <mapping:literal> ] : <type:literal>
          [ ( { OBL | OPT } ) ]
          [ ( <field property> = <literal>
              [, <field property> = <literal> ]* ) ]
          [ <inline constraints> ]*
  | <name:identifier> [ = <mapping:literal> ] :
          ARRAY OF ( <register field> )
          [ ( DEFAULTVALUE = <literal> ) ]
          [ <inline constraints> ]*
  | <name:register field>

<field property> ::=
    DEFAULTVALUE
  | SOURCETYPENAME
  | SOURCETYPEID
  | SOURCETYPESIZE
  | SOURCETYPEDECIMALS
  | SOURCETYPERADIX

<register field> ::=
    <name:identifier> [ = <mapping:literal> ] :
       REGISTER OF ( <field> [, <field> ]* )
       [ ( <field property> = <literal> [, <field property> = <literal> ]* ) ]
       [ <inline constraints> ]*

<inline constraint> ::=
    [ NOT ] NULL
  | [ NOT ] UPDATEABLE
  | { SORTABLE [ ASC | DESC ] | NOT SORTABLE }
  | ESCAPE
  | EXTERN
  | EXTERNWHEREEXPRESSION
  | IS_AUTOINCREMENT
  | ISCURSOR
  | ISTABLE
  | MAXLEN = <max. length of the field:integer> (only for JDBC wrappers
              obtaining data from Oracle PL/SQL. See below)
  | PARAMINDEX = <integer>
  | SQLFRAGMENT

<alias> ::=
  <literal> = <literal>

<source configuration property> ::=
    ALLOWDELETE = { true | false | DEFAULT }
  | ALLOWINSERT = { true | false | DEFAULT }
  | ALLOWUPDATE = { true | false | DEFAULT }
  | DELEGATESQLSELECTION = { true | false | DEFAULT }
  | DELEGATESQLSENTENCEASSUBQUERY = { true | false | DEFAULT }
  | DATAINORDERFIELDSLIST = { ( <name:identifier> { ASC | DESC }
    [, <name:identifier> { ASC | DESC } ]* ) | DEFAULT }
  | SUPPORTSDISTRIBUTEDTRANSACTIONS = { true | false | DEFAULT }

<primary_key> ::=
  [ CONSTRAINT <name:literal> ]
  PRIMARY KEY ( <field_name:literal> [, <field_name:literal> ]* )

<foreign_key> ::=
  [ CONSTRAINT <name:literal> ]
  FOREIGN KEY ( <field_name:literal> [, <field_name:literal> ]* )
  REFERENCES [ <schema_name:literal>.]<table_name:literal>
  ( <field_name:literal> [, <field_name:literal> ]* )
  [ ON UPDATE <action_rule> ]
  [ ON DELETE <action_rule> ]
  [ <constraint_check_time> ]

<action_rule> ::=
    CASCADE
  | SET NULL
  | SET DEFAULT
  | NO ACTION
  | RESTRICT

<constraint_check_time> :=
    NOT DEFERRABLE
  | INITIALLY DEFERRED
  | INITIALLY IMMEDIATE

<index> ::=
  INDEX <name:literal> { HASH | CLUSTER | OTHER }
  [ UNIQUE ] [ PRIMARY ]
  ( <field_name:literal> [ { ASC | DESC } ] [, <field_name:literal> [ { ASC | DESC } ] ]* )
ALTER WRAPPER JDBC ステートメントの構文
ALTER WRAPPER JDBC <name:identifier>
    [ DATASOURCENAME = <name:identifier>]
    [
          [ CATALOGNAME = <name:literal> ] [ SCHEMANAME = <name:literal> ]
            RELATIONNAME = <name:literal>
        | SQLSENTENCE = <literal>
    ]
    [ OUTPUTSCHEMA ( <field> [, <field>]* ) ]
    [ ALIASES ( <alias> [, <alias>]* ) ]
    [ SOURCECONFIGURATION ( [ <source configuration property>
    [, <source configuration property> ]* ] ) ]

<field> ::= (「 CREATE WRAPPER JDBC ステートメントの構文 」を参照)

<alias> ::= (「 CREATE WRAPPER JDBC ステートメントの構文 」を参照)

<source configuration property> ::= (「 CREATE WRAPPER JDBC ステートメントの構文 」を参照)

JDBC ラッパー を定義するには、JDBC データソース の名前を指定する必要があります (DATASOURCENAME)。ラッパーのデータの取得元を指定する方法は、3 通りあります。

  1. データをデータベースのテーブルまたはビューから取得する場合は、データベース内のテーブルの名前 (RELATIONNAME) および、オプションでそのカタログ (CATALOGNAME) とスキーマ (SCHEMANAME) を指定します。

  2. データをデータベースのストアドプロシージャから取得する場合は、プロシージャの名前を指定します (PROCEDURENAME)。データベースが Oracle で、プロシージャがプロシージャのパッケージに属する場合は、PACKAGENAME パラメーターを追加します。さらに、オプションで、データベース内のカタログ (CATALOGNAME) とスキーマ (SCHEMANAME) を指定します。

  3. SQL ステートメント (SQLSENTENCE) を指定します。ステートメントには補間文字列を含めることができます (「 クエリの実行コンテキストと補間文字列 」を参照)。

OUTPUTSCHEMA 句は、ラッパーが提供するデータのスキーマを定義します (「 ラッパーメタデータ 」を参照)。単純型エレメントごとに型を指定する必要があります。さらに、ラッパーによって返されるフィールド名とデータベース内のフィールド名のアソシエーションを、マッピングで指定されたとおりに指定できます。この句が定義されていない場合、ラッパーによって返される結果は、ラッパーが関連付けられている基本ビューのスキーマと互換性がなければなりません。さらに具体的には、クエリの結果として取得された属性の名前は、基本ビューの名前と一致している必要があり、それらの値は基本リレーションのデータ型と互換性がなければなりません。

フィールドプロパティの SOURCETYPENAMESOURCETYPEIDSOURCETYPESIZESOURCETYPEDECIMALS および SOURCETYPERADIX は、データベースの JDBC ドライバーによって返されるフィールドに関する以下のメタデータを保存します。

  • SOURCETYPENAME はデータベース内の型の名前です。その値は、データベースの JDBC ドライバーによって返される TYPE_NAME プロパティの値です。

  • SOURCETYPEID プロパティの値は JAVA API の java.sql.Types クラスで定義される定数に相当します。たとえば、データベース内のフィールドの型が VARCHAR の場合、このプロパティの値は 12 です。フィールドが INTEGER の場合、値は 4 となり、DECIMAL の場合は 3 、のように対応します。その値は、データベースの JDBC ドライバーによって返される DATA_TYPE プロパティの値です。

  • SOURCETYPESIZE は、列に対して指定された列サイズです。数値フィールドの場合、これは最大精度です。文字フィールドの場合は、最大長になります。日時データ型の場合は、文字列表記の文字の長さです。バイナリデータの場合は、バイト単位の長さです。プロパティがこのフィールドのデータ型に適用できない場合は、NULL になります。その値は、データベースの JDBC ドライバーによって返された COLUMN_SIZE プロパティの値です。

  • SOURCETYPEDECIMALS は小数部の桁数です。プロパティがこのフィールドのデータ型に適用できない場合、値は NULL です。その値は、データベースの JDBC ドライバーによって返される DECIMAL_DIGITS プロパティの値です。

  • SOURCETYPERADIX はフィールドの基数です (通常は 10 か 2 のいずれか)。その値はデータベースの JDBC ドライバーによって返される NUM_PREC_RADIX プロパティの値です。

インライン定数 EXTERNWHEREEXPRESSION を伴うフィールドは、ビューのスキーマに属するフィールドですが、値は与えられません。このフィールドを持つ条件をデータベースに委任するためにのみ使用されます。

フィールドに インライン定数 SQLFRAGMENT が含まれ、クエリが WHERE 句でこのフィールドを使用する場合、フィールドに与えられる値は条件を解析することなく、「そのまま」データベースに委任されます。

注釈

SQLFRAGMENT 句は非推奨であり、Denodo Platform の今後のバージョンで削除される可能性があります。

たとえば、以下のクエリで基本ビューを作成するとします。

SELECT *
FROM internet_inc
WHERE @condition

基本ビューには condition というフィールドが含まれます。フィールドの定義に SQLFRAGMENT 句を追加し、このビューにクエリを実行すると、Virtual DataPort サーバーは condition の値を解析することも、それを引用符で囲んでエスケープすることもなく、「そのまま」データベースに委任します。これは、Virtual DataPort によってサポートされていない演算子を使用する場合に役立ちます。

SELECT *
FROM new_base_view
WHERE condition = '<complex condition>'

ALIASES 句は、 SQLSENTENCE オプションと特殊な補間変数 WHEREEXPRESSION (「 WHEREEXPRESSION の使用 」を参照) が使用される場合に役立ちます。

ラッパー 作成ステートメントには OR REPLACE 修飾子を指定することもできます。指定すると、同じ名前のラッパーがすでに存在する場合に、その定義は新しい定義で置き換えられます。

特定のラッパープロパティを指定できます (SOURCECONFIGURATION)。Virtual DataPort は、ラッパーで実行できる操作を判別するためにこれらを考慮します。適用可能なプロパティは該当するステートメント宣言に示されています (「 CREATE WRAPPER JDBC ステートメントの構文 」)。詳細については、「 ラッパー構成プロパティ 」を参照してください。

PRIMARY KEY 句では、ビューのプライマリキーを定義します。プライマリキーの詳細については、管理ガイドの「 ビューのプライマリキー 」を参照してください。

INDEX 句は、データベース内のテーブルのインデックスを保存します。この句には SQLSENTENCE 句との互換性はありません。実行時に、クライアントは、JDBC API の適切なメソッドを使用してインデックス情報を取得できます。

Virtual DataPort におけるインデックスのサポートの詳細については、管理ガイドの「 ビューのインデックス 」を参照してください。

リモートデータベースのテーブルの指定

リモートデータベースから取得されるデータを指定するための最初の代替方法は、データの抽出元となるデータベース内のテーブルまたはビューの名前を指定することです。

SQL ステートメントの使用

JDBC ラッパーを作成するためのもう 1 つのメカニズムは、ラッパーにクエリを実行したときにデータベースに送信される SQL ステートメントを定義することです。このメカニズムを使用して、データベースのストアドプロシージャを呼び出したり、複雑なクエリを実行したりすることができます。

指定される SQL ステートメントは、実行コンテキストから受信した変数によってパラメーター化することのできる補間文字列です (詳細については、「 クエリの実行コンテキストと補間文字列 」を参照)。

WHEREEXPRESSION の使用

Virtual DataPort には、基本ビューを容易に作成できるようにする補間変数として WHEREEXPRESSION があらかじめ定義されています。これにより、クエリを実行すると、データベースのテーブルやビューにクエリを実行する代わりに、特定の SQL ステートメント ( SQLSENTENCE パラメーターを指定した CREATE WRAPPER JDBC) が実行されます。実行時に、Virtual DataPort サーバーによって、 WHEREEXPRESSION が基本ビューのラッパーに送信する条件に置き換えられます。

基本ビューの SQL ステートメントで WHEREEXPRESSION を使用すると、この基本ビューに対して実行するクエリのパフォーマンスが向上する可能性があります。たとえば、結合ビューで NESTED 実行メソッドを使用していて、結合の右辺のビューが SQL ステートメントタイプである場合、このビューは、 WHEREEXPRESSION を使用して作成するべきです。そのように作成することにより、SQL ステートメントに WHEREEXPRESSION を使用した場合にのみ使用できる最適化を Virtual DataPort サーバーで適用できるからです。

詳細については、管理ガイドの「 WHEREEXPRESSION 変数の使用 」を参照してください。

Oracle PL/SQL ストアドプロシージャのインポート

ストアドプロシージャを呼び出す JDBC ラッパーを作成するには、SQL ステートメントを使用してラッパーを作成する必要があります。

Oracle データベースから PL/SQL プロシージャを呼び出す場合は、返されるフィールドの最大長を定義できます。

Oracle PL/SQL プロシージャを呼び出す JDBC ラッパーの例
CREATE WRAPPER JDBC pl_sql_sample
    FOLDER = '/oracle'
    DATASOURCENAME = ds_jdbc_oracle_sample
    SQLSENTENCE = 'CALL sampleStoredProcedureWithTable(?)' ISPROCEDURE
    OUTPUTSCHEMA (
        O_ID_RECORD: ARRAY OF (
            VALUE: REGISTER OF (
                VALUE:'java.lang.String' (OPT) NOT NULL
                                               NOT SORTABLE
                                               NOT UPDATEABLE
                                               MAXLEN=100
            ) NOT SORTABLE
              NOT UPDATEABLE
        ) NOT NULL
          NOT SORTABLE
          NOT UPDATEABLE
          MAXLEN=50
    )
;

この VQL ステートメントは、 sampleStoredProcedureWithTable という PL/SQL プロシージャを呼び出す JDBC ラッパーを作成します。このプロシージャは、レジスターの配列であるエレメントを返します。レジスターごとに String フィールドがあり、各フィールドの最大長は 100 文字 (MAXLEN = 100)、配列は最大 50 のエレメントを保持できます (MAXLEN = 50)。

ファイル <DENODO_HOME>/conf/VDBConfiguration.properties の構成プロパティは以下のように定義されています。

  • com.denodo.vdb.engine.wrapper.raw.jdbc.adapter.plugins.OraclePlugin.storedProcedure.table.maxlen: 配列の最大レジスター数のデフォルト値。この例では、この値は MAXLEN = 50 が定義されなかった場合に使用されます。

  • com.denodo.vdb.engine.wrapper.raw.jdbc.adapter.plugins.OraclePlugin.storedProcedure.register.maxlen: レジスターのフィールドの最大長のデフォルト値。この例では、この値は MAXLEN = 100 が定義されなかった場合に使用されます。