7.3 SQL DMLからのJavaのコール

ファンクションとして公開するJavaメソッドは、SQLのSELECTINSERTUPDATEDELETECALLEXPLAIN PLANLOCK TABLEおよびMERGEの各文からコールできます。たとえば、次のJavaクラスの実行可能ファイルがOracle Databaseに格納されているとします。

public class Formatter
{
  public static String formatEmp (String empName, String jobTitle)
  {
    empName = empName.substring(0,1).toUpperCase() +
                                     empName.substring(1).toLowerCase();
    jobTitle = jobTitle.toLowerCase();
    if (jobTitle.equals("analyst"))
      return (new String(empName + " is an exempt analyst"));
    else
      return (new String(empName + " is a non-exempt " + jobTitle));
  }
}

Formatterクラスには、formatEmp()メソッドがあり、これは、従業員の名前と役職を含むフォーマットされた文字列を戻します。このメソッドのコール仕様は、次のように作成します。

CREATE OR REPLACE FUNCTION format_emp (ename VARCHAR2, job VARCHAR2)
RETURN VARCHAR2
AS LANGUAGE JAVA
NAME 'Formatter.formatEmp (java.lang.String, java.lang.String)
return java.lang.String';

次に、format_empファンクションをコールして従業員のリストをフォーマットします。

SQL> SELECT format_emp(first_name, job_id) AS "Employees" FROM employees
  2   WHERE job_id NOT IN ('AC_MGR', 'AD_PRES') ORDER BY first_name;

Employees
--------------------------------------------
Adams is a non-exempt clerk
Allen is a non-exempt salesman
Ford is an exempt analyst
James is a non-exempt clerk
Martin is a non-exempt salesman
Miller is a non-exempt clerk
Scott is an exempt analyst
Smith is a non-exempt clerk
Turner is a non-exempt salesman
Ward is a non-exempt salesman

制限事項

Javaメソッドは次の規則に準拠する必要があります。これらの規則は、副作用を制御することを意図しています。

  • SELECT文またはパラレル化したINSERTUPDATEまたはDELETEの各文からコールしたメソッドでは、データベース表を変更できません。

  • INSERTUPDATEまたはDELETEの各文からコールしたメソッドでは、その文で変更されたデータベース表に対する問合せや変更はできません。

  • SELECTINSERTUPDATEまたはDELETEの各文からコールしたメソッドでは、SQLトランザクション制御文(COMMITなど)、セッション制御文(SET ROLEなど)またはシステム制御文(ALTER SYSTEMなど)を実行できません。また、このメソッドでは、CREATEなどのデータ定義言語(DDL)文の後に自動コミットが続くため、この文も実行できません。

メソッド内のSQL文が前述の規則に違反している場合は、実行時にエラーが発生します。