7.3 SQL DMLからのJavaのコール
ファンクションとして公開するJavaメソッドは、SQLのSELECT、INSERT、UPDATE、DELETE、CALL、EXPLAIN PLAN、LOCK 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文またはパラレル化したINSERT、UPDATEまたはDELETEの各文からコールしたメソッドでは、データベース表を変更できません。 -
INSERT、UPDATEまたはDELETEの各文からコールしたメソッドでは、その文で変更されたデータベース表に対する問合せや変更はできません。 -
SELECT、INSERT、UPDATEまたはDELETEの各文からコールしたメソッドでは、SQLトランザクション制御文(COMMITなど)、セッション制御文(SET ROLEなど)またはシステム制御文(ALTER SYSTEMなど)を実行できません。また、このメソッドでは、CREATEなどのデータ定義言語(DDL)文の後に自動コミットが続くため、この文も実行できません。
メソッド内のSQL文が前述の規則に違反している場合は、実行時にエラーが発生します。