java调用存储过程简单例子:
http://www.blogjava.net/TrampEagle/archive/2005/12/13/23605.html
如何选择游标:
http://space.itpub.net/batch.viewlink.php?itemid=176913
PL/SQL里的游标可以分为显式和隐式两种,而隐式有分为select into隐式游标和for .. in 隐式游标两种。所以,我们可以认为,有3种游标用法:
A. 显式游标
B. select into隐式游标
C. for .. in 隐式游标
A. 显式游标
普通显式游标,指的是通过定义获得游标,并通过open,fetch,close的等方法来操作
游标[php]
declare
cursor c is select tname from tab ;
l_tname varchar2(64);
begin
open c ;
loop
fetch c into l_tname ;
exit when c%notfound ;
dbms_output.put_line(l_tname);
end loop;
close c;
end;
/
..
..
[/php]
Bulk Collect的 显式游标
[php]
declare
cursor c is select tname from tab ;
l_tname_array dbms_sql.varchar2_table;
begin
open c ;
fetch c bulk collect into l_tname_array ;
for i in 1 .. l_tname_array.count loop
dbms_output.put_line(l_tname_array(i) );
end loop;
close c;
end;
/
..
..
[/php]
Bulk Collect的 显式游标 + limit
[php]
declare
cursor c is select tname from tab ;
l_tname_array dbms_sql.varchar2_table;
begin
open c ;
loop
fetch c bulk collect into l_tname_array limit 10 ;
exit when c%notfound ;
for i in 1 .. l_tname_array.count loop
dbms_output.put_line(l_tname_array(i) );
end loop;
end loop;
close c;
end;
/
..
..
[/php]
隐式游标相对于显式游标而言,指的是不需要事先Declare,也无须用open,fetch,close的等方法来操作,而是通过其它的方式来操作游标
B. select into隐式游标
[php]
declare
l_tname varchar2(100);
begin
select tname into l_tname from tab where rownum = 1 ;
dbms_output.put_line(l_tname);
end;
/
..
..
[/php]
动态SQL 的 select into隐式游标
[php]
declare
l_tname varchar2(100);
l_table_name varchar2(100);
l_sql varchar2(200);
begin
l_table_name := 'TAB' ;
l_sql := 'select tname from '||l_table_name ||' where rownum = 1 ' ;
execute immediate l_sql into l_tname;
dbms_output.put_line(l_tname );
end;
/
..
..
[/php]
动态SQL 的 select into隐式游标 + Bulk Collect
[php]
declare
l_tname_array dbms_sql.varchar2_table;
l_table_name varchar2(100);
l_sql varchar2(200);
begin
l_table_name := 'TAB' ;
l_sql := 'select tname from '||l_table_name ;
execute immediate l_sql bulk collect into l_tname_array;
for i in 1 .. l_tname_array.count loop
dbms_output.put_line(l_tname_array(i) );
end loop;
end;
/
..
..
[/php]
C. for .. in 隐式游标
for .. in 隐式游标通过loop的开始于结束来控制cursor的Open与Close.
[php]
begin
for c in (select tname from tab) loop
dbms_output.put_line(c.tname);
end loop;
end;
/
..
..
[/php]
2.三种用法的优劣
A. 显式游标
优点:
·可以用于Bulk Collect的批量处理句式以提高性能
·可以用于动态SQL的游标处理
缺点:
·麻烦,需要定义,打开,Fetch,Close一堆代码,增加代码复杂度,从而增加出错的可能性
B. select into隐式游标B
优点
·代码量最少
·可以自动Detect 返回数据超过一行或少于一行的错误
·可以使用Bulk Collect 批量处理,但是无法使用Limit 关键字
缺点
·如果不使用Bulk Collect 批量处理,仅仅只能用于返回数据正好一行的情况,无法使用于返回数据超过一行或少于一行的环境
·使用Bulk Collect 批量处理时,无法使用limit 关键字,无法处理返回行数太多的情况(不好处理,容易造成PGA过大)
C. for .. in 隐式游标
优点
·代码量远少于显式游标
·代码可读性优于显式游标
·代码的出错可能性也小于显式游标
缺点:
·无法用于动态SQL的游标处理
·在返回行数超过10行的情况下,性能明显不如使用Bulk Collect的显式游标
在性能对比方面,除非是使用了Bulk Collect,否则,三种方式没有明显性能差距。
3。具体的选择
·在返回数据为一行的情况下,尽量使用select into 的隐式游标
·返回0行或者<几十行的情况下,使用for .. in 隐式游标
·或者在返回行稍多,但是不关心Fetch性能的情况下,也可考虑用for .. in 隐式游标
·返回10行-100行(一个很随意选择的经验值,可以自己根据情况设定),而且关心Fetch性能的情况下,可以使用select into 的隐式游标+Bulk collect ,在获得性能提升的情况下,代码量也不会增加太多。
·返回行数很多,> 100, 应选用显示游标+Bulk collect ,以获得较高的Fetch 性能,同时不至于使用太大的PGA内存。
·如国使用动态SQL, 则根据select list (column list) 是否固定,如果固定,仍然可以考虑使用select into 的隐式游标+动态SQL的方式。当然,仍然需要考虑返回行数的问题。
·如果select list (column list) 不固定,则只好使用显式游标
·或者动态语句返回行数太多,必须用limit,那么也只好用显式游标了
分享到:
相关推荐
PL/SQL 程序设计 本章主要重点: PL/SQL概述 PL/SQL块结构 PL/SQL流程 运算符和表达式 游标 异常处理 数据库存储过程和函数 包 触发器
1、PL/SQL简介 2、PL/SQL基础 3、记录和表 4、在PL/SQL中使用SQL 5、内置SQL函数 6、游标 7、过程和函数 ...
Pl/SQL简介 控制结构 复合数据类型 游标 异常 创建存储过程 函数的概念 包的概念 触发器概念
pl/sql存储过程,函数,游标,以及存储过程中的基础知识,绝对值得你收藏的经典题目,让你的pl/sql得到最大的锻炼。让你的数据库逻辑更加灵活。
PL/SQL简介(第1~2章) PL/SQL中的SQL语句(第3章) 控制结构(第4~7章) 异常处理(第8~10章) 游标(第11~12章) 触发器(第13~14章) 复合数据类型(第15~16章) 动态SQL(第17章) 批量SQL(第18章) 子程序和包...
读者不仅可以掌握oracle常用工具oracle universal installer、net comfiguration assistant、sql developer、sql*plus的作用及使用方法,而且可以掌握sql语句和pl/sql的各种基础知识和高级特征(记录类型、集合类型...
PL/SQL是ORACLE对标准数据库语言的扩展,ORACLE公司已经将PL/SQL整合到ORACLE 服务器和其他工具中了,近几年中更多的开发人员和DBA开始使用PL/SQL,本文将讲述PL/SQL基础语法,结构和组件、以及如何设计并执行一个PL...
PL /SQL是一种高级数据库程序设计语言,该语言专门用于在各种环境下对ORACLE数据库进行访问。由于该语言集成于数据库服务器中,所以PL/SQL代码可以对数据进行快速高效的处理。除此之外,可以在ORACLE数据库的某些...
本书是专门为Oracle应用开发人员提供的SQL和PL/SQL编程指南。通过学习本书,读者不仅可以掌握Oracle常用工具Oracle Universal Installer、Net Comfiguration Assistant、SQL Developer、SQL*Plus的作用及使用方法,...
Oracle 11g SQL和PL SQL从入门到精通 pdf格式电子书 下载(一) http://download.csdn.net/source/3268267 Oracle 11g SQL和PL SQL从入门到精通 pdf格式电子书 下载(二) ...
包含oracle存储过程的增、删、查、改 %type、%rowtype的使用 自定义函数 PL/SQL块
pl/sql中的一些基本概念,讲解了pl/sql语句的编写方法。其中包含了pl/sql的简单语句、循环语句、条件语句等的相关知识,重点介绍了存储过程、函数、游标、触发器等的编写和运用。
内容包括(1)PL/SQL简介(2)PL/SQL语法(3)存储过程(4)触发器(5)游标(6)包(7)函数七部分。如果你是初学者,很快时间就可以掌握PL/SQL了。相信我,没错的!
讲解oracle中的pl/sql的使用,存储过程,游标,函数,程序包,触发器。等等。
PL/SQL Developer为简化日常开发专门提供了几种工具。使用这些工具,您可以重新编译全部不合法对象、查找数据库源中文本、导入或导出表格、生成测试数据、导出文本文件、监控dbms_alert和dbms_pipe事件、浏览会话...
如题,初步研究了pl/sql的写法,现给出存储过程,游标等的使用,后续会给出其他的用法
走进Oracle、认识PL/SQL、数据表的基本操作、表中数据的基本操作、数据的基本查询、查询中函数的使用、数据表的高级查询、索引及视图的使用、数据类型、流程控制、游标、存储过程和函数、触发器、异常处理、事务和锁...
【实验目的】 1. 熟悉PL/SQL的数据类型和书写规则 2. 熟悉控制结构和游标的使用 3. 编写和运行函数、过程和触发器