9.5.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パラメータ値で指定されている構造を持つ表を返します。
                  
例
例9-18 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 
例9-19 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 
例9-20 出力表定義としての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)