2016-04-13 2 views
1

У меня есть функция SQL с именем IP_ELEARN_PERSON.F_GET_PERSON(int, string, array).Как вызвать функцию pl/SQL с массивом в качестве аргумента с использованием SQL

Теперь я хочу, чтобы запустить эту функцию непосредственно от разработчика SQL, и я пытаюсь выполнить эту функцию, как это -

select IP_ELEARN_PERSON.F_GET_PERSON(32433,'SOURCED',('ALL')) from dual; 

Теперь проблема, когда я пытаюсь выполнить этот Funtion я получаю следующий errror -

ORA-06553: PLS-306: wrong number or types of arguments in call to 'F_GET_PERSON' 
06553. 00000 - "PLS-%s: %s" 
*Cause:  
*Action: 
Error at Line: 3 Column: 8 

Мы называли эту функцию из Java с помощью setArray метод CallableStatment как this--

cstmt.setArray(4, new ObtainSqlArrayFromJava().returnSqlArray(
        underlyingConn, roles)); 

Итак, мое сомнение в том, как я обычно упоминал массив в правильном запросе?

Я прошел через много сообщений о переполнении стека, но там, где в массиве не было написано ни одной вещи.

ответ

0
CREATE TYPE string_list IS TABLE OF VARCHAR2(100); 
/

CREATE FUNCTION F_GET_PERSON (
    id INT, 
    type VARCHAR2, 
    array string_list 
) RETURN INT 
AS 
BEGIN 
    RETURN 0; 
END; 
/

SELECT F_GET_PERSON(1, 'SOURCED', string_list('ALL')) 
FROM DUAL; 

Если вы хотите, чтобы некоторые Java-код для передачи массива в качестве переменной связывания с PreparedStatement, то вы можете посмотреть на my answer here. Вы должны легко адаптировать его к CallableStatement.

0

Как указано здесь:

http://docs.oracle.com/cd/E11882_01/appdev.112/e25519/composites.htm#LNPLS00501

Oracle поддерживает следующие типы коллекций: ассоциативный массив, VARRAY (переменной размера массива), и вложенные таблицы.

Вам необходимо правильно инициализировать коллекцию, прежде чем передавать ее функции.

Смежные вопросы