有人可以指导我这个查询有什么问题吗?在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是否实际上是在创建表,但是没有。这有什么不对?我错过了什么?请指导。
答案 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;