由于才开始使用PL/SQL来进行Oracle的客户端操作,由于以前使用sql 2005 来执行“创建表之前判断表是否存在 如果有就删除表,再创建”的操作语句非常简单:
1: if exists (
2: select * from sysobjects
3: where id = OBJECT_ID('STUDENTS]') and OBJECTPROPERTY(id, 'IsUserTable') = 1)
4: DROP TABLE [STUDENTS]
然而令我非常郁闷的是,用同样的方法在PL/SQL里却不能运行,提示编译错误。
后来去网上查了相关的帖子之后自己写了如下方法实现:
1: declare
2: cnt number;
3: begin
4: ---查询要创建的表是否存在
5: select count(*)into cnt from user_tables where table_name='STUDENTS';
6:
7: ---如果存在则删除该表
8: if cnt>0 then
9: execute immediate 'drop table STUDENTS';
10: dbms_output.put_line('表存在,删除成功!');
11: end if;
12: ---删除之后再创建该表
13: execute immediate 'CREATE TABLE STUDENTS
14: (
15: SNO NUMERIC(6, 0) NOT NULL,
16: SNAME CHAR (8) NOT NULL ,
17: AGE NUMERIC(3,0) ,
18: SEX CHAR(2) ,
19: BPLACE CHAR(20) ,
20: PRIMARY KEY(SNO)
21: )
22: tablespace Users' ;
23: end;
对比之后,大家不难发现,PL/SQL是把sql语句做了一次包裹,才会避开编译检查。