【问题标题】:Running a Java procedure from an Oracle procedure by defining it as an Oracle procedure通过将 Oracle 过程定义为 Oracle 过程来运行 Java 过程
【发布时间】:2021-09-08 16:14:10
【问题描述】:

我们使用 Oracle Database 12c Enterprise Edition Release 12.1.0.2.0 - 64bit Production。

我已经在 Oracle 中加载了 OS_COMMAND 包,我看到它都是 java。

我最感兴趣的过程是允许用户在 Oracle 过程中运行 Linux 命令的过程。定义如下:ex 1

  function exec(p_command in varchar2, p_stdin in blob) return number
  is language java name 'ExternalCall.exec(java.lang.String, oracle.sql.BLOB) return int';

我如何在 Oracle PL?SQL 过程或函数中定义它以使其作为 Oracle 函数运行?

我拥有的唯一示例是一个 Oracle 过程,它定义了一个 Java 方法以用作 Oracle 函数。如下:ex 2

CREATE OR REPLACE PROCEDURE SLDPROC.shell (p_command IN VARCHAR2)
AS LANGUAGE JAVA 
NAME 'Host.executeCommand (java.lang.String)';
/

来自以下java方法:ex 3

 public class Host {
public static void executeCommand(String command) ...
...

那么长时间(20 年)没有使用 java,我如何创建一个类似的 Oracle 过程来包装一个 java 过程,如第一个示例中定义的 set_exec_in_shell 过程,例如 1?

谢谢!

【问题讨论】:

标签: java oracle stored-procedures


【解决方案1】:

如何在 Oracle 过程中定义它以使其作为 Oracle 函数运行?

您不需要“定义”它,因为它已经是OS_COMMAND 包中的一个过程;只需确保包已编译,然后直接从函数中调用即可。

CREATE FUNCTION your_function RETURN NUMBER IS
BEGIN
  OS_COMMAND.SET_EXEC_IN_SHELL();
  RETURN 1;
END;
/

【讨论】:

  • 我试过了。我收到一条错误消息,告诉我:“[警告] ORA-24344:编译错误 3/3 PLS-00306:调用 'EXEC' 3/3 PL/SQL 中的参数数量或类型错误:语句被忽略( 1: 0): 警告:已编译但出现编译错误”这可能是因为 java 函数实际上被多个版本的 'exec' 和多个版本的参数重载。我是否必须定义一个包含所有重载函数组合的包才能使其正常工作?
猜你喜欢
  • 1970-01-01
  • 2018-05-07
  • 1970-01-01
  • 2021-11-01
  • 2021-08-17
  • 1970-01-01
  • 1970-01-01
  • 2011-03-13
  • 2015-01-16
相关资源
最近更新 更多