У меня проблема с попыткой использовать оператор Execute Immediate
, содержащий оператор CREATE TABLE
и определенный пользователем тип таблицы. Я получаю сообщение об ошибке ORA-22905
в Oracle 11g.
Есть ли обходной путь для решения этой проблемы?
CREATE TYPE MY_TABLE_TYPE AS TABLE OF VARCHAR2(30);
/
DECLARE
MT MY_TABLE_TYPE;
BEGIN
SELECT * BULK COLLECT INTO MT FROM DUAL;
-- Two steps
EXECUTE IMMEDIATE 'CREATE TABLE MY_TABLE1 (A VARCHAR2(30))';
EXECUTE IMMEDIATE 'INSERT INTO MY_TABLE1 SELECT * FROM TABLE(:T)' USING MT; -- OK
-- One step
EXECUTE IMMEDIATE 'CREATE TABLE MY_TABLE2 AS SELECT * FROM TABLE(:T)' USING MT; -- ERROR ORA-22905
END;
Настоящий код для SELECT * FROM TABLE(:T)
является динамическим (имя основной таблицы является временным) и медленным. Вот почему я стараюсь не создавать таблицу в два этапа (как это делается с MY_TABLE1
). Также с двумя шагами я не могу использовать SELECT *
, но мне нужно указать все столбцы (переменное количество и более 100 столбцов).