儲存過程輸出查詢語句過程的固定形式
create or replace procedure 過程名稱
(引數名稱1 引數模式+資料型別,
引數名稱2 out sys_refcursor)
as
begin
open引數名稱2 for select語句;
end;
/
舉例1:
create or replace procedure test1
(curout out sys_refcursor)
as
begin
open curout for select sysdate from dual;
end;
/
--此過程不需要輸入變數引數(因為未定義引數變數),直接進行呼叫,輸入sys_refcursor引數過程。
舉例2:
create or replace procedure test2
(p_a varchar2,
p_binteger,
p_cnumber,
cur_out1 out sys_refcursor,
cur_out2 out sys_refcursor)
as
begin
ifp_b=1 then
open cur_out1 for select rownum*3 as rn from dual connect byrownum<=10;
open cur_out2 for select '無返回值' as rn from dual;
else
open cur_out1 for select '無返回值' as rs from dual;
open cur_out2 for select rownum*3+2 as rs from dual connect byrownum<=10;
endif;
end;
舉例3:
原表:select * from student;
sno sname state sphone
1 Anna 西安 123456
2 Caroline 寶雞 654321
3 Elly 咸陽 987654
4 Lily 渭南 456789
create or replace procedure test3
(p_a varchar2,
p_bnumber,
p_cnumber,
cur_out out sys_refcursor)
as
p_dvarchar2(1000); /*指定執行過程需傳遞的引數*/
p_enumber;
begin
ifp_c=1 then
p_d:='update student set state=''雲南'' wheresname='''||p_a||''' and sphone='''||p_b||'''';
execute immediate (p_d);
if (sql%notfound) then
open cur_out for select '更新失敗' as rs from dual;
else
p_e:=sql%rowcount;
open cur_out for select ('更新成功,共'||p_e||'行') as rs from dual;
end if;
else
p_d:='update student set state='''||p_a||'''where sphone='''||p_b||'''';
execute immediate(p_d);
if (sql%rowcount=0) then
open cur_out for select '更新失敗' as rs from dual;
else
open cur_out for select '更新成功' as rs from dual;
end if;
endif;
commit;
end;
測試1:p_a=Anna,p_b=123456,p_c=1 1 Anna 雲南 123456
測試2:p_a=山西,p_b=456789,p_c=2 4 Lily 山西 456789
更新後的表:
select * from student;
sno sname state sphone
1 Anna 雲南 123456
2 Caroline 寶雞 654321
3 Elly 咸陽 987654
4 Lily 山西 456789