A.2 rqEval関数
rqEval関数は、EXP_NAMパラメータで指定されているスクリプト内のR関数を実行します。
PAR_CURパラメータを使用して、引数をR関数に渡すことができます。
rqEval関数は、データベースからのデータを自動的には受信しません。R関数は、使用するデータを生成するか、Oracle Database、他のデータベース、フラット・ファイルなどのデータソースからデータを明示的に取得します。
R関数は、データベース内にSQL表として表示されるR data.frameオブジェクトを返します。OUT_QRYパラメータを使用して、返される値の形式を定義します。
構文
rqEval (
PAR_CUR REF CURSOR IN
OUT_QRY VARCHAR2 IN)
EXP_NAM VARCHAR2 IN)パラメータ
| パラメータ | 説明 |
|---|---|
|
|
|
|
|
次のうちの1つ。
|
|
|
OML4Rスクリプト・リポジトリ内のスクリプトの名前。 |
戻り値
関数rqEvalは、OUT_QRYパラメータ値で指定されている構造を持つ表を返します。
例
例A-2 rqEvalの使用方法
この例では、スクリプトmyRandomRedDots2を作成します。rqEvalの最初のパラメータの値は、関数myRandomRedDots2に引数を渡さないことを指定するNULLです。2番目のパラメータの値は、rqEvalにより返されたdata.frameの列名およびデータ型を記述するSQL文を指定する文字列です。3番目のパラメータの値は、OML4Rスクリプト・リポジトリ内のスクリプトの名前です。
-- Create a script named myRandomRedDots2 and add it to the script repository.
-- Specify that the script is private and to overwrite a script with the same name.
BEGIN
sys.rqScriptCreate('myRandomRedDots2',
'function(divisor = 100, numDots = 100) {
id <- 1:10
plot(1:numDots, rnorm(numDots), pch = 21, bg = "red", cex = 2 )
data.frame(id = id, val = id / divisor)}',
v_global => FALSE,
v_overwrite => TRUE);
END;
/
SELECT *
FROM table(rqEval(NULL, 'SELECT 1 id, 1 val FROM dual', 'myRandomRedDots2'));
Oracle SQL DeveloperでのSELECT文の結果は次のようになります。
ID VAL
---------- ----------
1 .01
2 .02
3 .03
4 .04
5 .05
6 .06
7 .07
8 .08
9 .09
10 .1
10 rows selected
例A-3 rqEvalにより呼び出されたR関数に引数を渡す
この例では、rqEvalの最初のパラメータとしてカーソルを指定することにより、R関数に引数を渡します。カーソルは、単一行のスカラー値の中に複数の引数を指定します。
SELECT *
FROM table(rqEval(cursor(SELECT 50 "divisor", 500 "numDots" FROM dual),
'SELECT 1 id, 1 val FROM dual',
'myRandomRedDots2'));
Oracle SQL DeveloperでのSELECT文の結果は次のようになります。
ID VAL
---------- ----------
1 .02
2 .04
3 .06
4 .08
5 .1
6 .12
7 .14
8 .16
9 .18
10 .2
10 rows selected
例A-4 出力表定義としてのPNGの指定
この例では、PNG_Exampleというスクリプトを作成し、スクリプト・リポジトリに格納します。rqEvalを呼び出すと、'PNG'のOUT_QRY値が指定されます。
BEGIN
sys.rqScriptDrop('PNG_Example');
sys.rqScriptCreate('PNG_Example',
'function(){
dat <- data.frame(y = log(1:100), x = 1:100)
plot(lm(y ~ x, dat))
}');
END;
/
SELECT *
FROM table(rqEval(NULL,'PNG','PNG_Example'));
Oracle SQL DeveloperでのSELECT文の結果は次のようになります。
NAME ID IMAGE
------ ---- ------
1 (BLOB)
2 (BLOB)
3 (BLOB)
4 (BLOB)