【发布时间】:2016-10-04 08:31:48
【问题描述】:
我有一个 define_Variable.sql 文件并包含
DEFINE T_SCHEMA='HR';
2) Create_table.sql
@define_variable.sql
DECLARE
TYPE table_array IS TABLE OF VARCHAR2(200);
table_list table_array;
l_query varchar2(500);
is_exst number :=0;
nt_exst number :=0;
BEGIN
l_query:= 'select TABLE_NAME from DBA_tables WHERE OWNER = :OWNER and TABLE_NAME IN (''employee'',''appraisal'')';
execute immediate l_query BULK COLLECT INTO table_list USING '&T_SCHEMA' ;
DBMS_OUTPUT.PUT_LINE('Total Tables to be deployed is :'||table_list.count);
IF 'employee' member of table_list THEN
DBMS_OUTPUT.PUT_LINE('employee TABLE ALREADY EXISTS');
ELSE
Execute Immediate(' create table employee( id number,name varchar2(50))');
DBMS_OUTPUT.PUT_LINE('employee TABLE created');
end if;
end;
/
当我执行脚本时,它将检查表是否存在条件,如果存在,它将显示消息为“已经存在”,否则,它将创建一个表。 所以任何时候,我的脚本都可以执行而不会抛出错误。
现在,问题是,当我运行脚本时,由于名称已经存在,它会抛出错误,数组 table_list.count 的计数显示为零。它将变为 else 条件而不是 IF 条件。可能是什么原因?
【问题讨论】:
-
为什么在检查表是否已经存在时指定schema名称,而在创建表时不指定?它将在当前模式中创建它,这可能与
&T_SCHEMA不同。如果它始终是当前模式,您可以简化代码,因为您不需要变量。或者通过尝试创建表来进一步简化它,并根据需要处理 ORA-00955 name is already used 异常。
标签: oracle plsql dynamic-sql