该值未正确存储在数组中

时间:2016-10-04 08:31:48

标签: oracle plsql dynamic-sql

我有一个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条件。可能是什么原因?

2 个答案:

答案 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