OBJECTTABLE
関数は、オブジェクト入力を処理して表形式の出力を生成します。関数自身が、どの列を投影するかを定義します。OBJECTTABLE
関数は暗黙的にネストされたテーブルであり、先行するFROM
Clause 項目に相関している可能性があります。
Usage
OBJECTTABLE([LANGUAGE lang] rowScript [PASSING val
AS
name
...] COLUMNS colName colType colScript [
DEFAULT
defaultExpr] ...)
AS
id
Parameters
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
としてご利用いただけます。さらに、colScript
sは、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.description
2. VDB 説明文字列の最初の文字を取得します:
dv_context.session.vdb.description.toCharArray. 1
3. 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 time
time.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スクリプトからの変数名、テーブル・カラムを渡すことができます。