大家都知道,临时表分为事务级的和会话级的,如:
CREATE GLOBAL TEMPORARY TABLE admin_work_area--事务级
(
name varchar(20),
v_count int
)
ON COMMIT DELETE ROWS;
CREATE GLOBAL TEMPORARY TABLE admin_work_area--会话级
(
name varchar(20),
v_count int
)
ON COMMIT PRESERVE ROWS;
但是我平时用到的都是会话级的,因为总要展示数据,会话级的能存住数据,不知道事务级的临时表都有哪些应用呢,请大家谈一下各自的认识或遇到使用事务级临时表的情况。
CREATE GLOBAL TEMPORARY TABLE admin_work_area--事务级
(
name varchar(20),
v_count int
)
ON COMMIT DELETE ROWS;
CREATE GLOBAL TEMPORARY TABLE admin_work_area--会话级
(
name varchar(20),
v_count int
)
ON COMMIT PRESERVE ROWS;
但是我平时用到的都是会话级的,因为总要展示数据,会话级的能存住数据,不知道事务级的临时表都有哪些应用呢,请大家谈一下各自的认识或遇到使用事务级临时表的情况。
解决方案 »
- 【急急急】大家有空的话帮我看下
- 求救!!!!proc执行错误
- oracle11g和oracle12i的区别
- 字符串操作求助
- oracle 条件限制语句
- 怎么用exp导出user1用户中的table1的表和全部数据、table2的表结构和用户中的序列的sequ1,seque2
- 删除200万条数据,执行一夜未果,怀疑是回滚段问题,怎么解决
- 初级,快来看呀,100分
- 超级菜的问题,,,在oracle中用apps用户登录pl/sql developer 的问题
- oracle 10g手动建库,启动时ORA-01092: ORACLE instance termin ...
- LINUX下10G BLOB字段中中文读取乱码问题
- 问一条sql语句的问题(关联)
CREATE GLOBAL TEMPORARY ( )
ON COMMIT PRESERVE ROWS;
事务级的临时表
CREATE GLOBAL TEMPORARY ( )
ON COMMIT DELETE ROWS; --ON COMMIT DELETE ROWS 说明临时表是事务指定,每次提交后ORACLE将截断表(删除全部行)
--ON COMMIT PRESERVE ROWS 说明临时表是会话指定,当中断会话时ORACLE将截断表。
1) 会话特有的临时表
CREATE GLOBAL TEMPORARY ( )
ON COMMIT PRESERVE ROWS; 2) 事务特有的临时表
CREATE GLOBAL TEMPORARY ( )
ON COMMIT DELETE ROWS;
CREATE GLOBAL TEMPORARY TABLE MyTempTable
所建的临时表虽然是存在的,但是如果insert 一条记录然后用别的连接登上去select,记录是空的。
--ON COMMIT DELETE ROWS 说明临时表是事务指定,每次提交后ORACLE将截断表(删除全部行)
--ON COMMIT PRESERVE ROWS 说明临时表是会话指定,当中断会话时ORACLE将截断表。 2 动态创建 create or replace procedure pro_temp(v_col1 varchar2,v_col2 varchar2) as
v_num number;
begin
select count(*) into v_num from user_tables where table_name='T_TEMP';
--create temporary table
if v_num<1 then
execute immediate 'CREATE GLOBAL TEMPORARY TABLE T_TEMP (
COL1 VARCHAR2(10),
COL2 VARCHAR2(10)
) ON COMMIT delete ROWS';
end if;
--insert data
execute immediate 'insert into t_temp values(''' v_col1 ''',''' v_col2 ''')';
execute immediate 'select col1 from t_temp' into v_num;
dbms_output.put_line(v_num);
execute immediate 'delete from t_temp';
commit;
execute immediate 'drop table t_temp';
end pro_temp;
测试: 15:23:54 SQL> set serveroutput on
15:24:01 SQL> exec pro_temp('11','22');
11 PL/SQL 过程已成功完成。 已用时间: 00: 00: 00.79
15:24:08 SQL> desc t_temp;
ERROR:
ORA-04043: 对象 t_temp 不存在 3 特性和性能(与普通表和视图的比较)
临时表只在当前连接内有效
临时表不建立索引,所以如果数据量比较大或进行多次查询时,不推荐使用
数据处理比较复杂的时候时表快,反之视图快点
在仅仅查询数据的时候建议用游标: open cursor for 'sql clause';
SQL> create or replace procedure pro_temp(v_col1 varchar2,v_col2 varchar2) as
2 v_num number;
3 begin
4 select count(*) into v_num from user_tables where table_name='T_TEMP';
5 --create temporary table
6 if v_num<1 then
7 execute immediate 'CREATE GLOBAL TEMPORARY TABLE T_TEMP (
8 COL1 VARCHAR2(10),
9 COL2 VARCHAR2(10)
10 ) ON COMMIT delete ROWS';
11 end if;
12 --insert data
13 execute immediate 'insert into t_temp values(''' v_col1 ''',''' v_col2 ''')';
14 execute immediate 'select col1 from t_temp' into v_num;
15 dbms_output.put_line(v_num);
16 execute immediate 'delete from t_temp';
17 commit;
18 execute immediate 'drop table t_temp';
19 end pro_temp;
20 /警告: 创建的过程带有编译错误。
PROCEDURE PRO_TEMP 出现错误:LINE/COL ERROR
-------- -----------------------------------------------------------------
2/2 PLS-00103: 出现符号 ""在需要下列之一时:
begin function package pragma
procedure subtype type use <an identifier>
<a double-quoted delimited-identifier> form current cursor
external language
请问4楼的大侠不报这样的错误吗,你是怎么执行的呀