При вставке в таблицу значений JSON массива ошибка: ORA-40573: Invalid use of PL/SQL JSON object type
Есть таблица:
create table tab (name varchar2 (8), type varchar2 (8));
Нужно вставить в неё значения JSON массива. Пробую так:
DECLARE
l_stuff json_array_t;
BEGIN
l_stuff := json_array_t ('["Stirfry", "Yogurt", "Apple"] ');
FOR indx IN 0 .. l_stuff.get_size - 1 LOOP
INSERT INTO tab (name, type) VALUES(l_stuff.get_string(indx), 'TEXT');
END LOOP;
END;
Но получаю ошибку:
Error report -
ORA-40573: Invalid use of PL/SQL JSON object type.
ORA-06512: at line 6
Как можно её обойти или исправить?
Свободный перевод вопроса How to convert json to columns and rows with SQL? от участника @Menja
Ответы (2 шт):
Автор решения: 0xdb
→ Ссылка
Это все ещё остающийся открытым, насколько мне известно, баг.
Чтобы обойти эту проблему, можно сначала присвоить значение переменной:
DECLARE
l_stuff json_array_t;
l_name tab.name%type;
BEGIN
l_stuff := json_array_t ('["Stirfry", "Yogurt", "Apple"] ');
FOR indx IN 0 .. (l_stuff.get_size - 1) LOOP
-- assigfn to variable - bug 28901431
l_name := l_stuff.get_string(indx);
INSERT INTO tab (name, type) VALUES (l_name, 'TEXT');
END LOOP;
END;
Свободный перевод ответа от участника @Alex Poole
Автор решения: 0xdb
→ Ссылка
Для обхода ошибки можно сначала преобразовать JSON массив в обычный PL/SQL массив, а затем с ним сделать массовую вставку.
create table tab (name varchar2 (8), type varchar2 (8))
/
declare
type namelist is table of varchar2(8) index by pls_integer;
names namelist;
arr json_array_t := json_array_t ('["Stirfry", "Yogurt", "Apple"]');
begin
for idx in 1..arr.get_size loop
names(idx) := arr.get_string(idx-1);
end loop;
forall idx in indices of names
insert into tab (name, type) values (names(idx), 'TEXT');
end;
/
Сам запрос и его результат:
select * from tab
/
NAME TYPE
-------- --------
Stirfry TEXT
Yogurt TEXT
Apple TEXT