OBJECTTABLE関数は、オブジェクト入力を処理して表形式の出力を生成します。関数自身が、どの列を投影するかを定義します。OBJECTTABLE関数は暗黙的にネストされたテーブルであり、先行するFROM Clause 項目に相関している可能性があります。

Usage


OBJECTTABLE([LANGUAGE lang] rowScript [PASSING val AS name ...] COLUMNS colName colType colScript [ DEFAULT defaultExpr] ...) AS id

Parameters

Parameter

Description

lang

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 LANGUAGE is not specified, the default value dv_script (see below) will be used

name

Identifier that will bind the val expression value into the script context

rowScript

String literal specifying the script to create the row values. For each non-null item, the Iterator produces the columns that will be evaluated

colName/colType

ID/data type of the column, which can optionally be defaulted with the DEFAULT clause expression defaultExpr

colScript

String literal specifying the script that evaluates to the column value

構文ルール

  • カラム名に重複があってはなりません;

  • CData Virtuality Server はスクリプトの実行コンテキストにいくつかの Special Variables を配置します。CommandContextdv_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);; 
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);;
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;;
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スクリプトからの変数名、テーブル・カラムを渡すことができます。