oracle游标理解,oracle游标的使用方法
oracle游標(biāo)的使用方法:
①、定義游標(biāo) cursor
②、打開(kāi)游標(biāo) open
③、提取游標(biāo) fetch
④、關(guān)閉游標(biāo) close
declare
--類型定義
cursor c_job
is
select empno,ename,job,sal
from emp
where job=‘MANAGER‘;
--定義一個(gè)游標(biāo)變量
c_row c_job%rowtype;
begin
open c_job;
loop
--提取一行數(shù)據(jù)到c_row
fetch c_job into c_row;
--判讀是否提取到值,沒(méi)取到值就退出
--取到值c_job%notfound 是false
--取不到值c_job%notfound 是true
exit when c_job%notfound;
dbms_output.put_line(c_row.empno||‘-‘||c_row.ename||‘-‘||c_row.job||‘-‘||c_row.sal);
end loop;
--關(guān)閉游標(biāo)
close c_job;
end;
create or replace function comm.fun_datediff
(p_Component varchar2 ,
p_Subtranhend date,
p_Minuend date)
RETURN NUMBER
IS
/*************************************************************************/
/* 功 能:返回兩個(gè)日期之間的天、周、月、年等數(shù)量。 */
/* 入?yún)⒄f(shuō)明: p_Component 時(shí)間元件,如年月日季度等等 */
/* p_Subtrahend 減數(shù)時(shí)間 */
/* p_Minuend 被減數(shù)時(shí)間 */
/*************************************************************************/
v_ReturnValue number ; -- 結(jié)果數(shù)值v_Component varchar2(10); --日期組件中間轉(zhuǎn)換形式,截取空格并且轉(zhuǎn)為大寫(xiě)v_YearNum1 number; --減數(shù)年份數(shù)v_YearNum2 number; --被減數(shù)年份數(shù)v_MonthNum1 number; --減數(shù)月份數(shù)v_MonthNum2 number; --被減數(shù)月份數(shù)v_HourNum1 number; --減數(shù)時(shí)數(shù)v_HourNum2 number; --被減數(shù)時(shí)數(shù)v_MinuteNum1 number; --減數(shù)分鐘數(shù)v_MinuteNum2 number; --被減數(shù)分鐘數(shù)v_SecondNum1 number; --減數(shù)秒鐘數(shù)v_SecondNum2 number; --減數(shù)秒鐘數(shù)v_QuarterValue1 number; --減數(shù)季度數(shù)v_QuarterValue2 number; --被減數(shù)季度數(shù)v_WeekNum1 number; --減數(shù)與標(biāo)準(zhǔn)時(shí)間周差v_WeekNum2 number; --被減數(shù)與標(biāo)準(zhǔn)時(shí)間周差BEGIN v_Component := upper(ltrim(rtrim(p_Component))); if v_Component in (‘Y‘,‘YY‘,‘YEAR‘,‘YYYY‘) then --年情況 v_YearNum1 := to_number(to_char(p_Subtranhend,‘YYYY‘)); v_YearNum2 := to_number(to_char(p_Minuend,‘YYYY‘)) ; v_ReturnValue := v_YearNum2 - v_YearNum1; elsif v_Component in (‘M‘, ‘MM‘,‘MONTH‘, ‘MON‘) then --月情況--請(qǐng)注意,這個(gè)部分與oracle內(nèi)置日期函數(shù)MONTH_BETWEEN()不同,忽略了日因素--而后者的兩個(gè)日期如都是所在月的最后一天,才返回整數(shù),否則,返回分?jǐn)?shù)--而且這個(gè)分?jǐn)?shù)是以31天作為一個(gè)月進(jìn)行計(jì)算的結(jié)果 v_YearNum1 := to_number(to_char(p_Subtranhend,‘YYYY‘)); v_YearNum2 := to_number(to_char(p_Minuend,‘YYYY‘)) ; v_MonthNum1 := to_number(to_char(p_Subtranhend,‘MM‘)); v_MonthNum2 := to_number(to_char(p_Minuend,‘MM‘)); v_ReturnValue := (v_YearNum2 - v_YearNum1)*12 + (v_MonthNum2 - v_MonthNum1); elsif v_Component in ( ‘D‘, ‘DD‘, ‘DAY‘) then --日情況--這里與兩個(gè)日期直接相減的oracle日期算術(shù)也不同,只返回整數(shù)天數(shù);--而后者可以返回一天的幾分之幾(以小數(shù)形式表達(dá)) v_ReturnValue := to_date(to_char(p_Minuend,‘yyyy-mm-dd‘),‘YYYY-MM-DD‘) - to_date(to_char(p_Subtranhend,‘yyyy-mm-dd‘),‘YYYY-MM-DD‘); elsif v_Component in (‘H‘, ‘HH‘, ‘HOUR‘) then --時(shí)情況--第一步:求出天數(shù) v_ReturnValue := (to_date(to_char(p_Minuend,‘yyyy-mm-dd‘),‘YYYY-MM-DD‘) - to_date(to_char(p_Subtranhend,‘yyyy-mm-dd‘), ‘YYYY-MM-DD‘));--第二步:求出時(shí)數(shù) v_HourNum1 := to_number(to_char(p_Subtranhend,‘HH24‘)); v_HourNum2 := to_number(to_char(p_Minuend,‘HH24‘)); v_ReturnValue := v_ReturnValue*24 + (v_HourNum2 - v_HourNum1);elsif v_Component in (‘MI‘,‘MINUTE‘) then --分情況 --第一步:求出天數(shù) v_ReturnValue := (to_date(to_char(p_Minuend,‘yyyy-mm-dd‘),‘YYYY-MM-DD‘) - to_date(to_char(p_Subtranhend,‘yyyy-mm-dd‘), ‘YYYY-MM-DD‘)); --第二步:求出時(shí)數(shù) v_HourNum1 := to_number(to_char(p_Subtranhend,‘HH24‘)); v_HourNum2 := to_number(to_char(p_Minuend,‘HH24‘)); v_ReturnValue := v_ReturnValue*24 + (v_HourNum2 - v_HourNum1); --第三步:求出分鐘數(shù) v_MinuteNum1 := to_number(to_char(p_Subtranhend,‘MI‘)); v_MinuteNum2 := to_number(to_char(p_Minuend,‘MI‘)); v_ReturnValue := v_ReturnValue*60 + (v_MinuteNum2 - v_MinuteNum1);elsif v_Component in(‘S‘, ‘SS‘, ‘SECOND‘) then --秒情況 --第一步:求出天數(shù) v_ReturnValue := (to_date(to_char(p_Minuend,‘yyyy-mm-dd‘),‘YYYY-MM-DD‘) - to_date(to_char(p_Subtranhend,‘yyyy-mm-dd‘), ‘YYYY-MM-DD‘)); --第二步:求出時(shí)數(shù) v_HourNum1 := to_number(to_char(p_Subtranhend,‘HH24‘)); v_HourNum2 := to_number(to_char(p_Minuend,‘HH24‘)); v_ReturnValue := v_ReturnValue*24 + (v_HourNum2 - v_HourNum1); --第三步:求出分鐘數(shù) v_MinuteNum1 := to_number(to_char(p_Subtranhend,‘MI‘)); v_MinuteNum2 := to_number(to_char(p_Minuend,‘MI‘)); v_ReturnValue := v_ReturnValue*60 + (v_MinuteNum2 - v_MinuteNum1); --第四步:求出秒鐘數(shù) v_SecondNum1 := to_number(to_char(p_Subtranhend,‘SS‘)); v_SecondNum2 := to_number(to_char(p_Minuend,‘SS‘)); v_ReturnValue := v_ReturnValue*60 + (v_SecondNum2 - v_SecondNum1);elsif v_Component in (‘Q‘,‘QQ‘,‘QUARTER‘) then --季度情況 v_YearNum1 := to_number(to_char(p_Subtranhend,‘YYYY‘)); v_YearNum2 := to_number(to_char(p_Minuend,‘YYYY‘)) ; v_QuarterValue1 := to_number(to_char(p_Subtranhend,‘Q‘)); v_QuarterValue2 := to_number(to_char(p_Minuend,‘Q‘)); v_ReturnValue := (v_YearNum2 - v_YearNum1)*4 + (v_QuarterValue2 - v_QuarterValue1);elsif v_Component in (‘W‘,‘WW‘,‘WK‘,‘WEEK‘) then --周情況--一周的起始日期應(yīng)當(dāng)為星期日--關(guān)于周差的計(jì)算,嘗試采用中間日期的方法--經(jīng)查,‘1-1-2’即公元一年1月2日為周日,我們就可以用兩個(gè)時(shí)間分別與其相減求周差--兩個(gè)結(jié)果再相減,即可得到正確的數(shù)值 v_WeekNum1 := floor( (to_date(to_char(p_Subtranhend,‘YYYY-MM-DD‘),‘YYYY-MM-DD‘) - to_date(‘1-1-2‘,‘YYYY-MM-DD‘))/7); v_WeekNum2 := floor( (to_date(to_char(p_Minuend,‘YYYY-MM-DD‘),‘YYYY-MM-DD‘) - to_date(‘1-1-2‘,‘YYYY-MM-DD‘))/7); v_ReturnValue := v_WeekNum2 - v_WeekNum1;else v_ReturnValue := -88888;end if;RETURN v_ReturnValue;EXCEPTIONWHEN OTHERS THENRETURN -99999;--例外處理END fun_datediff;
總結(jié)
以上是生活随笔為你收集整理的oracle游标理解,oracle游标的使用方法的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 瑞玛瑞玛工业工业公司是做什么的 主要从事
- 下一篇: 关闭oracle服务 linux,Lin