如何在 Oracle 10gR2 中调用 Java 存储过程?
Posted
技术标签:
【中文标题】如何在 Oracle 10gR2 中调用 Java 存储过程?【英文标题】:How To Call a Java Stored Procedure In Oracle 10gR2? 【发布时间】:2016-05-26 16:25:01 【问题描述】:这是我的代码:
SET DEFINE OFF;
CREATE OR REPLACE AND COMPILE NOFORCE JAVA SOURCE NAMED "SCHEMA"."DigestUtils" AS
/* imports here... */
public class DigestUtils
private static final char[] hexCode = "0123456789ABCDEF".toCharArray();
private static final int DEFAULT_BUFFER_SIZE = 1024 * 4;
public static String sha512Hex(Clob c) throws MyException
// Code here ...
return "Hex.string.here";
private static class MyException extends Exception
private static final long serialVersionUID = 8501244872025707585L;
public MyException(Throwable cause)
super(cause);
if ((cause instanceof SQLException) && !(cause instanceof SQLWarning) && (DriverManager.getLogWriter() != null))
printStackTrace(DriverManager.getLogWriter());
;
CREATE OR REPLACE FUNCTION sha512Hex RETURN VARCHAR2 AS
LANGUAGE JAVA NAME 'DigestUtils.sha512Hex(java.sql.Clob) return java.lang.String';
当我尝试从 SQL 调用 Java 存储过程时,如下所示:
select clob_column, sha512Hex(clob_column)
from my_table
where id in (49917,49918,49919,60455)
我收到此错误:
ORA-06553: PLS-306: numéro ou types d'arguments erronés dans appel à 'sha512Hex'
06553. 00000 - "PLS-%s: %s"
*Cause:
*Action:
Error on line 196, column 17 (translated from original message)
这是错误行:
(l. 196) select clob_column, sha1Hex(clob_column)
^
|___ column 17
我错过了什么?
Oracle 10gR2Java 1.4.2(嵌入在 Oracle 中)
【问题讨论】:
【参考方案1】:如果你描述你当前的功能,你会看到:
desc sha512Hex
Argument Name Type In/Out Default
-------------- -------- ------ -------
<return value> VARCHAR2 OUT unknown
您的 PL/SQL 函数声明也需要定义参数及其类型:
CREATE OR REPLACE FUNCTION sha512Hex(c CLOB) RETURN VARCHAR2 AS
LANGUAGE JAVA NAME 'DigestUtils.sha512Hex(java.sql.Clob) return java.lang.String';
desc sha512Hex
Argument Name Type In/Out Default
-------------- -------- ------ -------
<return value> VARCHAR2 OUT unknown
C CLOB IN unknown
然后您可以按照您在问题中尝试的方式调用它。
【讨论】:
【参考方案2】:此答案完成Alex Poole's one。
以下是如何使用普通 SQL 查询来描述函数:
SELECT
argument_name
,pls_type
--,data_type -- may contain useful info
,in_out
,default_value
FROM
user_arguments -- replace with ALL_ARGUMENTS for functions you don't own
WHERE
object_name = 'SHA1HEX'
ORDER BY
position
输出
ARGUMENT_NAME PLS_TYPE IN_OUT DEFAULT_VALUE
---------------- -------------- --------- --------------
<null> VARCHAR2 OUT <null>
C CLOB IN <null>
参考文献
Oracle Database Administration : ALL_ARGUMENTS view【讨论】:
我只是在SQL Developer中使用了describe
,其中也有info
;输出与 SQL*Plus 的describe
版本略有不同。但是,是的,如果您没有可用的客户端命令,这就是他们在幕后所做的 *8-)以上是关于如何在 Oracle 10gR2 中调用 Java 存储过程?的主要内容,如果未能解决你的问题,请参考以下文章
如何实现SQLServer2008R2连接Oracle11gR2
Oracle Study之-AIX6.1构建Oracle 10gR2 RAC