解决方案:登录Oracle数据库,执行以下SQL手动清理scratch表和视图:DROP TABLE MDSYS.SDO_TIN_SCRATCH CASCADE CONSTRAINTS; DROP VIEW MDSYS.SDO_TIN_SCRATCH_VIEW; 然后重试CREATE_TIN操作。如果是远程处理,使用SQL*Plus或PL/SQL Developer连接数据库执行清理命令,重启相关会话后问题解决。
故障描述
ORA-54655: CREATE_TIN内部错误: MDSYS.SDO_TIN_PKG.CREATE_TIN() scratch表/视图已存在。执行CREATE_TIN函数时出现此错误,通常是因为之前的操作异常中断,导致临时scratch表或视图未被自动清理。
手动清理步骤
1. 以SYS或有DBA权限的用户登录数据库。2. 查询是否存在scratch对象:SELECT * FROM user_objects WHERE object_name LIKE '%TIN_SCRATCH%'; 3. 执行DROP:DROP TABLE mdsys.sdo_tin_scratch PURGE; DROP VIEW mdsys.sdo_tin_scratch_view; 4. 提交事务:COMMIT; 5. 验证清理:SELECT object_name FROM user_objects WHERE object_name LIKE '%TIN_SCRATCH%'; 无结果即清理成功。
远程处理方案
远程场景下,通过VPN或SSH隧道连接Oracle服务器,使用sqlplus sys/password@//host:port/service as sysdba 执行清理SQL。或者使用Toad或DBeaver工具远程连接,一键执行脚本。清理后刷新SDO几何缓存:EXEC MDSYS.SDO_MIGRATE.clear_cache;
预防措施
在CREATE_TIN前检查并清理:BEGIN EXECUTE IMMEDIATE 'DROP TABLE MDSYS.SDO_TIN_SCRATCH PURGE'; EXCEPTION WHEN OTHERS THEN NULL; END; / 这样避免错误重复发生。
案例分享
在生产环境ArcSDE for Oracle中导入TIN数据时遇此错,手动连sys删掉mdsys用户下的SDO_TIN_SCRATCH表和视图,重试成功。注意权限,普通用户需授权。
FAQ
Q: 为什么会出现scratch表已存在?
A: CREATE_TIN操作中断未清理临时对象导致。
Q: 清理后还能再用CREATE_TIN吗?
A: 可以,直接重试。
Q: 非sys用户能清理吗?
A: 可以,用MD_SYS schema权限执行。
Q: 远程工具推荐?
A: SQL Developer免费好用。