Oracle SQL - 如果存在,Drop Table&创建

时间:2015-07-23 11:15:43

标签: sql oracle plsql

有人可以指导我这个查询有什么问题吗?在SQL Server中,我们只检查表的Object_ID的存在以删除它并重新创建它。我是Oracle新手并编写了这个查询:

declare Table_exists INTEGER;
 BEGIN
 Select count(*) into Table_exists from sys.all_tables where table_name='TABLENAME1';
 EXCEPTION
          WHEN NO_DATA_FOUND
          THEN
          Table_Exists :=0;
if(table_exists)=1
  Then
  Execute Immediate 'Drop Table TABLENAME1;'
  'Create Table TABLENAME1;';
  DBMS_OUTPUT.PUT_LINE('Table Dropped and Re-Created!');
Else 
     Execute Immediate 'Create Table TABLENAME1;';
     DBMS_OUTPUT.PUT_LINE('New Table Created!');
END IF;
END;

我得到输出 - ANONYMOUS BLOCK COMPLETED,但是没有创建表。该表以前是存在的,所以我放弃它以检查PL / SQL是否实际上是在创建表,但是没有。这有什么不对?我错过了什么?请指导。

3 个答案:

答案 0 :(得分:2)

当您使用all_tables过滤结果时 添加where owner = 'your_schema'的架构 或使用sys.user_tables

  

ALL_TABLES描述了当前用户可以访问的关系表

     

USER_TABLES描述了当前用户拥有的关系表。

使用execute_emmidiate时,从查询中删除;;

修改后的查询;

DECLARE 
    Table_exists INTEGER;
BEGIN
    Select count(*) into Table_exists from sys.user_tables where table_name='TABLENAME1';
    --or
    --Select count(*) into Table_exists from sys.all_tables 
    --where table_name='TABLENAME1' and owner = 'your_DB';
    if table_exists = 1 Then
        Execute Immediate 'Drop Table TABLENAME1';
        Execute Immediate 'Create Table TABLENAME1(num number)';
        DBMS_OUTPUT.PUT_LINE('Table Dropped and Re-Created!');
    Else 
        Execute Immediate 'Create Table TABLENAME1(num number)';
        DBMS_OUTPUT.PUT_LINE('New Table Created!');
    END IF;
END;

答案 1 :(得分:1)

首先注意:

Select count(*) into Table_exists
from sys.all_tables
where table_name = 'TABLENAME1';

始终返回一行。您不需要异常处理。

我最好的猜测是你有多个名为TABLENAME1的表。运行此查询以查找:

Select *
from sys.all_tables
where table_name = 'TABLENAME1';

Oracle存储您可以访问的所有所有者的表。您可能还想检查OWNER_NAME子句中的where

但是,您似乎理解异常处理。因此,只需删除表,忽略任何错误,然后重新创建表。

答案 2 :(得分:0)

EXCEPTION子句持续到下一个END而不仅仅是下一个语句。如果你想在捕获异常后继续,你需要添加一个额外的BEGIN / END:

declare 
    Table_exists INTEGER; 
BEGIN 
    BEGIN
        Select count(*) into Table_exists from sys.all_tables where table_name='TABLENAME1'; 
    EXCEPTION 
    WHEN NO_DATA_FOUND THEN 
        Table_Exists :=0; 
    END;

    if(table_exists)=1 Then 
        Execute Immediate 'Drop Table TABLENAME1;'     
        Execute Immediate 'Create Table TABLENAME1;'; 
        DBMS_OUTPUT.PUT_LINE('Table Dropped and Re-Created!'); 
    Else 
        Execute Immediate 'Create Table TABLENAME1;'; 
        DBMS_OUTPUT.PUT_LINE('New Table Created!'); 
    END IF; 
END;

正如Gordon所指出的,在这种情况下并不真正需要EXCEPTION子句,因为count(*)将始终返回一行。所以以下就足够了:

declare 
    Table_exists INTEGER; 
BEGIN 
    Select count(*) into Table_exists from sys.all_tables where table_name='TABLENAME1'; 

    if(table_exists)=1 Then 
        Execute Immediate 'Drop Table TABLENAME1;'     
        Execute Immediate 'Create Table TABLENAME1;'; 
        DBMS_OUTPUT.PUT_LINE('Table Dropped and Re-Created!'); 
    Else 
        Execute Immediate 'Create Table TABLENAME1;'; 
        DBMS_OUTPUT.PUT_LINE('New Table Created!'); 
    END IF; 
END;