當前位置:首頁 » 服務存儲 » 存儲過程游標循環
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

存儲過程游標循環

發布時間: 2022-01-20 06:46:08

Ⅰ 關於sql存儲過程使用游標循環的問題

循環嵌套的格式打給你寫了一下 以參考一下換上你的數據就行:

CREATE OR REPLACE PROCEDURE P_name
AS
定義變數如:

V$PO_NO VARCHAR2(20);

V$ITM_CD VARCHAR2(20);

V$ITM_CD1 VARCHAR2( 40);

CURSOR CUR_A

IS

SELECT *
FROM a;

CURSOR CUR_B

IS

SELECT *
FROM B;

BEGIN

OPEN CUR_A;

LOOP

FETCH CUR_A INTO 變數V$PO_NO;

EXIT WHEN CUR_A%NOTFOUND;

循環處理;

OPEN CUR_B;

LOOP

FETCH CUR_B INTO 變數V$ITM_CD;

EXIT WHEN CUR_B%NOTFOUND;

次循環處理;

END LOOP ;

CLOSE CUR_B;

END LOOP ;

CLOSE CUR_A;

COMMIT;

異常處理:

EXCEPTION

WHEN NO_DATA_FOUND THEN

DBMS_OUTPUT.PUT_LINE( '無值');

ROLLBACK;

WHEN OTHERS THEN

P$RET:= SQLCODE;

ROLLBACK;

END;

Ⅱ sql語句編寫存儲過程,使用游標循環列印學生表中的數據,求大神

寫一個例子給樓主看下就知道了:

在sqlserver2000中新建一個存儲過程:
CREATEPROCEDUREPK_Test
AS
//聲明1個變數
declare@namenvarchar(20)

//聲明一個游標mycursor,select語句中參數的個數必須要和從游標取出的變數名相同


//打開游標
openmycursor

//從游標里取出數據賦值到我們剛才聲明的2個變數中

fetchnextfrommycursorinto@name

//判斷游標的狀態
//0fetch語句成功
//-1fetch語句失敗或此行不在結果集中
//-2被提取的行不存在
while(@@fetch_status=0)
begin

//顯示出我們每次用游標取出的值
print'游標成功取出一條數據'
print@name

//用游標去取下一條記錄
fetchnextfrommycursorinto@name

end

//關閉游標
closemycursor

//撤銷游標
deallocatemycursor

GO

Ⅲ 存儲過程中For循環怎麼寫啊

方法和詳細的操作步驟如下:

1、第一步,編寫存儲過程的整體結構,定義變數,見下圖,轉到下面的步驟。

Ⅳ mysql存儲過程 游標雙重循環

在老版本的MySQL 3.22中,MySQL的單表限大小為4GB,當時的MySQL的存儲引擎還是ISAM存儲引擎。但是,當出現MyISAM存儲引擎之後,也就是從MySQL 3.23開始,MySQL單表最大限制就已經擴大到了64PB了(官方文檔顯示)。也就是說,從目前的技術環境來看,MySQL資料庫的MyISAM存儲 引擎單表大小限制已經不是有MySQL資料庫本身來決定,而是由所在主機的OS上面的文件系統來決定了。

而MySQL另外一個最流行的存儲引擎之一Innodb存儲數據的策略是分為兩種的,一種是共享表空間存儲方式,還有一種是獨享表空間存儲方式。
當使用共享表空間存儲方式的時候,Innodb的所有數據保存在一個單獨的表空間裡面,而這個表空間可以由很多個文件組成,一個表可以跨多個文件存在,所 以其大小限制不再是文件大小的限制,而是其自身的限制。從Innodb的官方文檔中可以看到,其表空間的最大限制為64TB,也就是說,Innodb的單 表限制基本上也在64TB左右了,當然這個大小是包括這個表的所有索引等其他相關數據。
而當使用獨享表空間來存放Innodb的表的時候,每個表的數據以一個單獨的文件來存放,這個時候的單表限制,又變成文件系統的大小限制了。

Ⅳ ORACLE存儲過程怎麼實現跳出遊標當前循環,繼續獲取下一行

Oracle 11g開始,已經支持continue的。

Ⅵ SQL存儲過程中 循環判斷變數值+游標問題

寫在打開游標的後頭:
if state = flase then
raise_application_error(-20010,'state值為false,中斷執行');
end if;
後面再接正常的處理過程,這樣就OK

Ⅶ Sql存儲過程游標循環的用法及sql如何使用cu

--1.聲明名稱為
cursor_fruit的游標USE sample_db;GODECLARE cursor_fruit CURSOR FORSELECT f_name,f_price FROM fruits;
--2.打開游標
OPEN cursor_fruit;
--3.讀取游標中的數據
--【例】使用名稱為cursor_fruit的游標,檢索fruits表中的記錄,輸入如下:USE sample_db;
GOFETCH NEXT FROM cursor_fruit
WHILE @@FETCH_STATUS=0
BEGIN
FETCH NEXT FROM cursor_fruit
END;
--4.關閉關閉名稱為cursor_fruit的游標
CLOSE cursor_fruit
--5.釋放游標
DEALLOCATE cursor_fruit;

Ⅷ SQL存儲過程中怎麼寫循環

方法和詳細的操作步驟如下:

1、第一步,編寫存儲過程的整體結構,定義變數,見下圖,轉到下面的步驟。

Ⅸ 怎麼在存儲過程中進行循環

用游標,和WHILE可以遍歷您的查詢中的每一條記錄並將要求的欄位傳給變數進行相應的處理
==================
DECLARE @A1 VARCHAR(10),@A2 VARCHAR(10),@A3 INT
DECLARE CURSOR YOUCURNAME FOR SELECT A1,A2,A3 FROM YOUTABLENAME
OPEN YOUCURNAME
fetch next from youcurname into @a1,@a2,@a3
while @@fetch_status<>-1
begin
update ... set ...=@a1,...=a2 ...-a3 where ...
......您要執行的操作寫在這里
fetch next from youcurname into @a1,@a2,@a3
end
close youcurname
deallocate youcurname

Ⅹ 寫一個存儲過程,用游標循環每一個學生,每一次循環統計每一學生各個科目的成績,列印到控制到輸出如下

--學生表
create table t_xsb (xsbh number(10),xsxm varchar2(300));
comment on table t_xsb is '學生表';
comment on column t_xsb.xsbh is '學生編號';
comment on column t_xsb.xsxm is '學生姓名';
alter table t_xsb add constraints pk_xsb primary key (xsbh) using index;
--科目表
create table t_kmb (kmbh number(10),kmmc varchar2(300));
comment on table t_kmb is '科目表';
comment on column t_kmb.kmbh is '科目編號';
comment on column t_kmb.kmmc is '科目名稱';
alter table t_kmb add constraints pk_kmb primary key (kmbh) using index;
--成績表
create table t_cjb
(cjbh number(10),
cjfs number(10,1),
xsbh number(10),
kmbh number(10));
comment on table t_cjb is '成績表';
comment on column t_cjb.cjbh is '成績編號';
comment on column t_cjb.cjfs is '成績分數';
comment on column t_cjb.xsbh is '學生編號';
comment on column t_cjb.kmbh is '科目編號';
alter table t_cjb add constraints pk_cjb primary key (cjbh) using index;
alter table t_cjb add constraints fk_cjb_xsbh foreign key (xsbh)
references t_xsb(xsbh);
alter table t_cjb add constraints fk_cjb_kmbh foreign key (kmbh)
references t_kmb(kmbh);
--創建序列
create sequence sq_ls
increment by 1
start with 1000000000
maxvalue 9999999999
nocycle
nocache;
--創建學生表的before insert觸發器,實現對學生表主鍵的自動增長列
create or replace trigger r_xsb
before insert on t_xsb
for each row
declare
v_xsbh number(10) := null;
begin
v_xsbh := sq_ls.nextval;
:new.xsbh := v_xsbh;
end;
--寫一個存儲過程,用游標循環每一個學生,
--每一次循環統計每一學生各個科目的成績,列印到控制
create or replace procere p_xscjtj is
v_xsbh number(10) := null;
v_xsxm varchar2(300) := null;
v_sx_nm number(10) := null;
v_yw_nm number(10) := null;
v_yy_nm number(10) := null;
v_zf_nm number(10) := null;
v_sx_ch varchar2(300) := null;
v_yw_ch varchar2(300) := null;
v_yy_ch varchar2(300) := null;
v_zf_ch varchar2(300) := null;
cursor c_xs is
select t.xsbh, t.xsxm from t_xsb t;
begin
dbms_output.enable(buffer_size => null);
open c_xs;
dbms_output.put_line(rpad(STR1 => '姓名',
PAD => ' ',
LEN => lengthb('姓名') + 5) ||
rpad(STR1 => '數學',
PAD => ' ',
LEN => lengthb('數學') + 5) ||
rpad(STR1 => '語文',
PAD => ' ',
LEN => lengthb('語文') + 5) ||
rpad(STR1 => '英語',
PAD => ' ',
LEN => lengthb('英語') + 5) ||
rpad(STR1 => '總分',
PAD => ' ',
LEN => lengthb('總分') + 5));
loop
fetch c_xs
into v_xsbh, v_xsxm;
exit when c_xs%notfound;
begin
select nvl(sum(case
when t2.kmmc = '數學' then
t1.cjfs
else
0
end),
0) sx,
nvl(sum(case
when t2.kmmc = '語文' then
t1.cjfs
else
0
end),
0) yw,
nvl(sum(case
when t2.kmmc = '英語' then
t1.cjfs
else
0
end),
0) yy,
nvl(sum(t1.cjfs), 0) zf
into v_sx_nm, v_yw_nm, v_yy_nm, v_zf_nm
from t_cjb t1, t_kmb t2
where t1.kmbh = t2.kmbh
and t1.xsbh = v_xsbh
group by t1.xsbh;
exception
when others then
v_sx_nm := 0;
v_yw_nm := 0;
v_yy_nm := 0;
v_zf_nm := 0;
end;
v_xsxm := rpad(STR1 => v_xsxm, PAD => ' ', LEN => lengthb('姓名') + 5);
v_sx_ch := rpad(STR1 => v_sx_nm, PAD => ' ', LEN => lengthb('數學') + 5);
v_yw_ch := rpad(STR1 => v_yw_nm, PAD => ' ', LEN => lengthb('語文') + 5);
v_yy_ch := rpad(STR1 => v_yy_nm, PAD => ' ', LEN => lengthb('英語') + 5);
v_zf_ch := rpad(STR1 => v_zf_nm, PAD => ' ', LEN => lengthb('總分') + 5);
dbms_output.put_line(v_xsxm || v_sx_ch || v_yw_ch || v_yy_ch ||
v_zf_ch);
end loop;
close c_xs;
exception
when others then
dbms_output.put_line(sqlerrm);
end;