您正在看的ORACLE教程是:如何在Oracle中使用游標來實現(xiàn)多重循環(huán)。

成都創(chuàng)新互聯(lián)公司-專業(yè)網(wǎng)站定制、快速模板網(wǎng)站建設(shè)、高性價比吉水網(wǎng)站開發(fā)、企業(yè)建站全套包干低至880元,成熟完善的模板庫,直接使用。一站式吉水網(wǎng)站制作公司更省心,省錢,快速模板網(wǎng)站建設(shè)找我們,業(yè)務(wù)覆蓋吉水地區(qū)。費用合理售后完善,10年實體公司更值得信賴。
這篇文章,是最近在寫一個項目中所用的存儲過程,由于是第一次接觸oracle,其間花費了許多功夫,才把功能實現(xiàn)!特記錄下來,以供參考!
create or replace package PSH_GPRSSTREAMSTAT is
-- Author : ADMINISTRATOR
-- Created : 2004-12-8 10:56:01
-- Purpose : GPRS流量統(tǒng)計狀態(tài)
-- 統(tǒng)計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); -- 存放當(dāng)前GPRS終端上傳轉(zhuǎn)發(fā)的信息內(nèi)容長度
v_UpContentLens number(20,0);
v_UpTotalLens number(20,0); -- 累計GPRS終端上傳的信息內(nèi)容長度
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
-- 其次遍歷出與當(dāng)前SPID對應(yīng)的所有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_UpTotalLens + v_UpContentLens + v_UpTransContentLens;
-- 下面的Select語句是用來獲得服務(wù)商下發(fā)的信息流量
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_DownTotalLens + v_DownContentLens ;
-- 將統(tǒng)計出的累計值存放到流量狀態(tài)統(tǒng)計表中
if (v_UpTotalLens 0) or (v_DownTotalLens 0) 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 := newID + 1;
end if;
end loop;
close c_MDTINFO;
commit;
end loop;
return 1;
end;
begin
null;
end PSH_GPRSSTREAMSTAT;
無法直接獲得.
必須把游標fetch
循環(huán)一遍,才知道有多少行.
這樣的問法好籠統(tǒng),不過,還是把我整理的給你看看吧~個人整理,無復(fù)制的哦~
A:分類:
1:隱式游標:非用戶明確聲明而產(chǎn)生的游標. 你根本看不到cursor這個關(guān)鍵字.
2:顯示游標:用戶明確通過cursor關(guān)鍵字來聲明的游標.
3:引用游標:
B:什么是隱式游標:
1:什么時候產(chǎn)生:
會在執(zhí)行任何合法的SQL語句中產(chǎn)生.他不一定存放數(shù)據(jù).也有可能存放記錄集所影響的行數(shù).
如果執(zhí)行SELECT語句,這個時候游標會存放數(shù)據(jù).如果執(zhí)行INSERT、UPDATE、 DELETE會存放記錄影響的行數(shù).
C:隱式游標叫什么名字:
名字叫sql
關(guān)于sql的游標變量到底有哪些呢?
作用:返回最近一次執(zhí)行SQL語句所涉及的游標相關(guān)信息.因為每執(zhí)行一次SQL語句,都會產(chǎn)生一個隱式游標.那么當(dāng)前執(zhí)行的SQL語句就是當(dāng)前的隱式游標.
sql%found
sql%notfound
sql%rowcount
sql%isopen
D:關(guān)于隱式游標的例子:
create table 學(xué)生基本信息表
(
StuID number(2),
StuName varchar2(20)
)
alter table 學(xué)生基本信息表 add constraint PK_STUID primary key(StuID)
declare
num number:=0;
begin
num:=num;
delete from 學(xué)生基本信息表 where StuID=num;
if sql%notfound then
dbms_output.put_line('該行數(shù)據(jù)沒有發(fā)現(xiàn)');
else
dbms_output.put_line('數(shù)據(jù)被發(fā)現(xiàn)并刪除,影響的行數(shù)為:'||sql%rowcount);
end if;
end;
E:關(guān)于顯示游標的例子:
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:如何通過游標來讀取數(shù)據(jù)
fetch cursor_name into variable_list
4:如何關(guān)閉游標:
close cursor_name;
close mycur;
注意:在Oracle中,不需要顯示銷毀游標.因為在Oracle中,很多東西是由JAVA寫的.Oracle會自動銷毀游標.
5:舉例:
declare
cursor mycur is select empno,ename,job from emp; --創(chuàng)建游標
vempno emp.empno%type;
vename emp.ename%type;
vjob emp.job%type;
begin
open mycur;--打開游標
fetch mycur into vempno,vename,vjob;--使用數(shù)據(jù)
dbms_output.put_line('I Found You!'||mycur%rowcount||'行');
dbms_output.put_line('讀取的數(shù)據(jù)為'||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—循環(huán),遍歷
fetch mycur into vempno,vename,vjob;
exit when mycur%notfound;
if mycur%found then
dbms_output.put_line('讀取的數(shù)據(jù)為'||vempno||' '||vename||' '||vjob);
end if;
end loop;
dbms_output.put_line('I Found You!'||mycur%rowcount||'行');
close mycur;
end;
6:通常情況下我們在讀取表數(shù)據(jù)的時候,我們需要動態(tài)的去查詢.所以能不能在Oracle中給游標帶參數(shù)呢?可以!
1):如何定義帶參數(shù)的游標:
declare cursor cursor_name(參數(shù)名稱 參數(shù)類型描述) is select xxxxx from bbbbb where aaa==??? and ccc=???;
2):例子:
游標是一個集合,讀取數(shù)據(jù)有兩種方式
第一種方式: open fetch close
第二種方式: for 一但使用了for循環(huán) ,在循環(huán)剛剛開始的時候,相當(dāng)于執(zhí)行open,在處理循環(huán)的時候,相當(dāng)于執(zhí)行fetch,在退出循環(huán)的時候,相當(dāng)于執(zhí)行了close
Declare cursor 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 SAL V_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;
一般用游標,不用關(guān)心長度,系統(tǒng)自動辦你判斷是否有值。你可以在網(wǎng)上搜一些用法例子。
1、通過圖形界面操作,在左側(cè)依次選擇objects-tables,右鍵單擊要修改的表名,選中‘Edit’-column,可以直接修改;
2、使用DDL語句:alter table 表名 modify 字段名(字符類型(長度))
例如:
alter table emp modify ename(varchar2(32))
在定義參數(shù)游標之后,當(dāng)使用不同參數(shù)值多次打開游標時,可以產(chǎn)生不同的結(jié)果集,語法如下:
cursor
cursor_name(parameter_name
datatype)
is
select_statement;
定義參數(shù)游標時,游標參數(shù)只能指定數(shù)據(jù)類型,而不能指定長度。
示例如下:
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
當(dāng)前題目:oracle游標怎么長度 oracle游標大小
分享網(wǎng)址:http://chinadenli.net/article0/hijgio.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供App開發(fā)、網(wǎng)站改版、網(wǎng)站建設(shè)、微信小程序、關(guān)鍵詞優(yōu)化、網(wǎng)站設(shè)計公司
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)