`

oracle 游标

阅读更多
1、隐式游标
实例1、用sql%found 相当于sql.found 
create or replace procedure abing
is
--set serveroutput on;
begin
declare
begin
update former_emp set ename='isStrong' where empno='abin';
if sql%found then
dbms_output.put_line('ok');
dbms_output.put_line(sql%rowcount);
end if;
if sql%notfound then
dbms_output.put_line('no');
end if;
exception
when no_data_found then
dbms_output.put_line('no data found');
end;
end;



begin
update former_emp set ename='isStrong' where empno='abin';
if sql%found then
dbms_output.put_line('ok');
dbms_output.put_line(sql%rowcount);
end if;
if sql%notfound then
dbms_output.put_line('no');
end if;
exception
when no_data_found then
dbms_output.put_line('no data found');
end;



create or replace procedure abin_1
is
--set serveroutput on;
begin
declare
begin
update former_emp set ename='isStrong' where empno='abing';
if sql%found then
dbms_output.put_line('yes');
dbms_output.put_line(sql%rowcount);
end if;
if sql%notfound then
dbms_output.put_line('no');
end if;
end;
end;

测试语句:
begin
declare
i number:=0;
begin
for i in 1..5 loop
abin_1;
end loop;
end;
end;




create or replace procedure abin_1
is
--set serveroutput on;
begin
declare name former_emp.empno%type;
begin
select ename into name from former_emp where empno='abin';
if sql%found then
dbms_output.put_line('yes');
dbms_output.put_line(sql%rowcount);
dbms_output.put_line(name);
end if;
if sql%notfound then
dbms_output.put_line('no');
end if;
end;
end;
测试代码:
begin
declare 
i number;
begin
i:=0;
for i in 1..5 loop
abin_1;
end loop;
end;
end;



create or replace procedure abin_1
is
begin
declare
var_userid number(3);
var_salary number(3);
cursor mysor is select userid,salary from userinfo;
begin
open mysor;
loop
fetch mysor into var_userid,var_salary; 
exit when mysor%notfound;
if var_userid=1 then
update userinfo set salary=salary+salary*0.5 where userid=var_userid;
end if;
if var_userid=2 then
update userinfo set salary=salary+salary*0.6 where userid=var_userid;
end if;
if var_userid=3 then
update userinfo set salary=salary+salary*0.7 where userid=var_userid;
end if;
commit;
end loop;
end;
end;




create or replace procedure abin_2
is
begin
declare
cursor mysor is select * from userinfo;
begin
--open mysor;
for a in mysor
loop
dbms_output.put_line(a.username);
end loop;
--close mysor;
end;
end;
测试代码:
begin
abin_2;
end;




create or replace procedure allcursor
is
begin
declare
type mysor is ref cursor;
var_sor mysor;
var_user userinfo%rowtype;
var_person personinfo%rowtype;
begin
open var_sor for select * from userinfo;
loop
fetch var_sor into var_user;
exit when var_sor%notfound;
dbms_output.put_line(var_user.username);
end loop;
close var_sor;

open var_sor for select * from personinfo;
loop
fetch var_sor into var_person;
exit when var_sor%notfound;
dbms_output.put_line(var_person.pname);
end loop;
close var_sor;
end;
end;




create or replace procedure scursor
is
begin
declare
cursor mycur is select ename,salary from emp1;
r_emp mycur%rowtype;
begin
open mycur;
loop
fetch mycur into r_emp;
exit when mycur%notfound;
dbms_output.put_line('ename='||r_emp.ename||'  '||'salary='||r_emp.salary);
end loop;
close mycur;
end;
end;

测试代码:
begin
scursor;
end;




带参数的游标
  与存储过程和函数相似,可以将参数传递给游标并在查询中使用。这对于处理在某种条件下打开游标的情况非常有用。它的语法如下:

CURSOR cursor_name[(parameter[,parameter],...)] IS select_statement;

定义参数的语法如下:
  Parameter_name [IN] data_type[{:=|DEFAULT} value]

  与存储过程不同的是,游标只能接受传递的值,而不能返回值。参数只定义数据类型,没有大小。
  另外可以给参数设定一个缺省值,当没有参数值传递给游标时,就使用缺省值。游标中定义的参数只是一个占位符,在别处引用该参数不一定可靠。

在打开游标时给参数赋值,语法如下:

OPEN cursor_name[value[,value]....];
参数值可以是文字或变量。

例: 

create or replace procedure bcursor
is
begin
declare
cursor c_dept is select * from dept order by deptno;
cursor c_emp(p_dept varchar2) is select ename,salary from emp where deptno=p_dept order by ename;
r_dept dept%rowtype;
v_ename emp.ename%type;
v_salary emp.salary%type;
v_tot_salary emp.salary%type;
begin
open c_dept;
loop
fetch c_dept into r_dept;
exit when c_dept%notfound;
dbms_output.put_line('Department='||r_dept.deptno||',dname--'||r_dept.dname);
v_tot_salary:=0;
open c_emp(r_dept.deptno);
loop
fetch c_emp into v_ename,v_salary;
exit when c_emp%notfound;
dbms_output.put_line('Name:'||v_ename||'salary'||v_salary);
v_tot_salary:=v_tot_salary+v_salary;
end loop;
close c_emp;
dbms_output.put_line('Total Salary for dept:'||v_tot_salary);
end loop;
commit;
close c_dept;
end;
end;





下面是直接拷贝过来的,没有自己亲自运行,上面的全部是经过我的运行正确的代码:
游标FOR循环
在大多数时候我们在设计程序的时候都遵循下面的步骤:
1、打开游标
2、开始循环
3、从游标中取值
那一行被返回
5、处理
6、关闭循环
7、关闭游标
  可以简单的把这一类代码称为游标用于循环。但还有一种循环与这种类型不相同,这就是FOR循环,用于FOR循环的游标按照正常的声明方式声明,它的优点在于不需要显式的打开、关闭、取数据,测试数据的存在、定义存放数据的变量等等。游标FOR循环的语法如下:

FOR record_name IN
(corsor_name[(parameter[,parameter]...)]
| (query_difinition)
LOOP
statements
END LOOP;

下面我们用for循环重写上面的例子:
DECALRE
CURSOR c_dept IS SELECT deptno,dname FROM dept ORDER BY deptno;
CURSOR c_emp (p_dept VARACHAR2) IS
SELECT ename,salary
FROM emp
WHERE deptno=p_dept
ORDER BY ename
v_tot_salary EMP.SALARY%TYPE;
BEGIN
  FOR r_dept IN c_dept LOOP
  DBMS_OUTPUT.PUT_LINE('Department:'|| r_dept.deptno||'-'||r_dept.dname);
  v_tot_salary:=0;
  FOR r_emp IN c_emp(r_dept.deptno) LOOP
  DBMS_OUTPUT.PUT_LINE('Name:' || v_ename || 'salary:' || v_salary);  
  v_tot_salary:=v_tot_salary+v_salary;
  END LOOP;
  DBMS_OUTPUT.PUT_LINE('Toltal Salary for dept:'|| v_tot_salary);
END LOOP;
END;

在游标FOR循环中使用查询
  在游标FOR循环中可以定义查询,由于没有显式声明所以游标没有名字,记录名通过游标查询来定义。
DECALRE
v_tot_salary EMP.SALARY%TYPE;
BEGIN
FOR r_dept IN (SELECT deptno,dname FROM dept ORDER BY deptno) LOOP
  DBMS_OUTPUT.PUT_LINE('Department:'|| r_dept.deptno||'-'||r_dept.dname);
  v_tot_salary:=0;
  FOR r_emp IN (SELECT ename,salary
           FROM emp
           WHERE deptno=p_dept
           ORDER BY ename) LOOP
    DBMS_OUTPUT.PUT_LINE('Name:'|| v_ename||' salary:'||v_salary);
    v_tot_salary:=v_tot_salary+v_salary;
  END LOOP;
DBMS_OUTPUT.PUT_LINE('Toltal Salary for dept:'|| v_tot_salary);
END LOOP;
END;


分享到:
评论

相关推荐

    oracle游标的总结oracle游标的总结

    Oracle 游标概述 Oracle 游标是 Oracle 数据库中的一种重要概念,用于查询数据库,获取记录集合(结果集)的指针。游标可以看作是一个临时表,你可以对其每一行的数据进行任意的操作。本文将对 Oracle 游标的概念、...

    ORACLE 游标使用示例

    下面,我们将深入探讨Oracle游标的使用示例及其相关的知识点。 首先,游标的基本概念是它提供了一种方式来跟踪并控制SQL查询的结果集。在Oracle中,游标有四种状态:未打开、已打开、正在提取和已关闭。以下是一个...

    Oracle游标使用大全

    ### Oracle游标使用详解 #### 一、Oracle游标简介 在Oracle数据库中,游标是一种重要的机制,用于处理查询结果集。它允许用户通过PL/SQL编程语言逐行访问和处理查询返回的数据记录。游标可以是显式定义的(即在...

    oracle游标使用大全

    总之,Oracle游标提供了处理查询结果的强大工具,使开发者能够灵活地在PL/SQL中操作数据。无论是隐式还是显式游标,都极大地增强了对数据库的交互能力,使得程序能根据查询结果进行适当的操作。理解并熟练运用游标是...

    Oracle游标使用案例大全

    Oracle游标是数据库编程中非常重要的一个概念,主要用于处理SQL查询的结果集。游标允许我们按行处理数据,逐条读取结果集,而不仅仅是一次性获取所有数据。在Oracle数据库中,游标对于复杂的事务处理、动态SQL以及...

    Oracle游标使用方法及语法大全

    Oracle 游标使用方法及语法大全 Oracle 游标是 PL/SQL 程序中的一种重要组件,用于处理查询结果集。游标可以分为隐式游标和显式游标两种,隐式游标由 PL/SQL 管理,隐式游标打开时查询开始,查询结束时隐式游标自动...

    oracle游标使用及实例

    ### Oracle游标使用及实例详解 #### 一、Oracle游标概述 在Oracle数据库中,游标(Cursor)是一种用于处理SQL查询结果集的方式。它允许用户逐行地读取和处理查询结果,这对于需要对每一行数据进行特定操作的情况非常...

    Oracle游标使用方法及语法大全.doc

    ### Oracle游标使用详解 #### 一、游标概述 游标是Oracle数据库中用于处理查询结果集的强大工具,尤其适用于需要逐行处理查询结果的情况。在Oracle中,游标可以分为两类:**显式游标**和**隐式游标**。 1. **隐式...

    oracle游标学习资料

    Oracle游标是数据库编程中非常重要的一个概念,它允许开发者逐行处理查询结果集,而不仅仅是一次性处理所有数据。在Oracle中,游标分为隐式游标和显式游标。 **一、游标简介** 游标的核心功能是提供一种方式来遍历...

    Oracle游标使用详解

    根据提供的标题、描述以及部分代码内容,我们可以详细探讨Oracle游标的使用方法,特别是明确游标(Explicit Cursor)和隐式游标(Implicit Cursor)的区别及其具体应用方式。 ### Oracle游标简介 在Oracle数据库中...

    Oracle 游标使用大全.pdf

    通过本篇Oracle游标的使用大全,我们可以了解到Oracle数据库游标的类型、属性以及如何在PL/SQL中实现对数据集的逐行处理。这不仅有助于提升程序员的编程技能,也能使他们更深入地理解PL/SQL与Oracle数据库之间的交互...

    oracle游标使用大全1.txt

    ### Oracle游标使用详解 #### 一、Oracle游标简介 在Oracle数据库中,游标是一种用于处理查询结果集的强大工具。它允许用户通过逐行访问数据来执行复杂的操作,如更新、删除或插入记录等。游标可以分为显式游标和...

    oracle 游标 深入浅出 详解 精析 示例

    Oracle游标是数据库管理系统中的一种重要机制,它允许程序员逐行处理查询结果集,而不仅仅是一次性获取所有数据。游标类似于C语言中的指针,能够灵活、高效地处理多条记录,尤其在需要循环处理或者根据当前行数据做...

    快速练习ORACLE游标习题及答案

    根据提供的文件信息,我们可以归纳出以下Oracle游标的使用方法及相关知识点: ### 一、游标的基本概念 在Oracle数据库中,游标是一种重要的机制,它允许用户从查询结果集中逐行检索数据。游标可以分为两种类型:**...

    ORACLE游标与异常处理

    首先,让我们来理解Oracle游标。游标是数据库系统提供的一种机制,允许用户在结果集上进行迭代,一次处理一行数据。在PL/SQL中,游标用于检索SQL查询返回的结果集,并按需逐行处理。以下是一个简单的游标使用示例: ...

    oracle游标优化

    ### Oracle游标优化 在Oracle数据库管理中,游标是一种重要的机制,用于处理查询结果集。游标可以被看作是存储查询结果的一种临时区域,它允许用户通过循环逐行处理这些结果。游标不仅可以提高应用程序的灵活性,还...

Global site tag (gtag.js) - Google Analytics