PL / SQL中的DDL语句?

时间:2012-06-30 09:08:47

标签: oracle plsql ddl

我正在尝试使用以下代码在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

是否可以一个接一个地在一个PL / SQL块中CREATE, INSERT and SELECT全部?

2 个答案:

答案 0 :(得分:10)

我假设您正在执行以下操作:

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不存在。它尚未创建。因为它不存在你不能从中选择;因此,您还必须动态执行SELECT。尽管您可以使用returning into语法,但实际上并不需要在此特定情况下执行SELECT。

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;

但是,需要动态创建表通常表示设计错误的架构。它本不应该是必要的。

我建议René Nyffenegger's发布"Why is dynamic SQL bad?",以便从性能角度出发,尽可能避免使用动态SQL。另请注意,您对SQL injection更加开放,应该使用绑定变量和DBMS_ASSERT来帮助防范它。

答案 1 :(得分:2)

如果多次运行程序,即使修改程序以将select语句作为动态SQL或使用returns into子句运行,也会出现错误。 因为当你第一次运行程序时它会创建表没有任何问题,但是当你下次运行它时,因为表已经是第一次创建的,而你没有drop语句,它将导致错误:“表已经存在于数据库“。 所以我的建议是在pl / sql程序中创建表之前,始终检查数据库中是否存在任何具有相同名称的表。您可以使用数据字典视图/系统表进行检查,这些表根据您的数据库类型存储元数据。

对于Oracle中的示例,您可以使用以下视图来确定是否需要创建表:

DBA_TABLES, ALL_TABLES, USER_TABLES