我正在尝试下面的代码在
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; /
PL/sql: ORA-00942: table or view does not exist
我假设您正在执行以下操作:
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;
但是,需要动态创建表通常表示设计错误的架构.它本不应该是必要的.
我可以在“Why is dynamic SQL bad?”之后推荐René Nyffenegger’s,因为从性能的角度来看,如果可能的话,你应该避免使用动态sql.另请注意,您对SQL injection更加开放,应该使用绑定变量和DBMS_ASSERT
来帮助防范它.