我想下面的代码来创建表中的PL / SQL :
DECLARE
V_NAME VARCHAR2(20);
BEGIN
EXECUTE IMMEDIATE 'CREATE TABLE TEMP(NAME VARCHAR(20))';
EXECUTE IMMEDIATE 'INSERT INTO TEMP VALUES(''XYZ'')';
SELECT NAME INTO V_NAME FROM TEMP;
END;
/
在SELECT
语句失败,此错误:
PL/SQL: ORA-00942: table or view does not exist
是否有可能CREATE, INSERT and SELECT
在一个单一的PL / SQL块另一个之后?
我假设你正在做类似如下:
declare
v_temp varchar2(20);
begin
execute immediate 'create table temp(name varchar(20))';
execute immediate 'insert into temp values(''XYZ'')';
select name into v_name from temp;
end;
在编译时表, TEMP
, 不存在 。 它尚未建立。 由于它不存在,你不能从它选择; 因此,你还必须动态地做选择。 没有任何实际需要做一个选择在这个特殊的情况,但你可以使用returning into
语法。
declare
v_temp varchar2(20)
begin
execute immediate 'create table temp(name varchar2(20))';
execute immediate 'insert into temp
values(''XYZ'')
returning name into :1'
returning into v_temp;
end;
然而,需要以动态地创建表通常是一个严重的设计模式的指示。 它真的不应该是必要的。
我可以推荐勒Nyffenegger的帖子“为什么是动态的SQL坏?” 对于原因,你应该避免动态SQL,如果可能的话,从性能的角度。 也请注意,你更开放的SQL注入 ,并应使用绑定变量和DBMS_ASSERT
帮助抵御它。
如果你运行多个程序时,你甚至会修改程序来运行SELECT语句作为动态SQL或使用返回到条款后得到一个错误。 因为当你运行程序首次将创建该表没有任何问题,但是当你运行它作为表已创建的第一次下一次,你没有下降的语句会导致错误:“表中已经存在数据库”。 所以我的建议是建立在PL / SQL程序表经常检查是否存在具有相同名称已经存在于数据库中有任何表之前。 你可以使用它存储根据您的数据库类型的元数据,数据字典视图/系统表此检查。
在Oracle实例可以使用下面的意见,以决定是否一个表需要创建或不:
DBA_TABLES,ALL_TABLES,USER_TABLES