Oracle:如果表存在

我正在为Oracle数据库编写一些迁移脚本,并且希望Oracle有类似MySQL的IF EXISTS结构。

具体来说,每当我想在MySQL中删除表时,我都会这样做

DROP TABLE IF EXISTS `table_name`;

这样,如果表不存在, DROP不会产生错误,脚本可以继续。

Oracle是否有类似的机制? 我意识到我可以使用以下查询来检查表是否存在

SELECT * FROM dba_tables where table_name = 'table_name';

但是将DROPDROP绑在一起的语法正在逃避我。


#1楼

只是想发布一个完整的代码来创建一个表,如果已经存在使用Jeffrey的代码就放弃它(对他而言,不是我!)。

1BEGIN 2 BEGIN 3 EXECUTE IMMEDIATE 'DROP TABLE tablename'; 4 EXCEPTION 5 WHEN OTHERS THEN 6 IF SQLCODE != -942 THEN 7 RAISE; 8 END IF; 9 END; 10 11 EXECUTE IMMEDIATE 'CREATE TABLE tablename AS SELECT * FROM sourcetable WHERE 1=0'; 12 13END;

#2楼

我更喜欢指定表和架构所有者。

注意区分大小写。 (参见下面的“上部”条款)。

我扔了几个不同的对象,以表明可以在TABLEs之外的地方使用。

.............

1declare 2 v_counter int; 3begin 4 select count(*) into v_counter from dba_users where upper(username)=upper('UserSchema01'); 5 if v_counter > 0 then 6 execute immediate 'DROP USER UserSchema01 CASCADE'; 7 end if; 8end; 9/ 10 11 12 13CREATE USER UserSchema01 IDENTIFIED BY pa$$word 14 DEFAULT TABLESPACE users 15 TEMPORARY TABLESPACE temp 16 QUOTA UNLIMITED ON users; 17 18grant create session to UserSchema01;

和一个TABLE示例:

1declare 2 v_counter int; 3begin 4 select count(*) into v_counter from all_tables where upper(TABLE_NAME)=upper('ORDERS') and upper(OWNER)=upper('UserSchema01'); 5 if v_counter > 0 then 6 execute immediate 'DROP TABLE UserSchema01.ORDERS'; 7 end if; 8end; 9/

#3楼

可悲的是,如果存在则没有丢弃,或者如果不存在则不会创建

您可以编写一个plsql脚本来包含逻辑。

http://download.oracle.com/docs/cd/B12037_01/server.101/b10759/statements_9003.htm

我对Oracle语法不太了解,但我认为@ Erich的脚本会是这样的。

1declare 2cant integer 3begin 4select into cant count(*) from dba_tables where table_name='Table_name'; 5if count>0 then 6BEGIN 7 DROP TABLE tableName; 8END IF; 9END;

#4楼

在oracle中没有'DROP TABLE IF EXISTS',你必须做select语句。

试试这个(我没有使用oracle语法,所以如果我的变量是ify,请原谅我):

1declare @count int 2select @count=count(*) from all_tables where table_name='Table_name'; 3if @count>0 4BEGIN 5 DROP TABLE tableName; 6END

#5楼

1declare 2 c int; 3begin 4 select count(*) into c from user_tables where table_name = upper('table_name'); 5 if c = 1 then 6 execute immediate 'drop table table_name'; 7 end if; 8end;

这是用于检查当前模式中的表是否存在。 要检查给定表是否已存在于不同的模式中,您必须使用all_tables而不是user_tables并添加条件all_tables.owner = upper('schema_name')

点赞
收藏

评论区

加载中...

相关推荐

MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1

文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

MySQL部分从库上面因为大量的临时表tmp_table造成慢查询

背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_

皕杰报表之UUID

​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为

手写Java HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22

2020年前端实用代码段,为你的工作保驾护航

有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )