`
Ben.Sin
  • 浏览: 234118 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

Oracle Cursors语法总结

阅读更多

Oracle Cursors语法总结
关于Oracle Cursors的语法总结,Oracle Cursors是用来查询数据库,获取记录集合(结果集)的指针,可以让开发者一次访问一行结果集,在每条结果集上作操作。

 

 

一.Oracle的Cursors概念:
游标:用来查询数据库,获取记录集合(结果集)的指针,可以让开发者一次访问一行结果集,在每条结果集上作操作。

二.Oracle的Cursors分类:
1.静态游标:
分为显式游标和隐式游标。
2.REF游标:
是一种引用类型,类似于指针。

三.Oracle的Cursors详细内容:
1.显式游标:
CURSOR游标名(参数) [返回值类型] IS
Select语句
生命周期:
a.打开游标(OPEN)
解析,绑定。。。不会从数据库检索数据
b.从游标中获取记录(FETCH INTO)
执行查询,返回结果集。通常定义局域变量作为从游标获取数据的缓冲区。
c.关闭游标(CLOSE)
完成游标处理,用户不能从游标中获取行。还可以重新打开。
选项:参数和返回类型
set serveroutput on
declare
cursor emp_cur ( p_deptid in number) is
select * from employees where department_id = p_deptid;
l_emp employees%rowtype;
begin
dbms_output.put_line('Getting employees from department 30');
open emp_cur(30);
loop
  fetch emp_cur into l_emp;
  exit when emp_cur%notfound;
  dbms_output.put_line('Employee id '|| l_emp.employee_id || ' is ');
  dbms_output.put_line(l_emp.first_name || ' ' || l_emp.last_name);
end loop;
close emp_cur;
dbms_output.put_line('Getting employees from department 90');
open emp_cur(90);
loop
  fetch emp_cur into l_emp;
  exit when emp_cur%notfound;
  dbms_output.put_line('Employee id '|| l_emp.employee_id || ' is ');
  dbms_output.put_line(l_emp.first_name || ' ' || l_emp.last_name);
end loop;
close emp_cur;
end;
/

2.隐式游标:
不用明确建立游标变量,分两种:
a.在PL/SQL中使用DML语言,使用ORACLE提供的名为SQL的隐示游标
b.CURSOR FOR LOOP,用于for loop语句
a.举例:
declare
begin
update departments set department_name=department_name;
--where 1=2;

dbms_output.put_line('update '|| sql%rowcount ||' records');
end;
/

b.举例:
declare
begin
for my_dept_rec in ( select department_name, department_id from departments)
loop
  dbms_output.put_line(my_dept_rec.department_id || ' : ' || my_dept_rec.department_name);
end loop;
end;
/

c.举例:
单独select
declare
l_empno emp.EMPLOYEE_ID%type;
-- l_ename emp.ename%type;
begin
select EMPLOYEE_ID  
  into l_empno
from emp;
--where rownum =1;
dbms_output.put_line(l_empno);
end;
/

使用INTO获取值,只能返回一行。

游标属性:
%FOUND:变量最后从游标中获取记录的时候,在结果集中找到了记录。
%NOTFOUND:变量最后从游标中获取记录的时候,在结果集中没有找到记录。
%ROWCOUNT:当前时刻已经从游标中获取的记录数量。
%ISOPEN:是否打开。
Declare
Cursor emps is
Select * from employees where rownum<6 order by 1;

Emp employees%rowtype;
Row number :=1;
Begin
Open emps;
Fetch emps into emp;

Loop
  If emps%found then
   Dbms_output.put_line('Looping over record '||row|| ' of ' || emps%rowcount);
   Fetch emps into emp;
   Row := row + 1;
  Elsif emps%notfound then
   Exit;  ---exit loop, not IF
  End if;
End loop;

If emps%isopen then
  Close emps;
End if;
End;
/

显式和隐式游标的区别:
尽量使用隐式游标,避免编写附加的游标控制代码(声明,打开,获取,关闭),也不需要声明变量来保存从游标中获取的数据。

3.REF CURSOR游标:
动态游标,在运行的时候才能确定游标使用的查询。分类:
1.强类型(限制)REF CURSOR,规定返回类型
2.弱类型(非限制)REF CURSOR,不规定返回类型,可以获取任何结果集。
TYPE ref_cursor_name IS REF CURSOR [RETURN return_type]

Declare
Type refcur_t is ref cursor;

Type emp_refcur_t is ref cursor return employee%rowtype;
Begin
Null;
End;
/

强类型举例:
declare
--声明记录类型
type emp_job_rec is record(
  employee_id number,
  employee_name varchar2(50),
  job_title varchar2(30)
);
--声明REF CURSOR,返回值为该记录类型
type emp_job_refcur_type is ref cursor
  return emp_job_rec;
--定义REF CURSOR游标的变量
emp_refcur emp_job_refcur_type;
emp_job emp_job_rec;
begin
open emp_refcur for
  select e.employee_id,
    e.first_name || ' ' ||e.last_name "employee_name",
    j.job_title
  from employees e, jobs j
  where e.job_id = j.job_id and rownum < 11 order by 1;
fetch emp_refcur into emp_job;
while emp_refcur%found loop
  dbms_output.put_line(emp_job.employee_name || '''s job is ');
  dbms_output.put_line(emp_job.job_title);
  fetch emp_refcur into emp_job;
end loop;
end;
/

 

 

 

分享到:
评论

相关推荐

    oracle语法大全

    Oracle数据库是全球广泛使用的大型关系型数据库管理系统之一,其语法丰富多样,涵盖了数据查询、数据操纵、数据定义和数据控制等多个方面。以下是对"Oracle语法大全"这一主题的详细阐述。 1. 数据查询(DQL):...

    ORACLE SQL and PLSQL

    - **游标(Cursors)**:用于检索记录集。 - 显式游标:由程序员显式定义和操作。 - 隐式游标:由PL/SQL自动创建和管理。 - **索引(Indexes)**:加快数据检索速度。 - **分区(Partitioning)**:将大表分割...

    oracle 数据库的学习资料, sql语句的详细学习资料

    其他如“9.pdf”、“3.pdf”、“4.pdf”等文件,很可能是对SQL基础语法的详细讲解,包括数据类型、DML(Data Manipulation Language)操作如INSERT、UPDATE、DELETE,以及DDL(Data Definition Language)用于创建、...

    Oracle错误码大全

    例如,“ORA-00922”表示一个SQL语法错误。错误码通常会附带一个简短的错误描述,提供关于问题原因和可能解决方案的线索。 在Oracle 8i中,常见的错误码包括但不限于: 1. ORA-01000: 达到最大打开游标数 - 表示...

    Inceptor SQL语法.docx

    Inceptor SQL 语法是基于 Oracle 方言的 PL/SQL 手册,它提供了详细的语法规则和实践指南,以帮助开发者更好地使用 Inceptor PL/SQL。 常量和变量 在 PL/SQL 中,可以用常量和变量存储值。常量的值不能改变,而...

    Oracle中EXECUTE IMMEDIATE用法

    2. **支持子查询和返回结果集**:除了基本的DML操作,`EXECUTE IMMEDIATE`还支持执行复杂的子查询,并能返回结果集,这通常是以游标(Ref cursors)的形式返回。 3. **无需显式事务控制**:当使用`EXECUTE ...

    Oracle10g

    这份文档详细介绍了Oracle10g中的SQL语言使用,包括标准的SQL语法以及Oracle特有的扩展。SQL是Structured Query Language的缩写,是用于管理和操作数据库的语言。在Oracle10g中,你可以学习到如何创建、修改和删除...

    开源项目-go-goracle-goracle.zip

    `goracle`是基于Go语言的一个Oracle数据库驱动,它实现了Go语言的标准数据库接口(database/sql包),使得开发者能够利用Go语言的强大特性和简洁语法来处理Oracle数据库的操作。项目的目标是提供一个稳定、高效且...

    Oracle PL/SQL

    游标 FOR 循环的语法如下所示: ```sql FOR record IN cursor LOOP -- 可执行的语句 END LOOP; ``` 传入参数 PL/SQL 程序可以接受参数的传入,这允许开发者在程序中使用外部数据。参数可以是 IN、OUT 或 IN OUT ...

    oracle sql and pl/sql

    - **游标(Cursors)**:用于处理查询结果集。 - **事务控制**:使用 COMMIT 和 ROLLBACK 来管理事务边界。 - **性能优化**:利用存储过程减少网络通信,提高整体系统性能。 #### 三、SQL*Plus 1. **定义**:SQL...

    oracle 常用命令

    总结来说,Oracle数据库的管理涉及到多个方面,而重启数据库实例与修改最大连接数是日常操作中较为常见的需求。通过上述命令可以轻松实现这两个目标。需要注意的是,操作数据库时应当具有相应的权限,并且在进行参数...

    oracle数据库优化

    1. Parse阶段:在这个阶段,Oracle首先验证SQL语句的语法,确保它是合法的。然后,它会检查用户是否有执行该语句的权限,以及涉及到的表、列和其他对象是否存在。如果SQL语句已经存在于共享池中,Oracle将进行软解析...

    Oracle PL SQL语言基础

    Oracle PL/SQL(Procedural Language/Structured Query Language)是Oracle数据库系统中用于数据库编程的一种扩展SQL语言。它结合了SQL的查询能力与过程性编程语言的控制结构,使得开发者可以编写复杂的数据库应用...

    oracle 10 dba II

    - RMAN(恢复管理器)是Oracle 10g中的主要备份工具,了解其命令行语法和备份策略是DBA的基本技能。 - 理解完整备份、增量备份和差异备份的区别,以及如何在不同的恢复场景下选择合适的备份类型。 3. **性能监控...

    2008年哈尔滨工业大学软件学院Oracle考试题

    3. **PL/SQL编程**:Oracle的PL/SQL是用于数据库操作的高级编程语言,考生需要熟悉PL/SQL的语法,包括变量声明、条件语句(IF-THEN-ELSIF)、循环(LOOPs)、异常处理( EXCEPTIONS)以及过程和函数的创建与调用。...

    Oracle子程序和程序包

    6. 示例可能还会涉及到游标(Cursors)、记录类型(Record Types)和PL/SQL集合(Collections),这些都是在数据库操作中常见的高级特性。 通过学习这些案例,你可以掌握如何在实际项目中有效地使用Oracle子程序和...

    oracle

    游标(Cursors) 游标是PL/SQL中处理记录集的重要工具,允许逐行访问结果集。声明游标的基本语法如下: ```sql DECLARE CURSOR cur_name IS SELECT column1, column2, ... FROM table_name WHERE condition; ...

    Oracle官方文档CHM合集-SQL参考手册.rar

    "Ora9iSQLRef.chm"可能包含了Oracle 9i版本的SQL语法和功能,虽然版本较旧,但许多基本概念和用法仍然适用于新的Oracle版本。"下载说明.txt"可能包含获取和使用这些文档的步骤和注意事项,而"Welcome to ...

    oracle考试1Z0-101.pdf

    1. **PL/SQL语法**:包括变量声明、数据类型、控制结构(如IF-THEN-ELSE,WHILE,FOR循环)、异常处理(BEGIN-EXCEPTION-END块)以及游标等。 2. **PL/SQL块的结构**:了解声明部分、执行部分和异常处理部分的构成...

    ORACLE PL/SQL 存储过程 触发器

    在文档`oracle.doc`和`PLSQL块.doc`中,可能会详细阐述如何创建、调用存储过程,定义触发器的语法,以及如何在PL/SQL中有效地使用游标。通过学习这些内容,你可以深入了解如何利用Oracle的PL/SQL来构建高效、可靠的...

Global site tag (gtag.js) - Google Analytics