Вы объединяете значение в строку SQL, что приводит к чему-то вроде этого: INSERT INTO STATUS_DIM(STATUSNAAM) VALUES(Planned);
, но значения должны быть заключены в одинарные кавычки: INSERT INTO STATUS_DIM(STATUSNAAM) VALUES('Planned');
Правильное решение - использовать переменную связывания:
DECLARE
TYPE array_status IS VARRAY(2) OF VARCHAR2(30);
ARRAY array_status := array_status('Planned', 'Finished');
BEGIN
FOR i IN 1..ARRAY.COUNT LOOP
EXECUTE IMMEDIATE 'INSERT INTO STATUS_DIM(STATUSNAAM) VALUES(:status)' using array(i);
dbms_output.put_line(array(i));
END LOOP;
END;
/
Тогда вам не нужно думать о цитировании.
На самом деле для этого вообще не нужен динамический SQL:
DECLARE
TYPE array_status IS VARRAY(2) OF VARCHAR2(30);
ARRAY array_status := array_status('Planned', 'Finished');
BEGIN
FOR i IN 1..ARRAY.COUNT LOOP
INSERT INTO STATUS_DIM(STATUSNAAM) VALUES(array(i));
dbms_output.put_line(array(i));
END LOOP;
END;
/
Однако наиболее эффективным решением является использование FORALL
вместо цикла.
DECLARE
TYPE array_status IS VARRAY(2) OF VARCHAR2(30);
ARRAY array_status := array_status('Planned', 'Finished');
BEGIN
FORALL i IN 1..ARRAY.COUNT
INSERT INTO STATUS_DIM(STATUSNAAM) VALUES(array(i));
END;
/
Это будет быстрее, чем "простой цикл", но имеет недостаток, который вы не можете использовать dbms_output
для вывода.