oracle 18c新特性私有临时表

发布于:2021-02-04 14:00:20

0

282

0

oracle oracle 18c 私有临时表 数据库

Active Data Guard数据库现在不再只是“只读”数据库—它们现在已成为“大部分读取”数据库,主要用于报告目的,但在某种程度上也允许DML活动。

oracle18c的一个新特性是私有临时表。

专用临时表与全局临时表在某些方面有所不同。它们不存储在磁盘上,而仅存储在内存中,并且仅对创建它们的会话可见。表的名称必须以字符串' ORA $ PTT '为前缀。

它们是临时数据库对象,在事务结束或会话结束时被删除。同一用户的不同会话可以对私有临时表使用相同的名称。

当以只读为主的应用程序还需要执行一些DML活动时,这些表非常有用,比如在临时表中插入或更新一些临时数据,然后查询几次,然后在事务或会话结束时删除这些临时数据。

让我们看看这个功能。

我们以用户HR的身份连接到可插拔数据库PDB1,但连接到主备只读数据库。

用户HR的会话1

SQL> CREATE PRIVATE TEMPORARY TABLE ORA$PTT_ADG_SESSIONS
 2   (username      varchar2(20), sid number , serial# number)
 3  ON COMMIT PRESERVE DEFINITION;

Table created.

SQL> insert into ORA$PTT_ADG_SESSIONS
select s.username          i_username, to_char(s.sid)          i_sid, to_char(s.serial#)      i_serial
from
v$session s, v$process p
where
s.paddr = p.addr
and
sid = (select sid from v$mystat where rownum = 1);  

1 row created.

SQL> select * from ORA$PTT_ADG_SESSIONS;

USERNAME    SID    SERIAL#
-------------------- ---------- ----------
HR    465      20742

用户HR的会话2请注意表名相同,但数据不同。

SQL> CREATE PRIVATE TEMPORARY TABLE ORA$PTT_ADG_SESSIONS
 2  (username      varchar2(20), sid number , serial# number)
 3  ON COMMIT PRESERVE DEFINITION;

Table created.

SQL> insert into ORA$PTT_ADG_SESSIONS
select s.username          i_username, to_char(s.sid)          i_sid, to_char(s.serial#)      i_serial
from
v$session s, v$process p
where
s.paddr = p.addr
and
sid = (select sid from v$mystat where rownum = 1);  2    3    4    5    6    7    8  

1 row created.

SQL>  select * from ORA$PTT_ADG_SESSIONS;

USERNAME    SID    SERIAL#
-------------------- ---------- ----------
HR    472      46742

SQL>


以用户身份重新连接HR

SQL> conn hr/hr@pdb1
Connected.

SQL> select * from ORA$PTT_ADG_SESSIONS;
select * from ORA$PTT_ADG_SESSIONS
             *
ERROR at line 1:
ORA-00942: table or view does not exist

具有提交时丢弃定义的私有临时表

SQL>  CREATE PRIVATE TEMPORARY TABLE ORA$PTT_ADG_SESSIONS
 2   (username      varchar2(20), sid number , serial# number)
 3  ON COMMIT DROP DEFINITION;

Table created.

SQL>  insert into ORA$PTT_ADG_SESSIONS
select s.username          i_username, to_char(s.sid)          i_sid, to_char(s.serial#)      i_serial
from
v$session s, v$process p
where
s.paddr = p.addr
and
sid = (select sid from v$mystat where rownum = 1);  

1 row created.

SQL> select * from ORA$PTT_ADG_SESSIONS;

USERNAME    SID    SERIAL#
-------------------- ---------- ----------
HR    465      20742

SQL> update ORA$PTT_ADG_SESSIONS set USERNAME='NOBODY';

1 row updated.

SQL> select * from ORA$PTT_ADG_SESSIONS;

USERNAME    SID    SERIAL#
-------------------- ---------- ----------
NOBODY    465      20742

SQL> commit;

Commit complete.

SQL>  select * from ORA$PTT_ADG_SESSIONS;
select * from ORA$PTT_ADG_SESSIONS
              *
ERROR at line 1:
ORA-00942: table or view does not exist