Plsql PL/SQL执行立即创建表并向其中插入数据

Plsql PL/SQL执行立即创建表并向其中插入数据,plsql,execute,Plsql,Execute,让我们看看我的源代码: CREATE OR REPLACE PROCEDURE MAKE_COPY_OF_CLASSROOMS AUTHID CURRENT_USER AS TYPE classrooms_table_type IS TABLE OF classrooms%ROWTYPE INDEX BY PLS_INTEGER; classrooms_backup classrooms_table_type; CURSOR classrooms_cursor IS SELECT * FRO

让我们看看我的源代码:

CREATE OR REPLACE PROCEDURE MAKE_COPY_OF_CLASSROOMS AUTHID CURRENT_USER AS

TYPE classrooms_table_type IS TABLE OF classrooms%ROWTYPE INDEX BY PLS_INTEGER;
classrooms_backup classrooms_table_type;

CURSOR classrooms_cursor IS
SELECT *
FROM classrooms
WHERE year = 1
ORDER BY name;

v_rowcnt PLS_INTEGER := 0;

BEGIN
    OPEN classrooms_cursor;
        FETCH classrooms_cursor
         BULK COLLECT INTO classrooms_backup;
    CLOSE classrooms_cursor;    

    EXECUTE IMMEDIATE 'CREATE TABLE classrooms_copy AS (SELECT * FROM classrooms WHERE 1 = 2)';
--COPY ALL STORED DATA FROM classrooms_backup TO classrooms_copy

END MAKE_COPY_OF_classrooms;
我在尝试将“教室备份”中的数据插入表“教室拷贝”中时被耽搁了好几个小时,该表是由executeimmediate命令创建的。有必要通过executeimmediate命令创建表“ucopy”。我尝试创建另一个包含for循环的EXECUTE命令:

EXECUTE IMMEDIATE 'FOR i IN classrooms_backup.FIRST..classrooms_backup.LAST LOOP
  INSERT INTO classrooms_copy(id,room_id,year,name) 
  VALUES(classrooms_backup(i).id,classrooms_backup(i).room_id,classrooms_backup(i).year,classrooms_backup(i).name);
  END LOOP;';
但这是通往地狱的路。我正在检索无效的SQL语句错误。
谢谢你的帮助

这里不需要太多PL/SQL。此外,尽量避免使用关键字
光标
——几乎总有更好的方法

create or replace procedure make_copy_of_classrooms authid current_user as
begin
    execute immediate '
        create table classrooms_copy as
        select *
        from classrooms
        where year = 1
        order by name
    ';
end make_copy_of_classrooms;
/

我被迫创建一个临时对象(教室备份),将教室备份的内容打印到命令行,然后,我必须通过立即执行创建表教室副本,并用教室备份中存储的数据填充该表……最后我做到了@乔恩:你的解决方案看起来更好更容易,但它与我的作业指导不符。