由于才开始使用PL/SQL来进行Oracle的客户端操作,由于以前使用sql 2005 来执行“创建表之前判断表是否存在 如果有就删除表,再创建”的操作语句非常简单:
if exists ( select * from sysobjects where id = OBJECT_ID('STUDENTS]') and OBJECTPROPERTY(id, 'IsUserTable') = 1) DROP TABLE [STUDENTS]
然而令我非常郁闷的是,用同样的方法在PL/SQL里却不能运行,提示编译错误。
后来去网上查了相关的帖子之后自己写了如下方法实现:
declare cnt number; begin ---查询要创建的表是否存在 select count(*)into cnt from user_tables where table_name='STUDENTS'; ---如果存在则删除该表 if cnt>0 then execute immediate 'drop table STUDENTS'; dbms_output.put_line('表存在,删除成功!'); end if; ---删除之后再创建该表 execute immediate 'CREATE TABLE STUDENTS ( SNO NUMERIC(6, 0) NOT NULL, SNAME CHAR (8) NOT NULL , AGE NUMERIC(3,0) , SEX CHAR(2) , BPLACE CHAR(20) , PRIMARY KEY(SNO) ) tablespace Users' ; end;
user_tables 中要求表名都是大写
对比之后,大家不难发现,PL/SQL是把sql语句做了一次包裹,才会避开编译检查。
http://blog.csdn.net/t673afa/article/details/5489687
————————————————————————————
1.当前用户下是否有某个表
select count(*) from user_tables where table_name ='TABLE_NAME';
注意,一般情况下,引号里面的table_name要全部用大写。
如果结果为1,表示有这个表,为0表示没有这个表。
2.某个用户下是否有某个表?
select count(*) from dba_tables where owner = 'USER_NAME' andtable_name = 'TABLE_NAME';
3.当前用户下的是否有某个(Package/Procedure/Function)
SELECT * FROM USER_PROCEDURES WHERE OBJECT_TYPE='FUNCTION' ANDOBJECT_NAME='FUNCTION_NAME'
注意OBJECT_TYPE='FUNCTION' 一定要大写;
SELECT * FROM USER_PROCEDURES WHERE OBJECT_TYPE='PROCEDURE' ANDOBJECT_NAME='PROCEDURE_NAME'
注意OBJECT_TYPE='PROCEDURE' 一定要大写;
判断某个Package是否存在
SELECT * FROM USER_PROCEDURES WHEREOBJECT_NAME='PACKAGE_NAME' ANDOBJECT_TYPE='PACKAGE'
判断某个Package中的过程是否存在
SELECT * FROM USER_PROCEDURES WHEREOBJECT_NAME='PACKAGE_NAME' ANDPROCEDURE_NAME='PROCEDURE_NAME' ANDOBJECT_TYPE='PACKAGE'