在PL/SQL Developer中创建私有临时表报错ORA-00905求助
解决ORA-00905错误:Oracle私有临时表创建问题
你的代码触发ORA-00905错误,核心原因是Oracle私有临时表的创建语法不符合规范,主要有两个关键点没做到位:
1. 私有临时表的命名必须遵循特定前缀规则
Oracle要求私有临时表的名称必须以固定前缀开头:
- 会话级私有临时表:前缀为
ORA$PTT_(表结构和数据会保留到会话结束) - 事务级私有临时表:前缀为
ORA$PTD_(表会在事务提交/回滚后自动删除)
你的表名my_temp_table没有加这个前缀,这是错误的根源之一。
2. 必须指定ON COMMIT子句定义表的生命周期
创建私有临时表时,必须通过ON COMMIT子句明确表的存活周期,可选值有:
ON COMMIT PRESERVE DEFINITION:会话级,提交事务后表结构和数据都保留,直到会话断开ON COMMIT DROP TABLE:事务级,提交或回滚事务后,表直接被删除
修正后的代码示例
会话级私有临时表(常用场景)
CREATE PRIVATE TEMPORARY TABLE ORA$PTT_my_temp_table ( id NUMBER, description VARCHAR2(20) ) ON COMMIT PRESERVE DEFINITION;
插入数据测试
INSERT INTO ORA$PTT_my_temp_table VALUES (1, 'Sample 1'); INSERT INTO ORA$PTT_my_temp_table VALUES (2, 'Sample 2'); COMMIT; -- 会话级表提交后数据依然存在 SELECT * FROM ORA$PTT_my_temp_table; -- 可以正常查询到数据
事务级私有临时表
CREATE PRIVATE TEMPORARY TABLE ORA$PTD_my_temp_table ( id NUMBER, description VARCHAR2(20) ) ON COMMIT DROP TABLE;
这种表在执行COMMIT或ROLLBACK后,表会被自动删除,后续无法再查询到。
另外补充一点:私有临时表仅对当前会话可见,其他会话完全看不到这个表,这也是它和普通临时表的核心区别之一。
内容的提问来源于stack exchange,提问作者ilia rukhadze
相关产品推荐
相关产品推荐

