oracle游标、临时表使用练习
1.创建一张会话级的临时表:
<span style="font-size:14px;">create global temporary table pact_test ( pact_id varchar2(100), pact_code varchar2(100), pact_name varchar2(800) ) on commit preserve rows;</span>
2.创建一张主表,并插入数据:
<span style="font-size:14px;">create table PACT_BASEINFO ( pact_id VARCHAR2(30) not null, pact_code VARCHAR2(150) not null, pact_name VARCHAR2(1000) not null )</span>
插入数据:
<span style="font-size:14px;">prompt Importing table pact_test... set feedback off set define off insert into pact_test (PACT_ID, PACT_CODE, PACT_NAME) values ('2014', 'ZD0ZB', '天翼电信'); insert into pact_test (PACT_ID, PACT_CODE, PACT_NAME) values ('2014', 'HISGS', '海南电信'); insert into pact_test (PACT_ID, PACT_CODE, PACT_NAME) values ('2014', 'JSSGS', '江苏电信'); insert into pact_test (PACT_ID, PACT_CODE, PACT_NAME) values ('2014', 'CU12-', '中国联通甘肃业务'); insert into pact_test (PACT_ID, PACT_CODE, PACT_NAME) values ('2014', 'YNSGS', '中国电信云南公司'); prompt Done.</span>
3.写一个游标查询并插入
<span style="font-size:14px;">declare v_cnt number :=5; cursor c_pact is select pact_id,pact_code,pact_name from (select rownum rn,pact_id,pact_code,pact_name from pact_baseinfo) a where a.rn <v_cnt ; v_pact_id pact_baseinfo.pact_id%type; v_pact_code pact_baseinfo.pact_code%type; v_pact_name pact_baseinfo.pact_name%type; begin open c_pact; loop fetch c_pact into v_pact_id,v_pact_code,v_pact_name; exit when c_pact%notfound; insert into pact_test(pact_id,pact_code,pact_name) values(v_pact_id,v_pact_code,v_pact_name); commit; end loop; close c_pact; end;</span>
4.验证临时表中是否被插入数据:
<span style="font-size:14px;">select * from pact_test</span>
5.总结:
1)临时表分为两种:
会话级别的临时表:这个临时表中的数据和你的当前会话有关系,当你当前SESSION 不退出的情况下,临时表中的数据就还存在,而当你退出当前SESSION 的时候,临时表中的数据就全部没有了
事务级别的临时表:当进行事务提交或者事务回滚的时候,临时表中的数据将自行被截断,其他的内容和会话级的临时表的一致(包括退出SESSION 的时候,事务级的临时表也会被自动截断)
这次实验用的是会话级别的临时表,下面记录下事务级别的临时表怎么建立:
<span style="font-size:14px;">create global temporary table pact_test ( pact_id varchar2(100), pact_code varchar2(100), pact_name varchar2(800) ) on commit delete rows;</span>
2)游标的使用:
(1)Oracle中的游标分为显式游标和隐式游标:
显式游标:用cursor...is 命令定义的游标,它可以对select语句返回的多条记录进行处理。
隐式游标:在执行insert、delete、update和返回单条记录的查询select into语句时由pl/sql自动定义,隐式游标也叫sql游标。
(2)Oracle显式游标分为普通游标、参数游标、游标变量。
其中普通游标和参数游标也被称为静态游标,游标变量被称为动态游标。
一般所说的游标是指显式游标,因为隐式并不能被操作者控制,只能获取他的属性,本篇先讲述最常用的显式游标,隐式游标在最后简述。
(3)显式游标的一般使用步骤
定义游标:cursor cursor_name is select_sql; (注意,游标的定义只能用使关键字IS,它与AS不通用)
打开游标:open cursor_name;
提取数据:
语法1 fetch cursor_name into variable1[,variable2,...];
其中,fetch into 每次只能提取一行数据,批量数据需使用循环;variable指定接收游标数据的变量,select_sql的字段有几个,就有几个variable。
语法2 fetch cursor_name bulk collect into collect1,collect2,...[limit rows];
其中,collect指定接收游标结果的集合变量,这种语法9i后支持,比较耗内存。
显示游标(游标的四个属性):
%isopen:检测游标是否已经打开,已经打开则返回true。
%found:检测游标结果集是否存在数据,存在返回true。如果打开游标后没有使用fetch推进,则返回null.
%notfound:检测游标结果集是否不存在数据,不存在返回true。
%rowcount:返回到当前行为止已提取的实际行数。
关闭游标:close cursor_name;
http://blog.csdn.net/yuzongtao
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。