存儲過程循環輸出
① 寫一個存儲過程,用游標循環每一個學生,每一次循環統計每一學生各個科目的成績,列印到控制到輸出如下
--學生表
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;
② 使用存儲過程中的游標以及循環把表內的若干欄位拼接起來輸出
你寫的也太簡單了。
游標是需要基本Sql的。拼接的演算法是啥你都沒說。
要是沒啥Sql選擇要求。你還不如用
Selec @SQL = ''
While(寫上你的循環條件)
Begin
Selec @SQL = @SQL + XXXX
END
③ Oracle存儲過程游標for循環怎麼寫
一、不帶參數的游標for循環
1
首先編寫存儲過程的整體結構,如下:
create or replace procere test_proc is
v_date date; --變數定義
begin
select sysdate into v_date from al;
end test_proc;
2
定義游標:
create or replace procere test_proc is
v_date date; --定義變數
cursor cur is select * from ldcode; --定義游標
begin
select sysdate into v_date from al;
end test_proc;
3
編寫for循環:
create or replace procere test_proc is
v_date date; --定義變數
cursor cur is select * from ldcode where rownum<10; --定義游標
begin
select sysdate into v_date from al;
--游標for循環開始
for temp in cur loop --temp為臨時變數名,自己任意起
Dbms_Output.put_line(temp.Code); --輸出某個欄位,使用"變數名.列名"即可。
end loop;
--游標for循環結束
end test_proc;
4
測試運行,點擊【DBMS Output】標簽頁查看結果如下圖:
END
二、帶參數的游標for循環
1
定義帶參數的游標:
cursor cur(v_codetype ldcode.Codetype%TYPE) is
select * from ldcode where codetype = v_codetype; --定義游標
定義游標格式:
cursor 游標名稱(變數定義) is 查詢語句;
注意:
where條件中的變數名v_codetype要與游標定義cur(v_codetype ldcode.Codetype%TYPE)中的一致。
2
編寫for循環部分:
--游標for循環開始
for temp in cur('llmedfeetype') loop
--temp為臨時變數名,自己任意起
--cur('llmedfeetype')為"游標名稱(傳入的變數)"
Dbms_Output.put_line(temp.Code); --輸出某個欄位,使用"變數名.列名"即可。
end loop;
--游標for循環結束
3
測試運行,點擊【DBMS Output
④ oracle存儲過程中循環for in是如何使用的
1、首先編寫存儲過程的整體結構,如下圖所示定義變數。
⑤ oracle存儲過程如何輸出信息
可用DBMS_OUTPUT.PUT_LINE()對存儲過程的進行輸出。
編寫存儲過程:
create or replace procere test_pro(in_num number)
as
M number;
begin
M := in_num;
if 0 < M then
dbms_output.put_line('輸出SQL語句1');
elsif M < 3 then
dbms_output.put_line('輸出SQL語句2');
else
dbms_output.put_line('nothing');
end if;
end;
(5)存儲過程循環輸出擴展閱讀;
存儲在資料庫的數據字典中,存儲在當前的應用中安全性由資料庫提供安全保證,必須通過授權才能使用存儲子程序,安全性靠應用程序來保證,如果能執行應用程序,就能執行該子程序。模式描述IN參數用來從調用環境中向存儲過程傳遞值,不能給IN參數賦值,給此參數傳遞的值可以是常量、有值的變數、表達式等。
⑥ oracle存儲過程怎麼寫循環
寫循環的操作方法和步驟如下:
1、第一步,編寫存儲過程的整體結構,然後定義變數,見下圖。
⑦ 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
⑧ 如何php調用oracle存儲過程返回的是一個結果集,該怎麼從php頁面中吧數據循環輸出呀
如果返回值是資源的話,可以用函數mysql_fetch_array()mysql_fetch_assoc()mysql_fetch_row()中的任意一個!