Вы не опубликовали никакого кода Java / Spring, поэтому я объясняю, почему ошибка возникает только со стороны Oracle.
[TL; DR] Ошибка возникает при передачеNULL
значение или коллекция, которая не была инициализирована.Либо убедитесь, что вы всегда передаете не-1006 * инициализированную коллекцию, либо используете выражение TABLE
.
Oracle Setup :
CREATE PROCEDURE add_a_list( a in T_A_LIST )
AS
BEGIN
FOR i IN 1..a.last LOOP
INSERT INTO sometable VALUES ( a(i).name );
END LOOP;
END;
/
Запрос1 : передача инициализированной коллекции:
BEGIN
add_a_list(
T_A_LIST(
T_A( 'one', NULL ),
T_A( 'two', T_B_LIST() ),
T_A( 'three', T_B_LIST( T_B( 3.1, 'message 3.1' ) ) ),
T_A( 'four', T_B_LIST( T_B( 4.1, 'message 4.1' ), T_B( 4.2, 'message 4.2' ) ) )
)
);
END;
/
Работает так, как ожидалось, поскольку коллекция была инициализирована.
SELECT * FROM sometable;
Выходы:
| NAME |
| :---- |
| one |
| two |
| three |
| four |
Запрос 2 : передача значения NULL
:
BEGIN
add_a_list( NULL );
END;
/
Возникает исключение:
ORA-06531: Reference to uninitialized collection
ORA-06512: at "FIDDLE_UMPWUWIBMKJJGKGIRJGH.ADD_A_LIST", line 4
ORA-06512: at line 2
Когда процедура достигает цикла FOR
и пытаетсянайти значение a.last
, где a
равно NULL
и вызывает исключение.
Запрос 3 : передача неинициализированной коллекции:
DECLARE
value T_A_LIST;
BEGIN
add_a_list( value );
END;
/
Выходы:
ORA-06531: Reference to uninitialized collection
ORA-06512: at "FIDDLE_UMPWUWIBMKJJGKGIRJGH.ADD_A_LIST", line 4
ORA-06512: at line 4
Когда процедура достигает цикла FOR
и пытается найти значение a.last
, где a
является неинициализированной коллекцией и вызывает исключение.
db<> fiddle здесь
Настройка Oracle - изменено :
Используйте выражение TABLE()
:
CREATE PROCEDURE add_a_list( a in T_A_LIST )
AS
BEGIN
INSERT INTO sometable ( name )
SELECT name
FROM TABLE( a );
END;
/
Повторное проeries 2 и 3 с измененной процедурой выполняется без исключений и не вставляет никаких строк.