【黑马程序员】Oracle 游标使用全解

合集下载

oracle中游标的用法

oracle中游标的用法

oracle中游标的用法游标在Oracle数据库中是一种用于处理查询结果集的机制。

它可以被看作是一个指向查询结果集的指针。

在本文中,我们将一步一步回答关于Oracle中游标的用法和相关概念。

第一步:什么是游标?游标是一种数据库对象,它使我们能够在查询结果集中逐行遍历数据。

通过游标,我们可以从结果集中选取特定的行,并对这些行执行相应的操作,如查询、更新、删除等。

第二步:游标的类型在Oracle中,有两种类型的游标:显式游标和隐式游标。

- 显式游标是由开发者明确声明和管理的游标。

它需要在程序代码中先定义并打开,然后逐行读取数据。

对于大型数据集,显式游标是更好的选择,因为它具有更好的灵活性和可控性。

- 隐式游标是由Oracle隐式处理的游标,无需像显式游标那样进行显式声明和管理。

隐式游标适用于一次性操作,例如打印查询结果或执行简单的数据操作。

第三步:游标的使用要使用游标,我们需要执行以下步骤:1. 定义游标:使用CURSOR关键字定义游标,并指定游标名和查询语句。

sqlDECLAREcursor_name CURSOR FOR SELECT column1, column2, ... FROM table_name WHERE condition;2. 打开游标:使用OPEN关键字打开游标,使其可以读取数据。

sqlOPEN cursor_name;3. 读取数据:使用FETCH关键字从游标中逐行读取数据,并将数据存储在变量中。

sqlFETCH cursor_name INTO variable1, variable2, ...;4. 处理数据:使用读取到的数据执行相应的操作,如输出到屏幕、插入到表中等。

5. 关闭游标:使用CLOSE关键字关闭游标,释放相关资源。

sqlCLOSE cursor_name;第四步:游标的属性和方法在使用游标时,经常用到一些游标的属性和方法来操作和控制游标行为。

以下是一些常见的游标属性和方法:- %FOUND:如果最近读取的行满足查询条件,则返回TRUE;否则返回FALSE。

oracle中游标的用法

oracle中游标的用法

oracle中游标的用法游标是Oracle数据库中一种重要的数据类型,用于处理查询结果集中的数据。

使用游标可以方便地遍历查询结果,进行数据处理和操作。

下面是关于Oracle中游标的用法的参考内容。

一、游标的定义与声明在Oracle数据库中,游标可以在PL/SQL块中使用,用于与查询结果进行交互。

游标的使用分为显示游标和隐式游标两种方式:1. 显示游标:显示游标需要先定义游标类型,然后声明游标变量,并使用OPEN、FETCH和CLOSE等操作进行操作。

示例代码如下:```sql-- 定义游标类型TYPE cursor_type IS REF CURSOR;-- 声明游标变量cursor_var cursor_type;-- 打开游标OPEN cursor_var FOR SELECT * FROM table_name;-- 循环获取游标数据LOOPFETCH cursor_var INTO variable1, variable2...;EXIT WHEN cursor_var%NOTFOUND;-- 对游标数据进行处理END LOOP;-- 关闭游标CLOSE cursor_var;```2. 隐式游标:隐式游标由Oracle自动管理,不需要程序员定义和声明,系统会自动为每一个SELECT语句分配一个隐式游标。

隐式游标无法手动控制游标操作,只能通过向结果集添加条件来限制查询结果。

示例代码如下:```sql-- 查询结果会被自动赋值给隐式游标SELECT * FROM table_name;-- 循环处理查询结果LOOP-- 对查询结果进行处理-- 退出循环条件END LOOP;```二、游标的属性和操作1. 游标属性:(1) %FOUND:如果游标指向的结果集中有数据,则返回真;否则返回假。

(2) %NOTFOUND:如果游标指向的结果集中没有数据,则返回真;否则返回假。

(3) %ROWCOUNT:返回游标当前处理的行数。

oracle中游标的用法

oracle中游标的用法

oracle中游标的用法游标(Cursor)是Oracle中的一个重要概念,用于访问和处理由SQL查询生成的结果集。

通过使用游标,可以逐行处理查询结果,方便地对数据进行处理和分析。

本文将介绍Oracle 中游标的用法。

首先,需要使用DECLARE语句来定义游标变量。

游标变量是一种特殊的变量类型,用于存储和操作游标。

下面是游标变量的定义语法:```DECLAREcursor_variable_name CURSOR; -- 游标变量的定义```游标变量的名称可以根据需要自行命名。

在游标定义之后,可以使用OPEN语句来打开游标,并执行SQL查询语句。

下面是打开游标的语法:```OPEN cursor_variable_name FOR SELECT_statement; -- 打开游标并执行查询```SELECT_statement是一个有效的SELECT语句,用于从数据库中检索数据。

游标打开之后,可以使用FETCH语句来逐行读取查询结果集中的数据。

下面是FETCH语句的语法:```FETCH cursor_variable_name INTO variables_list; -- 逐行读取数据```variables_list是一个由实际变量组成的列表,用于存储每次读取的行数据。

在使用FETCH语句之前,需要声明相应的变量来存储对应的数据。

使用游标的一个常见操作是使用循环来逐行处理结果集。

可以使用循环语句,如WHILE和FOR循环,来重复执行FETCH 语句,直到读取完所有的行。

下面是使用游标和循环的示例代码:```sqlDECLAREcursor_variable_name CURSOR;-- 声明变量来存储读取的数据variable1 datatype1;variable2 datatype2;BEGINOPEN cursor_variable_name FOR SELECT_statement;LOOPFETCH cursor_variable_name INTO variable1, variable2;-- 处理读取的数据-- 进行一些操作-- 如果读取完所有行,则退出循环EXIT WHEN cursor_variable_name%NOTFOUND;END LOOP;-- 关闭游标CLOSE cursor_variable_name;END;```在循环体内,可以根据需要对读取的数据进行处理,例如进行计算、记录到其他表中、输出到日志等操作。

oracle 游标的使用方法

oracle 游标的使用方法

oracle 游标的使用方法The use of Oracle cursors is an essential aspect of working with the Oracle database. 游标是一种在Oracle数据库中非常重要的使用方法。

A cursor allows the user to traverse through a result set and process each individual row. 游标允许用户遍历结果集并处理每个单独的行。

This is particularly useful when working with large datasets and needing to perform operations on each row or when only a single row needs to be processed at a time. 当处理大型数据集并且需要对每一行执行操作时,这是非常有用的。

In Oracle, there are two types of cursors: implicit and explicit. 在Oracle中,有两种类型的游标:隐式和显式。

Implicit cursors are automatically created by Oracle when a SELECT, INSERT, UPDATE, or DELETE statement is executed. 隐式游标在执行SELECT、INSERT、UPDATE或DELETE语句时,Oracle会自动创建。

This type of cursor is often used for simple queries where the user does not need to define and manage the cursor explicitly. 这种类型的游标通常用于简单的查询,用户不需要显式定义和管理游标。

oracle 游标循环用法

oracle 游标循环用法

oracle 游标循环用法游标循环是在Oracle数据库中常用的一种技术,它允许我们按行循环访问查询结果集,并对每一行的数据进行操作。

在本文中,我将逐步解释Oracle游标循环的用法,并提供一些示例来帮助读者更好地理解。

第一步:游标的定义在使用游标之前,我们需要先定义一个游标。

游标是一个指向结果集的指针,用于从结果集中逐行获取数据。

在Oracle中,我们可以使用DECLARE 语句定义游标。

例如:DECLARECURSOR cursor_name ISSELECT column1, column2, ...FROM table_nameWHERE condition;在上面的示例中,我们定义了一个名为cursor_name的游标,它选择具有满足条件的结果集。

游标名可以根据需要进行自定义。

第二步:游标的打开和关闭在使用游标之前,我们需要先打开它,以便开始遍历结果集。

这可以通过使用OPEN语句来实现。

例如:OPEN cursor_name;在执行OPEN语句之后,游标将指向结果集的第一行。

在完成游标的使用后,我们应该关闭它。

这可以通过使用CLOSE语句来实现。

例如:CLOSE cursor_name;关闭游标后,游标将不再指向结果集的任何行。

第三步:游标的循环遍历一旦游标打开,我们可以使用游标的名称在循环中获取结果集的每一行。

在Oracle中,我们有两种循环方法可以使用游标:FOR循环和WHILE 循环。

1. FOR循环:FOR循环是使用游标的一种常用方法。

它允许我们在循环中自动遍历游标的所有行。

以下是FOR循环的语法:FOR record_name IN cursor_nameLOOP在这里可以对每一行的数据进行操作END LOOP;在上面的示例代码中,record_name是一个记录变量,表示结果集的一行数据。

在循环中,我们可以使用record_name来访问每一行的列值,并进行相应的操作。

2. WHILE循环:WHILE循环是另一种使用游标的循环方法。

oracle 游标用法

oracle 游标用法

oracle 游标用法Oracle游标是一种用于在PL/SQL中处理查询结果的机制。

游标可以让程序员逐行处理查询结果,而不是一次性将所有结果读入内存。

本文将详细介绍Oracle游标的用法。

一、游标概述1.1 游标的定义游标是一个指向查询结果集的指针,程序员可以使用它来逐行处理查询结果。

1.2 游标的类型Oracle支持显式和隐式两种类型的游标。

显式游标需要明确地声明和打开,而隐式游标则由Oracle自动管理。

1.3 游标的优点使用游标可以减少内存占用,提高程序性能。

同时,它也提供了更灵活的数据处理方式。

二、显式游标2.1 游标声明在PL/SQL中声明一个显式游标需要使用CURSOR关键字。

下面是一个例子:DECLARECURSOR c_emp IS SELECT * FROM emp;BEGIN-- do something hereEND;这个例子声明了一个名为c_emp的游标,它指向emp表中所有记录。

2.2 游标打开在使用之前,需要先打开一个已声明的游标。

可以使用OPEN语句来打开一个显式游标:DECLARECURSOR c_emp IS SELECT * FROM emp;BEGINOPEN c_emp;END;2.3 游标读取数据打开之后,我们可以使用FETCH语句来逐行读取游标指向的结果集。

FETCH语句可以用于一个或多个变量,它会将查询结果赋值给这些变量。

下面是一个例子:DECLARECURSOR c_emp IS SELECT * FROM emp;v_empno emp.empno%TYPE;v_ename emp.ename%TYPE;BEGINOPEN c_emp;FETCH c_emp INTO v_empno, v_ename;END;这个例子从c_emp游标中读取了一行数据,并将empno和ename 分别赋值给了v_empno和v_ename。

2.4 游标关闭在使用完毕后,需要关闭已打开的游标。

oracle__游标的高级应用全解

oracle__游标的高级应用全解
else
dbms_output.put_line('结果集已经处理完了');
exit;--及时退出
end if;
end loop;
end;
总结:有参数、无返回值的游标的说明
A:一般步骤(声明游标、打开游标、读取数据、关闭游标);
v_ename emp.ename%type,
v_sal emp.sal%type);
emp_record emp_record_type;
cursor ename_sal_cursor(c_deptno number,c_job varchar2)--声明带参数、有返回值的游标、并与SELECT语句相结合
from emp
where deptno=c_deptno
and job=c_job;
v_emp_record dj_cursor%rowtype;--基于游标的记录变量,可以接收多行数据
begin
open dj_cursor(20,'ANALYST');
loop
fetch dj_cursor into v_emp_record;
fetch cursor_name into name,job,sal;
end loop;
close cursor_name;--关闭游标
end;
--D:关闭游标
begin
…………………………
close cursor_name;
end;
------------2)显式游标属性
select ename,hiredate
from emp
where deptno=c_deptno and job=c_job;--条件用于接收参数变量

oracle游标的用法

oracle游标的用法

oracle游标的用法Oracle游标的用法本文将针对Oracle数据库中游标的用法进行详细讲解。

以下是一些常用的游标用法:1.隐式游标隐式游标是Oracle数据库默认为每个SQL语句自动创建的游标。

使用隐式游标时,我们可以通过%ROWCOUNT系统变量获取受影响的行数,通过%FOUND、%NOTFOUND和%ISOPEN系统变量判断该游标的状态。

示例代码:DECLAREl_count NUMBER;BEGINUPDATE employees SET salary = salary * ;l_count := SQL%ROWCOUNT;IF SQL%FOUND THENDBMS__LINE('成功更新了 ' || l_count || ' 条记录。

');END IF;END;2.显式游标显式游标是由程序员显式创建和控制的游标。

与隐式游标相比,显式游标提供了更大的灵活性,可以更好地处理大量的数据。

示例代码:DECLARECURSOR cursor_name IS SELECT * FROM employees;l_employee employees%ROWTYPE;BEGINOPEN cursor_name;LOOPFETCH cursor_name INTO l_employee;EXIT WHEN cursor_name%NOTFOUND;-- 对l_employee进行处理END LOOP;CLOSE cursor_name;END;在上述示例代码中,我们使用显式游标cursor_name查询了employees表的所有记录。

然后,通过循环获取每一条记录并对其进行处理,直到游标的%NOTFOUND属性为真时退出循环。

3.游标参数化游标参数化允许我们在游标声明中传递参数,以动态地定义游标查询的条件。

通过参数化游标,我们可以根据不同的条件查询不同的数据集。

示例代码:DECLARECURSOR cursor_name (param1 VARCHAR2, param2 NUMB ER) ISSELECT * FROM employees WHERE department_id = param1 AND salary > param2;l_employee employees%ROWTYPE;BEGINOPEN cursor_name('IT', 5000);LOOPFETCH cursor_name INTO l_employee;EXIT WHEN cursor_name%NOTFOUND;-- 对l_employee进行处理END LOOP;CLOSE cursor_name;END;在上述示例代码中,我们使用参数化游标cursor_name查询了部门ID为’IT’且薪水大于5000的员工信息。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

【黑马程序员】Oracle 游标使用全解有很多同学在使用oracle 数据库的时候对游标这个东西不知道如何处理,感觉使用起来很难,今天我们就讨论一下游标的使用,满满的都是干货,以下代码几乎包含了oracle游标使用的方方面面,全部通过了测试!-- 声明游标; 1 C URSOR cursor_name IS select_statement--For 循环游标--(1)定义游标--(2)定义游标变量--(3)使用for 循环来使用这个游标 01 02 03 04 05 06 07 08 09 10 11 12 13 14 declare--类型定义cursor c_jobisselect empno ,ename ,job ,salfrom empwhere job ='MANAGER';--定义一个游标变量v_cinfo c_emp%ROWTYPE ,该类型为游标c_emp 中的一行数据类型c_row c_job%rowtype;beginfor c_row in c_job loopdbms_output.put_line (c_row.empno||'-'||c_row.ename||'-'||c_row.job||'-'||c_row.sal ); end loop;end ;--Fetch 游标--使用的时候必须要明确的打开和关闭01 02 03 declare--类型定义cursor c_job04050607080910111213141516 isselect empno,ename,job,sal from empwhere job='MANAGER';--定义一个游标变量c_row c_job%rowtype;beginopen c_job;loop--提取一行数据到c_rowfetch c_job into c_row;--判读是否提取到值,没取到值就退出--取到值c_job%notfound 是false--取不到值c_job%notfound 是trueexit when c_job%notfound;dbms_output.put_line(c_row.empno||'-'||c_row.ename||'-'||c_row.job||' -'||c_row.sal);end loop;--关闭游标close c_job;end;--1:任意执行一个update操作,用隐式游标sql的属性%found,%notfound,%rowcount,%isopen观察update语句的执行情况。

beginupdate emp set ENAME='ALEARK' WHERE EMPNO=7469;if sql%isopen thendbms_output.put_line('Openging');elsedbms_output.put_line('closing');end if;if sql%found thendbms_output.put_line('游标指向了有效行');--判断游标是否指向有效行elsedbms_output.put_line('Sorry');end if;if sql%notfound thendbms_output.put_line('Also Sorry');elsedbms_output.put_line('Haha');end if;dbms_output.put_line(sql%rowcount);exceptionwhen no_data_found thendbms_output.put_line('Sorry No data');when too_many_rows thendbms_output.put_line('Too Many rows');end;declareempNumber emp.EMPNO%TYPE;empName emp.ENAME%TYPE;beginif sql%isopen thendbms_output.put_line('Cursor is opinging');elsedbms_output.put_line('Cursor is Close');end if;if sql%notfound thendbms_output.put_line('No Value');elsedbms_output.put_line(empNumber);end if;dbms_output.put_line(sql%rowcount);dbms_output.put_line('-------------');select EMPNO,ENAME into empNumber,empName from emp where EMPNO=7499; dbms_output.put_line(sql%rowcount);if sql%isopen thendbms_output.put_line('Cursor is opinging');elsedbms_output.put_line('Cursor is Closing');end if;if sql%notfound thendbms_output.put_line('No Value');elsedbms_output.put_line(empNumber);end if;exceptionwhen no_data_found thendbms_output.put_line('No Value');when too_many_rows thendbms_output.put_line('too many rows');end;--2,使用游标和loop循环来显示所有部门的名称01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 --游标声明declarecursor csr_deptis--select 语句select DNAMEfrom Depth;--指定行指针,这句话应该是指定和csr_dept 行类型相同的变量row_dept csr_dept%rowtype;begin--for 循环for row_dept in csr_dept loopdbms_output.put_line ('部门名称:'||row_dept.DNAME );end loop;end ;--3,使用游标和while 循环来显示所有部门的的地理位置(用%found 属性) 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 declare--游标声明cursor csr_TestWhileis--select 语句select LOCfrom Depth;--指定行指针row_loc csr_TestWhile%rowtype;begin--打开游标open csr_TestWhile;--给第一行喂数据fetch csr_TestWhile into row_loc;--测试是否有数据,并执行循环while csr_TestWhile%found loopdbms_output.put_line ('部门地点:'||row_loc.LOC );--给下一行喂数据fetch csr_TestWhile into row_loc;end loop;close csr_TestWhile;end ;select * from emp ;--4,接收用户输入的部门编号,用for 循环和游标,打印出此部门的所有雇员的所有信息(使用循环游标)--CURSOR cursor_name[(parameter[,parameter],...)] IS select_statement;--定义参数的语法如下:Parameter_name [IN] data_type[{:=|DEFAULT} value] 01 02 03 04 05 06 07 08 09 10 11 12 declareCURSORc_dept (p_deptNo number )isselect * from emp where emp.depno =p_deptNo;r_emp emp%rowtype;beginfor r_emp in c_dept (20) loopdbms_output.put_line ('员工号:'||r_emp.EMPNO||'员工名:'||r_emp.ENAME||'工资:'||r_emp.SAL );end loop;end ;select * from emp ;--5:向游标传递一个工种,显示此工种的所有雇员的所有信息(使用参数游标)01 02 03 04 05 06 07 08 09 10 11 declarecursorc_job (p_job nvarchar 2)isselect * from emp where JOB =p_job;r_job emp%rowtype;beginfor r_job in c_job ('CLERK') loopdbms_output.put_line ('员工号'||r_job.EMPNO||' '||'员工姓名'||r_job.ENAME );end loop;end ;--6:用更新游标来为雇员加佣金:(用if 实现,创建一个与emp 表一摸一样的emp1表,对emp1表进行修改操作),并将更新前后的数据输出出来 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 create table emp 1 as select * from emp;declarecursorcsr_Updateisselect * from emp 1 for update OF SAL;empInfo csr_Update%rowtype;saleInfo emp 1.SAL%TYPE; beginFOR empInfo IN csr_Update LOOPIF empInfo.SAL <1500 THENsaleInfo :=empInfo.SAL *1.2;elsif empInfo.SAL <2000 THENsaleInfo :=empInfo.SAL *1.5;elsif empInfo.SAL <3000 THENsaleInfo :=empInfo.SAL *2;END IF;UPDATE emp 1 SET SAL =saleInfo WHERE CURRENT OF csr_Update;END LOOP;END;--7:编写一个PL/SQL 程序块,对名字以‘A ’或‘S ’开始的所有雇员按他们的基本薪水(sal)的10%给他们加薪(对emp1表进行修改操作)01 02 03 04 05 06 07 08 09 10 11 declarecursorcsr_AddSalisselect * from emp 1 where ENAME LIKE 'A%' OR ENAME LIKE 'S%' for update OF SAL; r_AddSal csr_AddSal%rowtype;saleInfo emp 1.SAL%TYPE;beginfor r_AddSal in csr_AddSal loopdbms_output.put_line (r_AddSal.ENAME||'原来的工资:'||r_AddSal.SAL ); saleInfo :=r_AddSal.SAL *1.1;12 13 14 UPDATE emp 1 SET SAL =saleInfo WHERE CURRENT OF csr_AddSal;end loop;end ;--8:编写一个PL/SQL 程序块,对所有的salesman 增加佣金(comm)500 01 02 03 04 05 06 07 08 09 10 11 12 13 declarecursorcsr_AddComm (p_job nvarchar 2)isselect * from emp 1 where JOB =p_job FOR UPDATE OF COMM;r_AddComm emp 1%rowtype;commInfo emp m%type;beginfor r_AddComm in csr_AddComm ('SALESMAN') LOOPcommInfo :=r_M +500;UPDATE EMP 1 SET COMM =commInfo where CURRENT OF csr_AddComm;END LOOP;END;--9:编写一个PL/SQL 程序块,以提升2个资格最老的职员为MANAGER (工作时间越长,资格越老)--(提示:可以定义一个变量作为计数器控制游标只提取两条数据;也可以在声明游标的时候把雇员中资格最老的两个人查出来放到游标中。

相关文档
最新文档