判断表是否存在:SELECT COUNT(*) FROM user_tables WHERE table_name = 'YOUR_TABLE_NAME'; 如果返回0,则表不存在。
删除表:DROP TABLE your_table_name PURGE;
创建表:CREATE TABLE your_table_name (id NUMBER, name VARCHAR2(50));
完整PL/SQL示例:
DECLARE
v_count NUMBER;
BEGIN
SELECT COUNT(*) INTO v_count FROM user_tables WHERE table_name = 'TEST_TABLE';
IF v_count > 0 THEN
EXECUTE IMMEDIATE 'DROP TABLE TEST_TABLE PURGE';
END IF;
EXECUTE IMMEDIATE 'CREATE TABLE TEST_TABLE (id NUMBER PRIMARY KEY, name VARCHAR2(50))';
END;
/
方法一:使用USER_TABLES视图判断
要判断一个表是否存在,可以查询USER_TABLES视图:
SELECT COUNT(*) FROM USER_TABLES WHERE TABLE_NAME='表名';
如果返回值为0,说明表不存在。
方法二:PL/SQL动态SQL
BEGIN
FOR r IN (SELECT table_name FROM user_tables WHERE table_name='YOUR_TABLE') LOOP
EXECUTE IMMEDIATE 'DROP TABLE ' || r.table_name || ' PURGE';
END LOOP;
EXCEPTION
WHEN OTHERS THEN NULL;
END;
/
完整脚本实例
-- 判断并删除表
DECLARE
cnt NUMBER;
BEGIN
SELECT COUNT(1) INTO cnt FROM user_tables t WHERE UPPER(t.table_name) = UPPER('test_table');
IF cnt > 0 THEN
EXECUTE IMMEDIATE 'DROP TABLE test_table PURGE';
DBMS_OUTPUT.PUT_LINE('表已删除');
ELSE
DBMS_OUTPUT.PUT_LINE('表不存在');
END IF;
END;
/
-- 创建表
CREATE TABLE test_table(
id NUMBER PRIMARY KEY,
name VARCHAR2(100)
);
使用ALL_TABLES查询所有用户表
如果要检查其他schema的表:
SELECT COUNT(*) FROM ALL_TABLES WHERE owner='SCHEMA_NAME' AND table_name='TABLE_NAME';
异常处理方式判断
BEGIN
EXECUTE IMMEDIATE 'SELECT 1 FROM your_table';
EXCEPTION
WHEN OTHERS THEN
-- 表不存在,创建表
EXECUTE IMMEDIATE 'CREATE TABLE your_table ...';
END;
批量处理多个表
DECLARE
TYPE t_table IS TABLE OF VARCHAR2(30);
v_tables t_table := t_table('TABLE1','TABLE2');
BEGIN
FOR i IN 1..v_tables.COUNT LOOP
BEGIN
EXECUTE IMMEDIATE 'DROP TABLE ' || v_tables(i) || ' PURGE';
EXCEPTION WHEN OTHERS THEN NULL;
END;
END LOOP;
END;
FAQ
Q: 如何判断系统表是否存在?
A: 查询DBA_TABLES视图,需DBA权限:SELECT COUNT(*) FROM DBA_TABLES WHERE owner='SYS' AND table_name='表名';
Q: DROP TABLE失败怎么办?
A: 使用PURGE参数彻底删除,或检查表是否有依赖对象。
Q: 如何判断视图是否存在?
A: 查询USER_VIEWS:SELECT COUNT(*) FROM USER_VIEWS WHERE view_name='视图名';
Q: 表名大小写敏感吗?
A: Oracle默认大写,使用双引号可指定大小写。
Q: 动态创建表需要什么权限?
A: 需要CREATE TABLE权限。