OBJECTTABLE関数は、オブジェクト入力を処理して表形式の出力を生成します。関数自身が、どの列を投影するかを定義します。OBJECTTABLE関数は暗黙的にネストされたテーブルであり、先行するFROM Clause 項目に相関している可能性があります。
Usage
OBJECTTABLE([LANGUAGE lang] rowScript [PASSING val AS name ...] COLUMNS colName colType colScript [ DEFAULT defaultExpr] ...) AS idParameters
Parameter | Description |
|---|---|
| Optional string literal - the case-sensitive language name of the scripts to be processed. The script engine must be available via a JSR-223 ScriptEngineManager lookup. If a |
| Identifier that will bind the |
| String literal specifying the script to create the row values. For each non-null item, the Iterator produces the columns that will be evaluated |
| ID/data type of the column, which can optionally be defaulted with the |
| String literal specifying the script that evaluates to the column value |
構文ルール
カラム名に重複があってはなりません;
CData Virtuality Server はスクリプトの実行コンテキストにいくつかの Special Variables を配置します。
CommandContextはdv_contextとしてご利用いただけます。さらに、colScriptsは、dv_rowおよびdv_row_numberにアクセスしてもよい。dv_rowは、ROWスクリプトによって生成される現在の行オブジェクト。dv_row_numberは、現在の1ベースの行番号;rowScriptはイテレータに評価されます。結果がすでにイテレータである場合、それは直接使用されます。評価結果がIteratable の場合は、Iterator が取得されます。それ以外のオブジェクトは、単一アイテムのイテレータとして扱われます。すべての場合、NULL 行の値はスキップされます。
While there is no restriction on what can be used as a PASSING variable name, you should choose names that can be referenced as identifiers in the target language.
Examples
1. Special Variablesへのアクセス:
SELECT x.* FROM OBJECTTABLE( 'dv_context' COLUMNS "user" string 'dv_row.userName' , row_number integer 'dv_row_number' ) AS x結果は、それぞれユーザー名と1を含む2つの列を持つ行です。
Due to their mostly unrestricted access to Java functionality, usage of languages other than dv_script is restricted by default.
Data Roles language permissionを使用して、Data Roles も保護されています。
The admin-role does not include the necessary permissions to use Python by default. To grant Python access for users with the admin-role, you need to add the L permission for the "python" resource via a custom role and assign this custom role to the intended users.
L permission for Python removed from the admin-role since v4.9
dv_script
dv_scriptはシンプルなスクリプト式言語で、オブジェクトや配列/リストのインデックス付き値に対して、受渡し変数や特殊変数、0引数の非ボイドメソッドにアクセスすることができます。dv_script式は、渡す変数または特殊変数を参照することから始まります。その後、任意の数の '.' アクセサを連結して、式を別の値に評価することができます。メソッドにはプロパティ名でアクセスできます。例えば、getFooではなくfooのようになります。オブジェクトがgetFoo() と foo()メソッドの両方である場合、参照foo()とgetFoo()のアクセサを使用してゲッターを呼び出す必要があります。配列やリストのインデックスには、同じ '.' アクセッサ構文を使用して、1 ベースの正の積分値を使用してアクセスすることができます。システム関数のarray_getと同じロジックが使用され、インデックスが範囲外の場合は例外ではなくNULLが返されます。
dv_scriptは実行時に型付けが行われるため、実質的に動的に型付けされます。アクセサがオブジェクトに存在しない場合、またはメソッドにアクセスできない場合は、例外がスローされます。アクセサチェインのどの時点でも、式がNULL値と評価された場合は、NULLが返されます。
Examples
1. VDB の説明文字列を取得します:
dv_context.session.vdb.description2. VDB 説明文字列の最初の文字を取得します:
dv_context.session.vdb.description.toCharArray. 13. Sleep 関数:
JavaScriptの例:
SELECT "x.result" FROM (OBJECTTABLE( LANGUAGE 'javascript' 'java.lang.Thread.sleep(5000); "success";' COLUMNS "result" string 'dv_row') AS x);; Python の例(Linux ベースのサーバーのみ。Python サポートの詳細については、Running Python from the Code Editor を参照してください):
SELECT "x.result"FROM (OBJECTTABLE( LANGUAGE 'python' 'import timetime.sleep(5000) "success"' COLUMNS "result" string 'dv_row') AS x);;このスクリプトは5,000ミリ秒のsleep関数を実行します。その後に何らかの出力を得るには、COLUMNSステートメントをdv_rowと組み合わせて使用します。特別なイテレータdv_rowは、スクリプトの最後のステートメントの結果を自動的に取得します。上記の例では単に文字列successです。これはカラムの結果として定数式を返します。返す結果がスカラー値の場合、rowScript ' dv_row ' が使われます。
4. アウトプットの方法:
JavaScriptの例:
SELECT x.* FROM ( OBJECTTABLE( LANGUAGE 'javascript' 'var rows = []; firstrow = { "col1": "foo", "col2": "bar" }; rows.push( firstrow ); secondrow = { "col2": "foo", "col3": "bar" }; rows.push( secondrow ); rows;' COLUMNS "col1" string 'dv_row.col1', "col2" string 'dv_row.col2', "col3" string 'dv_row.col3', "col4" string 'dv_row.col4' ) AS x);;Python の例(Linux ベースのサーバーのみ。Python サポートの詳細については、Running Python from the Code Editor を参照してください):
SELECT x.*FROM ( OBJECTTABLE( LANGUAGE 'python''rows = [] for j in range (0,10): rows.insert(j,{"col" + str(i) : i+j for i in range(1,5)})rows' COLUMNS "col1" string 'dv_row.col1', "col2" string 'dv_row.col2', "col3" string 'dv_row.col3', "col4" string 'dv_row.col4' ) AS x);;このスクリプトは、 rows.push() (JavaScript) /rows.insert() (Python)関数を使用して、名前行のコレクションを作成し、それにタプルを追加します。各タプルは全く異なるプロパティ名と値を持つことができますが、それらが返される場合は、COLUMNS文の中にすべて存在しなければなりません。存在しないプロパティを返すことも可能です。これらはすべてNULLになります。dv_row.<propertyName>また、コレクション行はスクリプトの最後のステートメントでなければならないことに注意してください。
5. テーブルのカラムに適用されるFUNCTION:
JavaScriptの例:
SELECT "k.Name","x.Reversed" FROM "SYS.DataTypes" AS "k", OBJECTTABLE( LANGUAGE 'javascript' 'function reverse(s){ return s.split("").reverse().join(""); } reverse(tabname);' PASSING "k.Name" AS "tabname" COLUMNS "Reversed" string 'dv_row' ) AS x;;Python の例(Linux ベースのサーバーのみ。Python サポートの詳細については、Running Python from the Code Editor を参照してください):
SELECT "k.Name","x.Reversed" FROM "SYS.DataTypes" AS "k", OBJECTTABLE( LANGUAGE 'python''def reverse(s): return s[::-1] reverse(tabname);' PASSING "k.Name" AS "tabname" COLUMNS "Reversed" string 'dv_row' ) AS x;;スクリプトは、テーブルやビューの値にも適用できます。上記のスクリプトは、文字列を反転させる関数を作成します。テーブルSYS.DataTypesとの組み合わせにより、スクリプトはテーブルの各行に対して実行されます。PASSINGステートメントは、k.Name の値をスクリプトの変数tabnameの値としてリダイレクトすることを宣言しています。定数式、SQLスクリプトからの変数名、テーブル・カラムを渡すことができます。