PL/SQL中的DDL语句?

Asp*_*ant 4 oracle ddl plsql

我正在尝试下面的代码在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;
/
Run Code Online (Sandbox Code Playgroud)

该SELECT语句失败并出现此错误:

PL/SQL: ORA-00942: table or view does not exist
Run Code Online (Sandbox Code Playgroud)

是否可以CREATE, INSERT and SELECT一个接一个地在一个PL/SQL块中进行所有操作?

Ben*_*Ben 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;
Run Code Online (Sandbox Code Playgroud)

在编译时表TEMP,不存在.它尚未创建.因为它不存在你不能从中选择; 因此,您还必须动态执行SELECT.在这种特殊情况下,实际上并不需要进行SELECT,尽管您可以使用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;
Run Code Online (Sandbox Code Playgroud)

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

我可以推荐RenéNyffenegger的帖子"为什么动态SQL不好?" 出于原因,从性能的角度来看,如果可能的话,应该避免使用动态SQL.另请注意,您对SQL注入更加开放,应该使用绑定变量并DBMS_ASSERT帮助防范它.