8.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文が前述の規則に違反している場合は、実行時にエラーが発生します。