Oracle SQL动态判断新表是否存在并执行数据插入或提示的实现
Oracle动态判断表存在并插入数据实现方案
原有代码问题
- 语法不合法:普通SQL无法实现「先判断对象存在再执行DML」的逻辑,表不存在时会直接触发
ORA-00942 表或视图不存在编译错误,判断逻辑不会生效 - 功能逻辑缺失:仅判断了近12小时有新建对象,未限定对象名称为
AAA_AAA、对象类型为表 - DML语法错误:插入数据应该用
INSERT INTO ... SELECT语法,你写的SELECT ... INTO是PL/SQL变量赋值或创建表的语法,无法实现插入已有目标表的需求
正确实现方案
需要用PL/SQL匿名块+动态SQL实现,避免编译阶段提前校验不存在的表:
DECLARE v_cnt NUMBER; BEGIN -- 校验近12小时内是否存在AAA_AAA表 SELECT COUNT(*) INTO v_cnt FROM user_objects WHERE object_name = 'AAA_AAA' AND object_type = 'TABLE' AND created >= SYSDATE - 12/24; IF v_cnt > 0 THEN -- 动态执行插入,避免表不存在时的编译报错 EXECUTE IMMEDIATE 'INSERT INTO BBB_BBB(emp_id, emp_name, emp_salary) SELECT emp_id, emp_name, emp_salary FROM AAA_AAA'; DBMS_OUTPUT.PUT_LINE('插入完成,共写入'||SQL%ROWCOUNT||'条数据'); COMMIT; ELSE DBMS_OUTPUT.PUT_LINE('无新表存在'); END IF; EXCEPTION WHEN OTHERS THEN ROLLBACK; DBMS_OUTPUT.PUT_LINE('执行异常:'||SQLERRM); END; /
注意事项
- 执行前先运行
SET SERVEROUTPUT ON;开启输出,才能看到返回的提示信息 - 提前确认目标表
BBB_BBB存在,且emp_id、emp_name、emp_salary三个字段的类型和长度与AAA_AAA完全匹配 - 如果目标表不存在需要先创建,可在插入逻辑前追加动态建表语句
内容的提问来源于stack exchange,提问作者user14937341
相关产品推荐
相关产品推荐

