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

时间: 2024-10-05 17:07:02

oracle游标、临时表使用练习的相关文章

oracle游标小试

有时候需要大面积的修改数据,这个时候用循环语句效率不高.而临时表又不能满足点对点修改的时候,游标似一种不错的选择(PS:好像游标也是为循环而生的吧) 现在有两张表 t1(ryid number,name nvarchar2(50),salary number,paydate date……)用来存员工每月的工资 t2(ryid number,paySalary number)每个月发的工资数目 现将t2中的paySalary添加到t1中 可以直接用update来实现: 现用oracle的for游标

[转载]oracle游标概念讲解

原文URL:http://www.2cto.com/database/201203/122387.html ORACLE游标概念讲解 什么是游标?  ①从表中检索出结果集,从中每次指向一条记录进行交互的机制.      ②关系数据库中的操作是在完整的行集合上执行的.   由SELECT 语句返回的行集合包括满足该语句的WHERE 子句所列条件的所有行.由该语句返回完整的行集合叫做结果集.      应用程序,尤其是互动和在线应用程序,把完整的结果集作为一个单元处理并不总是有效的.      这些

Duang!危险的oracle游标

1.引言 SQL是面向集合的语言,其结果一般是集合量(含多条记录),而pl/sql的变量是标量,一组变量一次只能存放一条记录.很多时候查询结果的记录数是不确定的,无法提前声明足够的变量.于是引入了游标的概念,游标使得数据库操作更灵活,但同时也给黑客入侵数据库带来了机会.安华金和数据库安全实验室(DBSec Labs)基于游标的应用原理,本文讨论游标可能带来什么安全隐患以及如何应对这些安全隐患. 2.游标的分类 oracle数据库游标是Pl/sql执行DQL.DML等语句的时候,oracle在内存

oracle 游标例子

CREATE OR REPLACE PROCEDURE PRC_WAP_ACTIVEUSERS(RETCODE OUT VARCHAR2) /*********************************************************** * 功能:WAP指标--活跃用户统计(分批提交) * 参数:RETCODE(返回编码:0000成功) * 作者: * 创建时间:2013-01-16 * 版本:1.0 * 修改人: * 修改时间: ********************

【翻译】Oracle游标详细说明

这篇文章是选取官方文档的部分章节翻译过来的,去除了原文中的例子,并在结尾补充了几个例子.有兴趣的朋友可以点击文章末尾的连接去阅读官方文档. 一.游标的定义 游标是指向专用SQL区域的指针,该区域存储有关处理特定SELECT或DML语句的信息.本章解释的游标是会话游标.会话游标存在于会话中直到会话结束.由PL/SQL创建和管理的游标称为隐式游标,由用户创建和管理的游标称为显式游标.你可以通过游标的属性获取任意会话游标的相关信息.通过查询动态性能视图V$OPEN_CURSOR,可以列出当前已经打开和

Oracle游标—for、loop、if结合应用

一.需求 什么时候会用到Oracle游标,以及其中的for.loop.if呢? 先看这样一个需求: 有一张学生授课表T_TEACHING,每个学生都有数门课程: 主键ID(自增) 课程号COURSE_ID 学号USER_ID 1 01 201501 2 02 201501 3 03 201501 4 01 201502 5 01 201503 6 01 201504 7 02 201504 ... ... ... 但是因为某些原因,导致有的学生课程不全(本应该每个学生都有3门课),应该如何把不全

Oracle游标循环更新数据案例

declare v_XTXMBH number; v_ZJZJZJRQ varchar2(40); cursor c_job is SELECT XT.XTXMBH AS XTXMBH, QJ.ZJZJZJRQ AS ZJZJZJRQ FROM XTXMXX XT, QJGLXX_ZQL_MID QJ WHERE XT.XTXMBH = QJ.XTXMBH AND XT.XTXMCLRQ >= '20120630' AND (QJ.ZJQHZJRQ IS NULL OR QJ.ZJZJZJRQ

oracle创建临时表

Oracle临时表可以说是提高数据库处理性能的好方法,在没有必要存储时,只存储在Oracle临时表空间中.希望本文能对大家有所帮助. 1 .前言 目前所有使用 Oracle 作为数据库支撑平台的应用,大部分数据量比较庞大的系统,即表的数据量一般情况下都是在百万级以上的数据量. 当然在 Oracle 中创建分区是一种不错的选择,但是当你发现你的应用有多张表关联的时候,并且这些表大部分都是比较庞大,而你关联的时候发现其中的某一张或者某几张表关联 之后得到的结果集非常小并且查询得到这个结果集的速度非常

Oracle 游标示例,带异常处理

Oracle游标示例一则,带异常处理. DECLARE CURSOR c_dl IS SELECT ID, NSRSBH, WSPZXH, ZXYY_DM, HZRQ, SWJG_DM, GXSJ FROM T_GUOS_ZXXX WHERE gxsj > begin_gxsj; c_row c_dl%ROWTYPE; BEGIN FOR c_row IN c_dl LOOP BEGIN IF (c_row.GXSJ > max_gxsj) THEN BEGIN max_gxsj := c_r

Oracle游标-循环查询表中数据(表名),并执行

Oralce 表中存有一个字段,该字段存储表名,要把该表中的所有表名查询出来(即表名结果集),且执行结果集from 表名结果集: declare v_ccount varchar2(100); --定义一个游标变量 cursor c_job is --查询该表中的所有表名 select tablename from tbname; c_row c_job%rowtype; begin --循环待处理数据,即以上查出的结果集 for c_row in c_job loop ---执行语句 from