我有一个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的计数显示为零。它会转向其他条件而不是IF条件。可能是什么原因?
答案 0 :(得分:0)
当你这样做时
create table employee( id number,name varchar2(50))
表名是not a quoted identifier(这很好!),数据字典中的对象名称将是大写的等效EMPLOYEE
。
当您查询数据字典时,名称需要匹配该情况:
l_query:= 'select TABLE_NAME from DBA_tables WHERE OWNER = :OWNER and TABLE_NAME IN (''EMPLOYEE'',''APPRAISAL'')';
当你查看集合时,它也需要是大写的:
IF 'EMPLOYEE' member of table_list THEN
你的USING
条款看起来也错了;
USING '.&T_SCHEMA.' ;
表示它将查找所有者值'.HR'
,而不仅仅是'HR'
,除非您已经做了一些努力来创建名称中带点的新架构(作为引用标识符)没有该所有者的对象。您使用了一个尾随点 - 大概是 - 终止替换变量名称,这很好,但这里并不是严格要求的。你不应该有一个领先的点:
USING '&T_SCHEMA.' ;
因此,目前您使用不存在的所有者名称和表名填充您的集合,因为它们与数据字典中的实际名称不匹配。
答案 1 :(得分:0)
或者,您可以使用以下内容来实现目标:
preg_match