游标练习

record类型示例(%type):
set serveroutput on
declare
v_empno emp.empno%type;
type  emp_record is record
(ename  emp.ename%type,
sal     emp.sal%type,
deptno  emp.deptno%type);
v_emp_rec  emp_record;
begin
  select ename,sal,deptno into v_emp_rec from emp where empno=&v_empno;
  dbms_output.put_line(‘Employees name is: ‘||v_emp_rec.ename);
  dbms_output.put_line(‘Employees salary is: ‘||v_emp_rec.sal);
  dbms_output.put_line(‘Employees deptno is: ‘||v_emp_rec.deptno);
end;
/

declare
  type emp_record is record(ename emp.ename%type, sal emp.sal%type, deptno emp.deptno%type);
  v_emp_rec emp_record;
begin
  select ename, sal, deptno into v_emp_rec from emp where empno = #
  dbms_output.put_line(v_emp_rec.ename || ‘ ‘ || v_emp_rec.sal || ‘ ‘ || v_emp_rec.deptno);
end;
/

record类型示例(%rowtype)
declare
  v_emp_rec  emp%rowtype;

begin
  select * into v_emp_rec from emp where empno=#
  dbms_output.put_line(‘Employees name is: ‘||v_emp_rec.ename);
  dbms_output.put_line(‘Employees salary is: ‘||v_emp_rec.sal);
  dbms_output.put_line(‘Employees deptno is: ‘||v_emp_rec.deptno);
  dbms_output.put_line(‘Employees hiredate is: ‘||v_emp_rec.hiredate);
end;
/

record类型示例(%rowtype),如果日期类型不对,可以用to_char函数转换
declare
  v_emp_rec  emp%rowtype;

begin
  select * into v_emp_rec from emp where empno=#
  dbms_output.put_line(‘Employees name is: ‘||v_emp_rec.ename);
  dbms_output.put_line(‘Employees salary is: ‘||v_emp_rec.sal);
  dbms_output.put_line(‘Employees deptno is: ‘||v_emp_rec.deptno);
  dbms_output.put_line(‘Employees hiredate is: ‘||to_char(v_emp_rec.hiredate,‘yyyy-mm-dd‘));
end;
/

table类型示例(只有一列数据需要显示):
SQL> declare
  2    type emp_table is table of emp.ename%type index by binary_integer;
  3    v_emp_table emp_table;
  4  begin
  5    select ename into v_emp_table(1) from emp where empno = 7788;
  6    select ename into v_emp_table(2) from emp where empno = 7369;
  7    select ename into v_emp_table(3) from emp where empno = 7499;
  8    dbms_output.put_line(‘Name is: ‘ || v_emp_table(1));
  9    dbms_output.put_line(‘Name is: ‘ || v_emp_table(2));
 10    dbms_output.put_line(‘Name is: ‘ || v_emp_table(3));
 11  end;
 12  /
Name is: SCOTT
Name is: SMITH
Name is: ALLEN
PL/SQL procedure successfully completed

table类型示例(有多列数据需要显示):
declare
  type emp_tab_ename is table of emp.ename%type index by binary_integer;
  type emp_tab_sal is table of emp.sal%type index by binary_integer;
  v_emp_tab_ename emp_tab_ename;
  v_emp_tab_sal   emp_tab_sal;
begin
  select ename into v_emp_tab_ename(1) from emp where empno = 7788;
  select ename into v_emp_tab_ename(2) from emp where empno = 7369;
  select ename into v_emp_tab_ename(3) from emp where empno = 7499;
  select sal into v_emp_tab_sal(1) from emp where empno = 7788;
  select sal into v_emp_tab_sal(2) from emp where empno = 7369;
  select sal into v_emp_tab_sal(3) from emp where empno = 7499;
  dbms_output.put_line(‘Name is: ‘ || v_emp_tab_ename(1) ||‘ Salary is: ‘ || v_emp_tab_sal(1));
  dbms_output.put_line(‘Name is: ‘ || v_emp_tab_ename(2) ||‘ Salary is: ‘ || v_emp_tab_sal(2));
  dbms_output.put_line(‘Name is: ‘ || v_emp_tab_ename(3) ||‘ Salary is: ‘ || v_emp_tab_sal(3));
end;
/

如果要处理多行多列数据:
在table类型里嵌套record就可以处理多行多列
declare
 type emp_table_type is table of emp%rowtype index by binary_integer;
 v_emp_table_type  emp_table_type;
begin
  select * into v_emp_table_type(1) from emp where empno=7788;
  select * into v_emp_table_type(2) from emp where empno=7369;
  dbms_output.put_line(‘7788 Ename is: ‘||v_emp_table_type(1).ename);
  dbms_output.put_line(‘7788 salary is: ‘||v_emp_table_type(1).sal);
  dbms_output.put_line(‘7788 Department is: ‘||v_emp_table_type(1).deptno);
  dbms_output.put_line(‘7369 Ename is: ‘||v_emp_table_type(2).ename);
  dbms_output.put_line(‘7369 salary is: ‘||v_emp_table_type(2).sal);
  dbms_output.put_line(‘7369 Department is: ‘||v_emp_table_type(2).deptno);
end;
/

DML操作可以同时处理多行

pl/sql里嵌套dml操作(可能影响多行,需注意)
select 默认只能处理单行数据
dml可以处理多行数据
1 插入数据

插入数据示例:
declare
  v_id   t1.id%type;
  v_name t1.name%type;
  v_dsc  t1.dsc%type;
  t1_rcd t1%rowtype;
begin
  v_id   := 10;
  v_name := ‘tom‘;
  v_dsc  := 12;
  insert into t1 values (v_id, v_name, v_dsc);
  commit;
  select * into t1_rcd from t1 where id = v_id;
  dbms_output.put_line(‘T1 record is : ‘ || t1_rcd.id || ‘,‘ ||t1_rcd.name || ‘,‘ || t1_rcd.dsc);
end;
/

插入示例:
begin
  insert into t1 select * from t1;
  commit;
end;
/

更新示例:
declare
  v_name t1.name%type := ‘rose‘;
begin
  update t1 set name = v_name where id = 10;
  commit;
end;
/

删除示例:
declare
  v_id t1.id%type;
begin
  v_id:=10;
  delete from t1 where id=v_id;
  commit;
end;
/

pl/sql中使用事务控制
 DECLARE
   v_deptno dept.deptno%TYPE := 20;
 BEGIN
   DELETE FROM dept WHERE deptno = v_deptno;
   COMMIT;
 EXCEPTION
   WHEN OTHERS THEN
     ROLLBACK;
 end;

cursor游标
oracle在执行sql语句时,为sql语句所分配的一个私有的内存区域
当oracle在执行sql,会建立一个cursor(私有的内存区域)     
默认:建立隐式游标(select,一次只能处理一行数据)
隐式游标特点:
1 oracle自动创建
2 自动open
3 数据处理完成自动close
4 select一次只能处理一行数据

隐式游标用于处理select insert  update  delete语句

显示游标:由开发人员定义,可以通过循环方式处理多行数据(select)
1 开发人员按需定义
2 手工open
3 fetch取值(通过循环读取数据)
4 手工close

显示游标用于处理多行select语句

隐式游标:一次只能返回一行结果(不需要定义,默认)
显示游标:需要用户提前定义,可以通过循环的方式处理游标里的sql语句,返回多行结果

隐式游标的属性:
sql%rowcout 统计在游标中处理的记录数
sql%found   如果在游标中能找到符合条件的一条记录,结果为true
sql%notfound 如果在游标中能找不到符合条件的一条记录,结果为true
sql%open    判断游标是否打开,在隐式游标中默认游标自动打开

隐式游标的几个属性:
truncate table t1;
sql%notfound属性
declare
  v_id t1.id%type;
begin
  v_id:=10;
  update t1 set id=20 where id=v_id;
  if sql%notfound then
  insert into t1(id) values (v_id);
  commit;
  end if;
end;
/

sql%found属性
declare
  v_id t1.id%type;
begin
  v_id:=10;
  delete from t1  where id=v_id;
  if sql%found then
  dbms_output.put_line(‘T1 record is delete!‘);
  commit;
  end if;
end;
/

时间: 2024-10-19 22:01:52

游标练习的相关文章

SQL Server 游标使用

1.声明游标            DECLARE 游标名 CURSOR SELECT语句(注:此处一定是SELECT语句)        2.打开游标           OPEN 游标名        3.读取游标数据           Fetch [Next | Prior | First | Last | Absolute n | Relative n ]  From 游标名 INTO @name1,@name2...            WHILE(@@FETCH_STATUS =

oracle(sql)基础篇系列(五)——PLSQL、游标、存储过程、触发器

  PL/SQL PL/SQL 简介 每一种数据库都有这样的一种语言,PL/SQL 是在Oracle里面的一种编程语言,在Oracle内部使用的编程语言.我们知道SQL语言是没有分支和循环的,而PL语言是为了补充SQL语言的,是带有了分支和循环的语言. PL/SQL 语法 基本数据类型声明 declare v_name varchar2(20); v_temp number(1); v_count binary_integer := 0; v_sal number(7,2) := 4000.00

[转载]oracle游标概念讲解

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

ActiveMQ消息游标 --转载

转:http://blog.csdn.net/m13321169565/article/details/8081358 在Activemq以前的版本中,broker会把待发送的消息保存在内存中.这种方式的缺陷是当消费者消费的速度赶不上生产者的速度时,会在broker的内存中积攒大量的消息,当达到一个限额后,broker就不再接收消息.这时生产者就被阻塞了,直到broker将内存清理能保存消息后才能继续发送.     在5.0版本后,Activemq实现了一种新的内存模型来防止慢消费者阻塞快速生产

plsql游标的介绍

3. 游标的介绍    游标:一个指向保存多行SQL查询结果集的工作区的句柄(指针) 3.1 显式游标 (1)显式游标的使用 案例1:定义变量的方式使用游标 declare  cursor csr_org is select h.hrc_descr,o.org_short_name                      from org_tab o,hrc_tab h                     where o.hrc_code=h.hrc_code               

PL/SQL 编程(二)游标、存储过程、函数

游标--数据的缓存区 游标:类似集合,可以让用户像操作数组一样操作查询出来的数据集,实质上,它提供了一种从集合性质的结果中提取单条记录的手段. 可以将游标形象的看成一个变动的光标,他实质上是一个指针,在一段Oracle存放数据查询结果集或者数据操作结果集的内存中,这个指针可以指向结果集任何一条记录. 游标分静态游标和REF游标两类,静态游标包含显式游标和隐式游标. 显式游标: 在使用之前必须有明确的游标声明和定义,这样的游标定义会关联数据查询语句,通常会返回一行或多行.打开游标后,用户可以利用游

python使用游标访问数据

游标是一种数据访问对象,可用于在表中迭代一组行或者向表中插入新行.游标有三种形式:搜索.插入或更新.游标通常用于读取现有几何和写入新几何. 每种类型的游标均由对应的 ArcPy 函数(SearchCursor.InsertCursor 或 UpdateCursor)在表.表格视图.要素类或要素图层上创建.搜索游标可用于检索行.更新游标可用于根据位置更新和删除行,而插入游标可用于向表或要素类中插入行. 游标 说明 InsertCursor(dataset, {spatial_reference})

【MySQL】存储过程、游标、循环简单实例

有时候仅凭 sql 语句可能达不到想要的数据操作目的,有可能需要写一些方法体,通过循环判断等操作最终达到目的.那么在数据库里实现这种方法体就需要存储过程了,个人觉得一个带注释的简单实例可以简单粗暴地解决大部分问题,当然要深入学习了解的话还是要看教程文档了,话不多说,上码: [sql] view plain copy create procedure my_procedure() -- 创建存储过程 begin -- 开始存储过程 declare my_id varchar(32); -- 自定义

mongo数据删除和游标

数据删除 db.集合.remove(删除条件,是否只删除一个数据);默认删多条(false)true删除一条db.集合.remove({}) 删除所有元素但集合还在db.集合.drop() 删除集合 游标指数据可以一行行的进行操作,类似ResultSet数据处理在mongo里是需要使用find()就可以返回游标了对于操作返回的游标,可使用函数操作1.判断是否有下一行数据:hasNext()2.取当前数据: next() var cur=db.web.find();cur.hasNext();cu

『ORACLE』 PLSQL游标的使用(11g)

游标分类 隐式游标: 对于select..into...语句,一次只能从数据库中获取到一条数据,对于这种类型的DML SQL语句,就是隐式cursor select update/insert/delete操作 显示游标: 由程序员定义和管理,对于从数据库中提取多行数据,就需要使用显式cursor 1.定义游标---cursor  [cursor name]  is 2.打开游标---open    [cursor name] 3.操作数据---fetch    [cursor name] 4.