如题。
解决方案 »
- 高手进来帮忙 dblink调用远程存储过程的问题
- Number of responses does not match queries
- Oracle语句遇到难题,急~~~在线等~~~~~~
- 关于字符串相加,基础
- 视图问题:1,对于多表联接的视图,DML操作时,是怎么达到增删改的目的的?2,什么情况下会对视图DML,一般不是直接增删改表么?
- 通过windows xp 的服务启动不了oracle数据库,只能让数据库进入已装载状态?
- 问一个弱弱的关于oracle基本的管理问题
- VC环境下如何调用PL/SQL程序块?
- 插入全年日期(Oracle)
- 数据库更改内容
- SQL*Net more data from client
- 怎么写这条sql语句
(zi number,zi2 char(5) )
ON COMMIT PRESERVE ROWS;
--ON COMMIT PRESERVE ROWS 表示会话中断 数据没有了
create global temporary table tmp(id number,name varchar2(20)) on commit delete rows;
详细可参见:http://blog.csdn.net/wyzxg/archive/2007/11/13/1882347.aspx
create table tb(zi number,zi2 char(5)) tablespace temp上网查了 不行 互相学习
with tab as
(
select chr(rownum) from dual connect by rownum <100
)
-- 示例如下:-------------------创建临时表-------------------------------------
DROP TABLE mBlogreview_tmp_proc;
Create Global Temporary Table mBlogreview_tmp_proc
(rid NUMBER(18,0) ,
reviewid NUMBER(18,0),
blogid NUMBER(18,0),
reviewownername VARCHAR2(30),
reviewcontent VARCHAR2(4000),
reviewcreationdate VARCHAR2(30))
On Commit preserve Rows;
-------------创建包----------------------------------------------
Create or replace package pkg_mBlogreview_se
as
type myrctype is ref cursor;
procedure mBlogreview_se_proc(v_blogID number,v_page number default 1,v_pageSize number default 5,v_num out number,p_rc out myrctype);
end pkg_mBlogreview_se;
/--------------------------------------------------------------------
create or replace package body pkg_mBlogreview_se
as
procedure mBlogreview_se_proc(v_blogID number,v_page number default 1,v_pageSize number default 5,v_num out number,p_rc out myrctype)
is
sqlstr VARCHAR2(2000);
begin
sqlstr :=
'INSERT INTO mBlogreview_tmp_proc(rid,reviewid,blogid,reviewownername,reviewcontent,reviewcreationdate)
SELECT ROW_NUMBER() over(order by ReviewCreationDate desc) as rid, reviewid,BlogID,
reviewownername,reviewContent,to_char(ReviewCreationDate,''YYYY-MM-DD HH24:MI:SS'') as reviewcreationdate
FROM mvnforumBlogreview where blogid='''||v_blogID||'''';
execute immediate sqlstr;
select count(*) into v_num from mBlogreview_tmp_proc;
sqlstr :='SELECT t.rid ,t.reviewid,t.blogid, t.reviewownername,t.reviewContent,t.reviewcreationdate from mBlogreview_tmp_proc t ';
sqlstr :=sqlstr||' where t.rid>(:v_page-1)*:v_pageSize and t.rid <=:v_page*:v_pageSize';
OPEN p_rc FOR sqlstr USING v_page, v_pageSize, v_page, v_pageSize;
COMMIT;
end mBLogreview_se_proc;
end pkg_mBlogreview_se;
/
---------------------------------------------------------------------------------
set serveroutput on;
var v_num number;
var c_cur refcursor;
exec pkg_mBlogreview_se.mBLogreview_se_proc(1244,1,5,:v_num,:c_cur);
print c_cur;
print v_num;
中间有多次commit操作!
参考我的blog:Oracle 临时表
http://blog.csdn.net/tianlesoftware/archive/2009/10/21/4705283.aspx
------------------------------------------------------------------------------
Blog: http://blog.csdn.net/tianlesoftware
网上资源: http://tianlesoftware.download.csdn.net
相关视频:http://blog.csdn.net/tianlesoftware/archive/2009/11/27/4886500.aspx
Q Q 群:62697716
--on commit delete rows;
第一种是执行commit后,临时表中数据还在,只有当前会话结束之后数据才删除,也就是说存储过程执行完成之后数据阐述,第二种是commit后,临时表数据就删除,你自己看情况选择哪种临时表合适。一般来说,存储过程中的临时表是为了解决复杂的业务逻辑,简化复杂的sql,提高执行效率,而且oracle中临时表用完是不用删除的,DB2则可以在存储过程中创建临时表,存储过程跑完系统就自动删除。
15:23:01 2 v_num number;
15:23:01 3 begin
15:23:01 4 select count(*) into v_num from user_tables where table_name='T_TEMP';
15:23:01 5 --create temporary table
15:23:01 6 if v_num<1 then
15:23:01 7 execute immediate 'CREATE GLOBAL TEMPORARY TABLE T_TEMP (
15:23:01 8 COL1 VARCHAR2(10),
15:23:01 9 COL2 VARCHAR2(10)
15:23:01 10 ) ON COMMIT delete ROWS';
15:23:01 11 end if;
15:23:01 12 --insert data
15:23:01 13 execute immediate 'insert into t_temp values('''||v_col1||''','''||v_col2||''')';
15:23:03 14 execute immediate 'select col1 from t_temp' into v_num;
15:23:36 15 dbms_output.put_line(v_num);
15:23:50 16 execute immediate 'delete from t_temp';
15:23:54 17 commit;
15:23:54 18 execute immediate 'drop table t_temp';
15:23:54 19 end pro_temp;
15:23:54 20 /
ON COMMIT DELETE ROWS;当前session发出commit/rollback命令,则该事务周期发生的所有数据自动被Oracle删除(Oracle truncate table)。但不影响任何其他session的数据。B.ON COMMIT PRESERVE ROWS 定义了创建会话级临时表的方法CREATE GLOBAL TEMPORARY TABLE TABLE_NAME-----(COUMNS …)-----AS SELECT … FROM TABLE…ON COMMIT PRESERVE ROWS;当前session结束(用户正常退出 / 用户不正常退出 / Oracle实例崩溃),Oracle对这个会话的中发生的数据进行删除(Oracle truncate table)。但不影响任何其他session的数据。2. 特点说明A.临时表数据自动清空后,但是临时表的结构以及元数据还存储在用户的数据字典中。表的定义对所有的会话可见B.临时表不需要DML锁C.可以索引临时表和在临时表基础上建立视图D.在临时表上的索引也是临时的,也是只对当前会话或者事务有效E.临时表可以拥有触发器F.可以用export和import工具导入导出临时表的定义,但是不能导出数据3. 使用技巧A.当某一个SQL语句关联的表在2张及以上,并且和一些小表关联。可以采用将大表进行分拆并且得到比较小的结果集合存放在临时表中B.程序执行过程中可能需要存放一些临时的数据,可以将这类数据放在临时表里非常方便C.存储过程中用到临时表:1> 在建立临时表前,应先加上对表名的判断Select count(*) into v_count from user_tables where table_name = ‘XXX’;If v_count=0 thenCreate global temporary table …在存储过程结束处,应该记得删除表execute immediate 'drop table t_temp';