由于才开始使用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'