10.4.2 SQLでのスクリプトの管理

このトピックでは、Rスクリプトを作成および管理するためのPL/SQLプロシージャとOracle Databaseデータ・ディクショナリ・ビューを紹介します。

Embedded R Execution用のSQL APIの関数は、OML4Rスクリプト・リポジトリに格納されている名前付きのスクリプトを引数として必要とします。PL/SQLプロシージャsys.rqScriptCreateおよびsys.rqScriptDropは、スクリプトを作成および削除します。スクリプトを作成する場合やスクリプト・リポジトリから削除する場合は、RQADMINロールが必要です。

sys.rqScriptCreate関数を使用する場合、スクリプトの名前と、1つのR関数定義を含むR関数スクリプトを指定する必要があります。関数sys.rqScriptCreateおよびsys.rqScriptDropのコールは、BEGIN-END PL/SQLブロックでラップする必要があります。スクリプト・リポジトリには、R関数がキャラクタ・ラージ・オブジェクト(CLOB)として格納されるため、関数定義を一重引用符で囲んで文字列として指定する必要があります。

スクリプトの所有者は、rqGrantプロシージャを使用してスクリプトへの読取りアクセス権を別のユーザーに付与したり、rqRevokeプロシージャを使用して権限を取り消すことができます。別のユーザーによってアクセス権を付与されたスクリプトを使用するには、次のように、スクリプトの名前の前に所有者の名前とピリオドを付加して、所有者を指定する必要があります。

select * from table(rqEval2(NULL, '{"x": 1}', 'owner_name.script_name'));

パブリック・スクリプトやユーザーが所有しているスクリプトには、所有者の接頭辞は必要ありません。

次の各表は、スクリプト・リポジトリ内のスクリプトを管理するためのPL/SQLプロシージャと、スクリプトに関する情報を格納するデータ・ディクショナリ・ビューのリストです。

表10-13 スクリプトを管理するためのPL/SQLプロシージャ

PL/SQLプロシージャ 説明
rqGrant データストアまたはスクリプトへの読取りアクセス権を付与します。
rqRevoke データストアまたはスクリプトへの読取りアクセス権を取り消します。
sys.rqScriptCreate 指定されたR関数を、指定された名前でスクリプト・リポジトリに追加します。
sys.rqScriptDrop 指定されたR関数をスクリプト・リポジトリから削除します。

表10-14 スクリプトのデータ・ディクショナリ・ビュー

データ・ディクショナリ・ビュー 説明
ALL_RQ_SCRIPTS 現行のユーザーが使用可能な、OML4Rスクリプト・リポジトリ内のスクリプトを示します
USER_RQ_SCRIPTS 現行のユーザーが所有している、スクリプト・リポジトリ内のスクリプトを示します。
USER_RQ_SCRIPT_PRIVS 現行のユーザーが読取りアクセス権を付与したスクリプト・リポジトリ内のスクリプトおよびアクセス権が付与されたユーザーを示します。
SYS.RQ_SCRIPTS スクリプト・リポジトリ内のシステム・スクリプトを示します。

例10-16 SQL APIによるスクリプトの作成

この例では、sys.rqScriptCreateプロシージャを使用して、Oracle Machine Learning for Rのスクリプト・リポジトリ内にスクリプトを作成します。

この例では、myRandomRedDots2という名前のユーザー定義関数を作成します。このユーザー定義関数は2つの引数を受け入れ、2つの列を持ち指定の数のランダム標準値を表示するdata.frameオブジェクトを返します。sys.rqScriptCreate関数は、ユーザー定義関数を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;
/

-- Grant read privilege access to OMLUSER.
BEGIN
  rqGrant('myRandomRedDots2', 'rqscript', 'OMLUSER');
END;
 /

-- View the users granted read access to myRandomRedDots2.
select * from USER_RQ_SCRIPT_PRIVS;

NAME                GRANTEE
----------------    -------
myRandomRedDots       OMLUSER

-- Revoke the read privilege access from OMLUSER.
BEGIN
  rqRevoke('myRandomRedDots2', 'rqscript', 'OMLUSER');
END;
 /

-- Remove the script from the script repository.
BEGIN
  sys.rqScriptDrop('myRandomRedDots2');
 END; 
 /