oracle游标怎么长度 oracle游标的使用详解

Oracle 游标游标能够根据查询条件从数据表中提取一组记录 , 将其作为一个临时表置于数据缓冲区中,利用指针逐行对记录数据进行操作 。
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 isselect 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;
oracle游标怎么使用?创建完了 怎么用?在定义参数游标之后oracle游标怎么长度 , 当使用不同参数值多次打开游标时oracle游标怎么长度,可以产生不同oracle游标怎么长度的结果集oracle游标怎么长度,语法如下oracle游标怎么长度:
cursor
cursor_name(parameter_name
datatype)
is
select_statement;
定义参数游标时 , 游标参数只能指定数据类型,而不能指定长度 。
示例如下:
declare
cursor
temp_cursor(no
number)
is
select
name
from
cip_temps
where
id=no;
v_name
cip_temps.name%type;
begin
open
temp_cursor(1);
loop
oracle游标在实际的应用中要如何使用您正在看的ORACLE教程是:如何在Oracle中使用游标来实现多重循环 。
这篇文章,是最近在写一个项目中所用的存储过程,由于是第一次接触oracle,其间花费了许多功夫,才把功能实现!特记录下来 , 以供参考!
create or replace package PSH_GPRSSTREAMSTAT is
-- Author : ADMINISTRATOR
-- Created : 2004-12-8 10:56:01
-- Purpose : GPRS流量统计状态
-- 统计GPRS流量
type
C_Cur is ref cursor;
function Calcu_GPRSSTREAM return number;
end PSH_GPRSSTREAMSTAT;
create or replace package body PSH_GPRSSTREAMSTAT is
function Calcu_GPRSSTREAM return number
is
c_IPPackHeadLen constant number := 40; -- 定义IP包头长度
CURSOR c_SPINFO is
select distinct spid from sh_spinfo where isactive = '0';
c_MDTINFO C_Cur ;
v_MDTINFO number;
v_UpTransContentLens number(20,0); -- 存放当前GPRS终端上传转发的信息内容长度
v_UpContentLens number(20,0);
v_UpTotalLens number(20,0); -- 累计GPRS终端上传的信息内容长度
v_DownContentLens number(20,0);
v_DownTotalLens number(20,0);
newID number(20,0);
begin
-- 初始化
select max(statid) into newID from sh_gprsstreamstat;
if (newID is null) then
newID := 1;
end if;
for v_SPINFO In c_SPINFO loop -- 首先获取SPID
-- 其次遍历出与当前SPID对应的所有MDT
open c_MDTINFo for select distinct mdtid from sh_mdtinfo where (isactive = '0') and (spid = v_SPINFO.spid);
loop
fetch c_MDTINFO into v_MDTINFO;
exit when c_MDTINFO%notfound;
v_UpContentLens := 0;
v_UpTransContentLens := 0;
v_UpTotalLens := 0;
v_DownContentLens := 0;
v_DownTotalLens := 0;
-- 下面两个select语句是用来获得GPRS终端上传的信息流量
select sum(length(content)c_IPPackHeadLen) into v_UpContentLens from sh_gprsmdtupinfo where (MDTID = v_MDTINFO) and (spid = v_SPINFO.spid) ;
select sum(length(content)c_IPPackHeadLen) into v_UpTransContentLens from sh_gprsmdttransinfo where (issuccess = '1') and (MDTID = v_MDTINFO) and (spid = v_SPINFO.spid) ;
if (v_UpContentLens is null) then
v_UpContentLens := 0;
end if;
if (v_UpTransContentLens is null) then
v_UpTransContentLens := 0;
end if;
v_UpTotalLens := v_UpTotalLensv_UpContentLensv_UpTransContentLens;
-- 下面的Select语句是用来获得服务商下发的信息流量
select sum(length(content)c_IPPackHeadLen) into v_DownContentLens from sh_gprsspdowninfo where (MDTID = v_MDTINFO) and (spid = v_SPINFO.spid) ;
if (v_DownContentLens is null) then
v_DownContentLens := 0;
end if;
v_DownTotalLens := v_DownTotalLensv_DownContentLens ;
-- 将统计出的累计值存放到流量状态统计表中
if (v_UpTotalLens 0) or (v_DownTotalLens0) then
insert into sh_gprsstreamstat (statid,spid,mdtid,starttime,endtime,mdtupstream,spdownstream)
values(newID,v_SPINFO.spid,v_MDTINFO,sysdate,sysdate,v_UpTotalLens,v_DownTotalLens);
-- 自增量加1
newID := newID1;
end if;
end loop;
close c_MDTINFO;
commit;
end loop;
return 1;
end;
begin
null;
end PSH_GPRSSTREAMSTAT;
oracle中游标的使用?这样的问法好笼统 , 不过 , 还是把我整理的给你看看吧~个人整理,无复制的哦~
A:分类:
1:隐式游标:非用户明确声明而产生的游标. 你根本看不到cursor这个关键字.
2:显示游标:用户明确通过cursor关键字来声明的游标.
3:引用游标:
B:什么是隐式游标:
1:什么时候产生:
会在执行任何合法的SQL语句中产生.他不一定存放数据.也有可能存放记录集所影响的行数.
如果执行SELECT语句,这个时候游标会存放数据.如果执行INSERT、UPDATE、 DELETE会存放记录影响的行数.
C:隐式游标叫什么名字:
名字叫sql
关于sql的游标变量到底有哪些呢?
作用:返回最近一次执行SQL语句所涉及的游标相关信息.因为每执行一次SQL语句 , 都会产生一个隐式游标.那么当前执行的SQL语句就是当前的隐式游标.
sql%found
sql%notfound
sql%rowcount
sql%isopen
D:关于隐式游标的例子:
create table 学生基本信息表
(
StuID number(2),
StuName varchar2(20)
)
alter table 学生基本信息表 add constraint PK_STUID primary key(StuID)
declare
num number:=0;
begin
num:=num;
delete from 学生基本信息表 where StuID=num;
if sql%notfound then
dbms_output.put_line('该行数据没有发现');
else
dbms_output.put_line('数据被发现并删除,影响的行数为:'||sql%rowcount);
end if;
end;
E:关于显示游标的例子:
1:如何定义显示游标
declare cursor cursor_name is [select语句];
declare cursor mycur is select empno,ename,job from scott.emp;
2:如何打开游标:
open cursor_name;
open mycur;
3:如何通过游标来读取数据
fetch cursor_name into variable_list
4:如何关闭游标:
close cursor_name;
close mycur;
注意:在Oracle中,不需要显示销毁游标.因为在Oracle中,很多东西是由JAVA写的.Oracle会自动销毁游标.
5:举例:
declare
cursor mycur is select empno,ename,job from emp;--创建游标
vempno emp.empno%type;
vename emp.ename%type;
vjob emp.job%type;
begin
open mycur;--打开游标
fetch mycur into vempno,vename,vjob;--使用数据
dbms_output.put_line('I Found You!'||mycur%rowcount||'行');
dbms_output.put_line('读取的数据为'||vempno||' '||vename||' '||vjob);
close mycur;
end;
因为只读出来一条,所以要遍历一下:
declare
cursor mycur is select empno,ename,job from emp;
vempno emp.empno%type;
vename emp.ename%type;
vjob emp.job%type;
begin
open mycur;
loop—循环,遍历
fetch mycur into vempno,vename,vjob;
exit when mycur%notfound;
if mycur%found then
dbms_output.put_line('读取的数据为'||vempno||' '||vename||' '||vjob);
end if;
end loop;
dbms_output.put_line('I Found You!'||mycur%rowcount||'行');
close mycur;
【oracle游标怎么长度 oracle游标的使用详解】end;
6:通常情况下我们在读取表数据的时候,我们需要动态的去查询.所以能不能在Oracle中给游标带参数呢?可以!
1):如何定义带参数的游标:
declare cursor cursor_name(参数名称 参数类型描述) is select xxxxx from bbbbb where aaa==??? and ccc=???;
2):例子:
游标是一个集合,读取数据有两种方式
第一种方式: open fetch close
第二种方式: for 一但使用了for循环 ,在循环刚刚开始的时候,相当于执行open,在处理循环的时候,相当于执行fetch,在退出循环的时候,相当于执行了close
Declarecursor query(vname varchar) is select empno,ename,job from emp where ename like'%'||vname||'%';
三种游标的例子:
--
DECLARE
CURSOR TEST_CUR IS
SELECT * FROM EMP;
MY_CUR EMP%ROWTYPE;
BEGIN
OPEN TEST_CUR;
FETCH TEST_CUR INTO MY_CUR;
WHILE TEST_CUR%FOUND
LOOP
DBMS_OUTPUT.PUT_LINE(MY_CUR.EMPNO||','||MY_CUR.ENAME);
FETCH TEST_CUR INTO MY_CUR;
END LOOP;
CLOSE TEST_CUR;
END;
--
DECLARE
CURSOR TEST_CUR IS
SELECT * FROM EMP;
BEGIN
FOR MY_CUR IN TEST_CUR
LOOP
DBMS_OUTPUT.PUT_LINE(MY_CUR.EMPNO||','||MY_CUR.ENAME);
END LOOP;
END;
--
DECLARE
CURSOR TEST_CUR(V_SAL NUMBER) IS
SELECT *
FROM EMP
WHERE SALV_SAL;
V_SAL1 NUMBER ;
BEGIN
V_SAL1 := 2000;
FOR MY_CUR IN TEST_CUR(V_SAL1)
LOOP
DBMS_OUTPUT.PUT_LINE(MY_CUR.EMPNO||','||MY_CUR.ENAME);
END LOOP;
END;
Oracle中的存储过程,怎么获取到游标的长度无法直接获得.
必须把游标fetch
循环一遍,才知道有多少行.
关于oracle游标怎么长度和oracle游标的使用详解的介绍到此就结束了 , 不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站 。

    推荐阅读