如何将Oracle中已加载的Java方法封装为可调用的PL/SQL过程/函数
Oracle 12c封装Java方法为PL/SQL函数/存储过程方案
1. 封装为PL/SQL函数(推荐,匹配原Java方法返回值特性)
你提供的Java方法ExternalCall.exec有int类型返回值,优先封装为PL/SQL函数,直接按以下语法创建即可:
CREATE OR REPLACE FUNCTION exec_os_command( p_command IN VARCHAR2, p_stdin IN BLOB ) RETURN NUMBER AS LANGUAGE JAVA NAME 'ExternalCall.exec(java.lang.String, oracle.sql.BLOB) return int'; /
匹配规则和你给出的示例完全一致:
- PL/SQL参数顺序、类型和Java方法参数一一对应:
VARCHAR2对应java.lang.String,BLOB对应oracle.sql.BLOB - PL/SQL返回值
NUMBER对应Java的int类型 NAME段严格匹配Java类的全限定名、方法名、参数列表、返回值声明
2. 封装为PL/SQL存储过程(可选)
如果需要存储过程形式,把Java方法的返回值映射为存储过程的OUT参数即可:
CREATE OR REPLACE PROCEDURE exec_os_command_proc( p_command IN VARCHAR2, p_stdin IN BLOB, p_return_code OUT NUMBER ) AS LANGUAGE JAVA NAME 'ExternalCall.exec(java.lang.String, oracle.sql.BLOB) return int'; /
3. 调用示例
以函数调用为例:
DECLARE v_ret NUMBER; v_stdin BLOB := EMPTY_BLOB(); -- 无标准输入需求时传入空BLOB即可 BEGIN -- 示例:执行查看/tmp目录的命令 v_ret := exec_os_command('ls -l /tmp', v_stdin); DBMS_OUTPUT.PUT_LINE('命令执行返回码:' || v_ret); END; /
注意事项
- 调用前需要SYS用户给使用该函数/存储过程的用户授予Oracle JVM的对应权限,否则会报权限错误:
-- 替换<用户名>为实际调用者的Oracle用户名 EXEC DBMS_JAVA.GRANT_PERMISSION('<用户名>', 'java.io.FilePermission', '<<ALL FILES>>', 'execute'); EXEC DBMS_JAVA.GRANT_PERMISSION('<用户名>', 'java.lang.RuntimePermission', 'writeFileDescriptor', '*');
- 确保你加载的
ExternalCallJava类编译时使用的JDK版本不高于Oracle 12c内置JVM的版本(12c内置JDK为1.7版本),避免类加载失败。
内容的提问来源于stack exchange,提问作者Carbon
相关产品推荐
相关产品推荐

