Oracle if-else查询检查表是否存在否则显示消息?

时间:2014-04-29 07:00:46

标签: database oracle

当我第一次运行下面的查询它的工作,但在我再次运行此查询后我得到异常

 Select count(*) into rec from all_tables where table_name='DefaultTable';
        if(rec=1) then
           CREATE TABLE  DefaultTable(
                  Code INT NOT NULL,
                  Code1 INT NOT NULL,
                  ResultCode INT NOT NULL,

                  CONSTRAINT DefaultTable_PK PRIMARY KEY(Code,Code1)
            );
            else
            PRMOPT DefaultTable Already Exist //To print in Console
             end if;

谁能说出我做错了什么?写上面的查询我做错了什么?

   Error starting at line 2 in command:
        if(rec=1) then
        Error report:
        Unknown Command

        Error starting at line 3 in command:
         CREATE TABLE  DefaultTable(
                          Code INT NOT NULL,
                          Code1 INT NOT NULL,
                          ResultCode INT NOT NULL,

                          CONSTRAINT DefaultTable_PK PRIMARY KEY(Code,Code1)
            Error at Command Line:3 Column:14
            Error report:
            SQL Error: ORA-00955: name is already used by an existing object
            00955. 00000 -  "name is already used by an existing object"
            *Cause:    
            *Action:

            Error starting at line 16 in command:
            else
            Error report:
            Unknown Command

            Error starting at line 17 in command:
            PRMOPT Table Already Exist
            Error report:
            Unknown Command

            Error starting at line 18 in command:
            end if
            Error report:
            Unknown Command

2 个答案:

答案 0 :(得分:1)

好吧,据我所知,作者试图在一个SQL查询中执行此操作。但是在Oracle中,你不能在简单的sql中使用IF语句。此外,即使您使用PL / SQL,也不允许直接从PL / SQL代码调用DDL语句,因此您应该使用动态SQL。我认为,以下脚本将执行您想要的操作:

   DECLARE
     rec NUMBER;  
   BEGIN
      SELECT COUNT(*) INTO rec FROM all_tables WHERE table_name='DEFAULTTABLE';
      IF (rec=0) THEN   
       EXECUTE IMMEDIATE 'CREATE TABLE  DefaultTable(
                  Code INT NOT NULL,
                  Code1 INT NOT NULL,
                  ResultCode INT NOT NULL,
                  CONSTRAINT DefaultTable_PK 
                       PRIMARY KEY(Code,Code1,ResultCode)
       )';
      ELSE
        dbms_output.put_line('DefaultTable Already Exist');
      END IF;
    END;

请注意,为了查看通过dbms_output打印的消息,您应该执行:

SET SERVEROUTPUT ON;

答案 1 :(得分:0)

如果您阅读错误消息,您会注意到: ORA-00955:名称已被现有对象使用

这意味着您正在尝试创建已存在的表。这就解释了为什么它第一次运行而不是之后的运行。

检查all_tables中的条目,您会发现Oracle以大写形式创建表名。所以检查'DEFAULTTABLE'。