重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
Oracle中的游标分为显示游标和隐式游标。
成都创新互联公司为企业级客户提高一站式互联网+设计服务,主要包括网站制作、网站设计、app软件开发公司、重庆小程序开发、宣传片制作、LOGO设计等,帮助客户快速提升营销能力和企业形象,创新互联各部门都有经验丰富的经验,可以确保每一个作品的质量和创作周期,同时每年都有很多新员工加入,为我们带来大量新的创意。
显示游标:
显示游标是用cursor...is命令定义的游标,它可以对查询语句(select)返回的多条记录进行处理;显示游标的操作:打开游标、操作游标、关闭游标;
隐式游标:
隐式游标是在执行插入(insert)、删除(delete)、修改(update)和返回单条记录的查询(select)语句时由PL/SQL自动定义的。PL/SQL隐式地打开SQL游标,并在它内部处理SQL语句,然后关闭它。
游标能够根据查询条件从数据表中提取一组记录,将其作为一个临时表置于数据缓冲区中,利用指针逐行对记录数据进行操作。
Oracle中的游标分为显示游标和隐式游标 。
在执行SQL语句时,Oracle会自动创建隐式游标,该游标是内存中处理该语句的数据缓冲区,存储了执行SQL语句的结果。通过隐式游标属性可获知SQL语句的执行状态信息。
%found:布尔型属性,如果sql语句至少影响到一行数据,值为true,否则为false。
%notfound:布尔型属性,与%found相反。
%rowcount:数字型属性,返回受sql影响的行数。
%isopen:布尔型属性,当游标已经打开时返回true,游标关闭时则为false。
用户可以显式定义游标。使用显式游标处理数据要4个步骤:定义游标、打开游标、提取游标数据和关闭游标。
游标由游标名称和游标对应的select结果集组成。定义游标应该放在pl/sql程序块的声明部分。
语法格式:cursor 游标名称(参数) is 查询语句
打开游标时,游标会将符合条件的记录送入数据缓冲区,并将指针指向第一条记录。
语法格式:open 游标名称(参数);
将游标中的当前行数据赋给指定的变量或记录变量。
语法格式:fetch 游标名称 into 变量名;
游标一旦使用完毕,就应将其关闭,释放与游标相关联的资源。
语法格式:close 游标名称;
declare
cursor c1 is select sno,cno,grade from sc;
v_sno sc.sno%type;
v_cno sc.cno%type;
v_grade sc.grade%type;
begin
open c1;
loop
fetch c1 into v_sno,v_cno,v_grade;
exit when c1%notfound;--紧跟fetch之后
if c1%found then
dbms_output.put_line(to_char(c1%rowcount)||v_cno);
end if;
end loop;
close c1;
end;
declare
cursor c1 is select sno,cno,grade from sc;
v_sno sc.sno%type;
v_cno sc.cno%type;
v_grade sc.grade%type;
begin
open c1;
fetch c1 into v_sno,v_cno,v_grade;
while c1%found loop
dbms_output.put_line(v_sno||v_cno||v_grade);
fetch c1 into v_sno,v_cno,v_grade;
end loop;
close c1;
end;
第三种:for
declare
cursor c1 is select sno,cno,grade from sc;
begin
for item in c1 loop
dbms_output.put_line(rpad(item.sno,'10',' ')||rpad(item.cno,'10',' ')||rpad(item.grade,'10',' '));
end loop;
end;
select * /*+ FIRST_ROWS */ from XXX where XXX
提高SQL语句的响应时间,快速的先返回 n 行。
SELECT /*+ FIRST_ROWS */ * FROM
(
SELECT A.*, ROWNUM RN
FROM (SELECT * FROM TABLE_NAME) A
WHERE ROWNUM = 40
)
WHERE RN = 21
游标一般都是在执行sql语句,我不知道你指的是这个sql语句比较慢,还是单纯的游标速度慢。
sql语句慢可以根据使用改写sql语句的写法,建立索引,建立分区等优化手段来解决。
单纯游标速度慢,可以考略批量执行
bulk collect这种方式提取数据
使用forall 替代for 循环也可以提升效率。
以下是我总结的plsql调优的重点,你可以参考一下:
1. 尽早退出循环
2. static的变量尽量放在循环的外层
3. 因为and 和or 只要判断左边的表达式为真即可推出 逻辑判断
所以
将容易出现true的逻辑表达式放在左边,这样可以省下处理的时间
4. if else 和case when 同上
5. 尽量使用迭代,而不是递归,因为调用存储过程或者函数,会开辟另外的内存空间
6. 通常函数都是值传递,即传参数的时候会copy参数的值到子程序中
对于数据量比较大的参数可以使用
in out nocopy 指定引用传递,可以节省大量时间
7. 可以使用关联数组,较少查找集合中元素的时间
关联数组
index by varchar2(xx) 类似于map,会省下很集合操作,以及时间。
8. 对于cpu密集型的plsql,可以使用native 本地编译的特性
alter xxx compile plsql_code_type=native ;
9. 经常使用的子程序可以使用inline函数内嵌到主程序中
pragma inline($FUNCTION_NAME,'yes') ;
重载的程序只要拥有相同的名称都会被内嵌到program unit中
plsql_optimize_level=2的时候需要声明inline使用内联
plsql_optimize_level=3的编译的时候会自动的做这部分工作。不需要自己执行inline操作。可以使用PRAGMA INLINE (p1, 'NO');禁止内联
当level=3的时候声明了inline会给予这个子程序更高的inline的优先级。
下面的语句中
(1)PRAGMA INLINE (p1, 'YES');
(2)PRAGMA INLINE (p1, 'NO');
(3)PRAGMA INLINE (p1, 'YES');
第二行会覆盖第一行以及第三行,也就是说program unit 中奖不使用内联
10. 大量数字操作的时候可以使用java存储过程
11. 使用result cache功能 缓存经过计算得到的结果
relies_on($TB_NAME)
指定当表tb_name的数据改变时,结果集缓存失效
12. 使用
update of $COLUMN_NAME on $TB_NAME
for each row
when (new.xx1000)
可以省下需要处理时间
最好都使用after 触发器,before可能会有锁定的问题