JDBC ラッパー¶
JDBC ラッパー は JDBC を介してデータベースからデータを抽出します。
ここでは、 CREATE WRAPPER JDBC
コマンドの構文について説明します。このコマンドを手動で生成するのは難しいので、JDBC データソースの基盤となるデータベースの特定のテーブル/ビューに対する基本ビューを作成する場合、以下を実行します。
ストアドプロシージャ GENERATE_VQL_TO_CREATE_JDBC_BASE_VIEW または GENERATE_VQL_TO_CREATE_JDBC_BASE_VIEW_FROM_QUERY を使用します。これは、ラッパーと基本ビューを作成するために必要な VQL ステートメントを返します。
Administration Tool または Design Studio を使用します。
CREATE [ OR REPLACE ] WRAPPER JDBC <name:identifier>
[ FOLDER = <literal> ]
[ DESCRIPTION = <name: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
| ISPARAMETER
| 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 <name:identifier>
[ DATASOURCENAME = <name:identifier>]
[ DESCRIPTION = <name:literal> ]
[
[ 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 通りあります。
データをデータベースのテーブルまたはビューから取得する場合は、データベース内のテーブルの名前 (
RELATIONNAME
) および、オプションでそのカタログ (CATALOGNAME
) とスキーマ (SCHEMANAME
) を指定します。データをデータベースのストアドプロシージャから取得する場合は、プロシージャの名前を指定します (
PROCEDURENAME
)。データベースが Oracle で、プロシージャがプロシージャのパッケージに属する場合は、PACKAGENAME
パラメータを追加します。さらに、オプションで、データベース内のカタログ (CATALOGNAME
) とスキーマ (SCHEMANAME
) を指定します。SQL ステートメント (
SQLSENTENCE
) を指定します。ステートメントには補間文字列を含めることができます (「 クエリの実行コンテキストと補間文字列 」を参照)。
OUTPUTSCHEMA
句は、ラッパーが提供するデータのスキーマを定義します (「 ラッパーメタデータ 」を参照)。単純型エレメントごとに型を指定する必要があります。さらに、ラッパーによって返されるフィールド名とデータベース内のフィールド名のアソシエーションを、マッピングで指定されたとおりに指定できます。この句が定義されていない場合、ラッパーによって返される結果は、ラッパーが関連付けられている基本ビューのスキーマと互換性がなければなりません。さらに具体的には、クエリの結果として取得された属性の名前は、基本ビューの名前と一致している必要があり、それらの値は基本リレーションのデータ型と互換性がなければなりません。
フィールドプロパティの SOURCETYPENAME
、 SOURCETYPEID
、 SOURCETYPESIZE
、 SOURCETYPEDECIMALS
および 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 プロシージャを呼び出す場合は、返されるフィールドの最大長を定義できます。
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
)。
構成プロパティは以下のように定義されています。
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
が定義されなかった場合に使用されます。
これらのプロパティを変更するには、 SET コマンドを使用します。