1.游標(biāo)定義:\x0d\x0acursor XXXA is\x0d\x0a SELECT 語句;\x0d\x0aXXXB cursorName%rowtype;\x0d\x0a\x0d\x0aXXXA: 游標(biāo)名\x0d\x0aXXXB: 游標(biāo)行數(shù)據(jù)定義\x0d\x0a\x0d\x0a2. 打開游標(biāo):\x0d\x0a-- 打開之前最好先關(guān)一下,防止上次發(fā)生異常沒有關(guān)掉而引發(fā)不必要的異常\x0d\x0a IF XXXA%ISOPEN THEN\x0d\x0a CLOSE XXXA;\x0d\x0a END IF;\x0d\x0a\x0d\x0aOpen XXXA ;\x0d\x0a Loop\x0d\x0a Fetch XXXA into XXXB;\x0d\x0a exit when XXXA%NOTFOUND;\x0d\x0a... ... 處理邏輯\x0d\x0a end loop;\x0d\x0a close XXXA;
目前成都創(chuàng)新互聯(lián)公司已為成百上千的企業(yè)提供了網(wǎng)站建設(shè)、域名、網(wǎng)絡(luò)空間、成都網(wǎng)站托管、企業(yè)網(wǎng)站設(shè)計、姚安網(wǎng)站維護(hù)等服務(wù),公司將堅持客戶導(dǎo)向、應(yīng)用為本的策略,正道將秉承"和諧、參與、激情"的文化,與客戶和合作伙伴齊心協(xié)力一起成長,共同發(fā)展。
舉例回答:
案例:
--For?循環(huán)游標(biāo)
--(1)定義游標(biāo)
--(2)定義游標(biāo)變量
--(3)使用for循環(huán)來使用這個游標(biāo)
declare
--類型定義
cursor?c_job
is
select?empno,ename,job,sal
from?emp
where?job='MANAGER';
--定義一個游標(biāo)變量v_cinfo?c_emp%ROWTYPE?,該類型為游標(biāo)c_emp中的一行數(shù)據(jù)類型
c_row?c_job%rowtype;
begin
for?c_row?in?c_job?loop
dbms_output.put_line(c_row.empno||'-'||c_row.ename||'-'||c_row.job||'-'||c_row.sal);
end?loop;
end;
Oracle中的游標(biāo)分為顯示游標(biāo)和隱式游標(biāo)。
顯示游標(biāo):
顯示游標(biāo)是用cursor...is命令定義的游標(biāo),它可以對查詢語句(select)返回的多條記錄進(jìn)行處理;顯示游標(biāo)的操作:打開游標(biāo)、操作游標(biāo)、關(guān)閉游標(biāo);
隱式游標(biāo):
隱式游標(biāo)是在執(zhí)行插入(insert)、刪除(delete)、修改(update)和返回單條記錄的查詢(select)語句時由PL/SQL自動定義的。PL/SQL隱式地打開SQL游標(biāo),并在它內(nèi)部處理SQL語句,然后關(guān)閉它。
For 循環(huán)游標(biāo)
(1)定義游標(biāo)
(2)定義游標(biāo)變量
(3)使用for循環(huán)來使用這個游標(biāo)
declare
--類型定義
cursor?c_job
is
select?empno,ename,job,sal
from?emp
where?job='MANAGER';
--定義一個游標(biāo)變量v_cinfo?c_emp%ROWTYPE?,該類型為游標(biāo)c_emp中的一行數(shù)據(jù)類型
c_row?c_job%rowtype;
begin
for?c_row?in?c_job?loop
dbms_output.put_line(c_row.empno||'-'||c_row.ename||'-'||c_row.job||'-'||c_row.sal);
end?loop;
end;
Fetch游標(biāo)
使用的時候必須要明確的打開和關(guān)閉
declare?
--類型定義
cursor?c_job
is
select?empno,ename,job,sal
from?emp
where?job='MANAGER';
--定義一個游標(biāo)變量
c_row?c_job%rowtype;
begin
open?c_job;
loop
--提取一行數(shù)據(jù)到c_row
fetch?c_job?into?c_row;
--判讀是否提取到值,沒取到值就退出
--取到值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;
--創(chuàng)建存儲
程
CREATE
OR
REPLACE
PROCEDURE
xxxxxxxxxxx_p
(
--參數(shù)IN表示輸入?yún)?shù)
OUT表示輸入?yún)?shù)
類型
使用任意Oracle
合
類型
is_ym
IN
CHAR
)
AS
--定義變量
vs_msg
VARCHAR2(4000);
--錯誤信息變量
vs_ym_beg
CHAR(6);
--起始月份
vs_ym_end
CHAR(6);
--終止月份
vs_ym_sn_beg
CHAR(6);
--同期起始月份
vs_ym_sn_end
CHAR(6);
--同期終止月份
--定義游標(biāo)(簡單
說
遍歷
結(jié)
集)
CURSOR
cur_1
IS
SELECT
area_code,CMCODE,SUM(rmb_amt)/10000
rmb_amt_sn,SUM(usd_amt)/10000
usd_amt_sn
FROM
BGD_AREA_CM_M_BASE_T
WHERE
ym
=
vs_ym_sn_beg
AND
ym
=
vs_ym_sn_end
GROUP
BY
area_code,CMCODE;BEGIN
--用輸入?yún)?shù)給變量賦初值
用
Oralce
SUBSTR
TO_CHAR
ADD_MONTHS
TO_DATE
等
用
函數(shù)
vs_ym_beg
:=
SUBSTR(is_ym,1,6);
vs_ym_end
:=
SUBSTR(is_ym,7,6);
vs_ym_sn_beg
:=
TO_CHAR(ADD_MONTHS(TO_DATE(vs_ym_beg,'yyyymm'),
-12),'yyyymm');
vs_ym_sn_end
:=
TO_CHAR(ADD_MONTHS(TO_DATE(vs_ym_end,'yyyymm'),
-12),'yyyymm');
--先刪除表
特定條件
數(shù)據(jù)
DELETE
FROM
xxxxxxxxxxx_T
WHERE
ym
=
is_ym;
--
用內(nèi)置
DBMS_OUTPUT
象
put_line
打印
影響
記錄行數(shù)
其
用
系統(tǒng)變量SQL%rowcount
DBMS_OUTPUT.put_line('del
月記錄='||SQL%rowcount||'條');
INSERT
INTO
xxxxxxxxxxx_T(area_code,ym,CMCODE,rmb_amt,usd_amt)
SELECT
area_code,is_ym,CMCODE,SUM(rmb_amt)/10000,SUM(usd_amt)/10000
FROM
BGD_AREA_CM_M_BASE_T
WHERE
ym
=
vs_ym_beg
AND
ym
=
vs_ym_end
GROUP
BY
area_code,CMCODE;
DBMS_OUTPUT.put_line('ins
月記錄='||SQL%rowcount||'條');
--遍歷游標(biāo)處理
更新
表
遍歷游標(biāo)
幾種
用for語句
其
比較直觀
種
FOR
rec
IN
cur_1
LOOP
UPDATE
xxxxxxxxxxx_T
SET
rmb_amt_sn
=
rec.rmb_amt_sn,usd_amt_sn
=
rec.usd_amt_sn
WHERE
area_code
=
rec.area_code
AND
CMCODE
=
rec.CMCODE
AND
ym
=
is_ym;
END
LOOP;
COMMIT;
--錯誤處理部
OTHERS表示除
聲明外
任意錯誤
SQLERRM
系統(tǒng)內(nèi)置變量保存
前錯誤
詳細(xì)信息
EXCEPTION
WHEN
OTHERS
THEN
vs_msg
:=
'ERROR
IN
xxxxxxxxxxx_p('||is_ym||'):'||SUBSTR(SQLERRM,1,500);
ROLLBACK;
--
前錯誤記錄進(jìn)
志表
INSERT
INTO
LOG_INFO(proc_name,error_info,op_date)
VALUES('xxxxxxxxxxx_p',vs_msg,SYSDATE);
COMMIT;
RETURN;
END;