Как вызвать хранимую процедуру Java в Oracle 10gR2?

Вот мой код:

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';

когда я пытаюсь вызвать хранимую процедуру Java из SQL, как показано ниже:

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 10gR2
Java 1.4.2 (встроенная в Oracle)


person Stephan    schedule 26.05.2016    source источник


Ответы (2)


Если вы опишите свою текущую функцию, вы увидите:

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 

Затем вы можете назвать это, как вы пытались в своем вопросе.

person Alex Poole    schedule 26.05.2016

Этот ответ завершает ответ Алекса Пула.

Вот как можно описать функцию с помощью простого 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>

использованная литература

person Stephan    schedule 27.05.2016
comment
Я только что использовал describe в SQL Developer, в котором также есть info; вывод немного отличается от версии SQL*Plus describe. Но да, если у вас нет доступной клиентской команды, это то, что они делают под капотом * 8-) - person Alex Poole; 27.05.2016