日常只關心工做中用到的和本身感興趣的,由於沒有用到這東西因此也沒有在乎;最近問的人多了就學學。函數
這個東西網上不少,找了個百度文庫開始本身寫(http://wenku.baidu.com/link?url=4kZCAq87BmnGJcjYDZnn751D2qLjzrHj0kKy9VhLSjraFEu0OB9_RJQYB2Z-gm8jEjRcPcFduH-6Rs3Z2iC9C9uvE4n_WcGqJRj4qWyWcny)。工具
參照例子本身寫了幾個存儲過程:oop
1.無參procedure,有個局部變量,給局部變量複製,輸出;學習
create or replace procedure demo_one
as
v_total number(10);
begin
select count(*) into v_total from so4.ins_user_573;
dbms_output.put_line('ins_user表中記錄數:'||v_total);
end;測試
--運行上述SQL編譯url
begin
so4.demo_one;
end;three
--執行事務
2.使用遊標進行loop循環遍歷輸出;同時引用其餘的procedure;rem
create or replace procedure demo_two
as
cursor user_loop is select user_id,bill_id from so4.ins_user_573;
begin
for user_record in user_loop loop
dbms_output.put_line(user_record.user_id||'+'||user_record.bill_id);
end loop;
so4.demo_one;
end;it
--運行SQL編譯
begin
so4.demo_two;
end;
--執行
3.設置兩個入參變量default一個默認值;兩個局部變量,但沒有用到;遊標遍歷輸出;異常處理;事務提交更新;
create or replace procedure demo_three(
p_id in number default 2,
p_type in number default 1
)as
v_bill_id varchar2(20);
v_sub_bill_id varchar2(30);
--v_ins_user so4.ins_user_573%rowtype;
cursor user_cursor is select bill_id,sub_bill_id into v_bill_id,v_sub_bill_id from so4.ins_user_573
where prod_catalog_id = p_id and cust_type = p_type;
begin
for user_record in user_cursor loop
dbms_output.put_line('號碼爲:'||user_record.bill_id||',IMSI爲:'||user_record.sub_bill_id);
end loop;
update so4.ins_user_573 set remarks = null /*where cust_type = p_type and prod_catalog_id = p_id*/;
commit;
exception
when others then
dbms_output.put_line('發生錯誤沒法修改'||SQLERRM);
rollback;
end;
--編譯
begin
demo_three(1,1);
end;
--執行
4.輸出參數的使用;
create or replace procedure demo_four(
p_total out number
) as
begin
select count(*) into p_total from so4.ins_user_573;
dbms_output.put_line('內部展現記錄->記錄數據爲:'||p_total);
end;
--編譯
declare total_1 number;
begin
so4.demo_four(total_1);
dbms_output.put_line('外部展現記錄->記錄數據爲:'||total_1);
end;
--執行
5.in out類型兼容出入參數的使用;
create or replace procedure demo_five(
p_remarks in out varchar2
) as
begin
p_remarks := '前綴-'||p_remarks;
end;
--編譯
declare remarks varchar2(50);
begin
remarks := '求加前綴';
so4.demo_five(remarks);
dbms_output.put_line(remarks);
end;
--執行
6.函數返回;打印;
alter function demo_six compile;
create or replace function demo_six(
p_id in number,
p_type in number
) return varchar2
as
v_bill_id varchar2(20);
begin
select bill_id into v_bill_id from so4.ins_user_573 where prod_catalog_id = p_id and cust_type = p_type;
return(v_bill_id);
exception
when no_data_found then
dbms_output.put_line('沒有記錄');
return(null);
when too_many_rows then
dbms_output.put_line('有重複記錄');
return(null);
when others then
dbms_output.put_line('其餘錯誤');
return(null);
end;
declare ret varchar2(20);
begin
ret := so4.demo_six(1,1);
if ret is null then ret := 0;dbms_output.put_line('有'||ret||'條記錄');
else dbms_output.put_line('有記錄,號碼是:'||ret);
end if;
end;
===========================================
學習了基本語法使用,難的複雜的之後實際用到了再說。
使用PL\SQL Developer工具執行:
1.command window 窗口使用 exec procedure_name或execute procedure_name執行後,只會顯示PL/SQL procedure successfully completed,不會顯示執行結果;
2.SQL window下使用 begin 模式.procedure_name; end;可執行,同時output標籤下顯示執行結果;
3.能夠直接右擊procedure使用test(測試)進入Test Window進行測試本身寫的procedure;
4.參數的定義只要定義類型就好了,不能定義大小,定義大小則會報錯;
5.異常處理部分有不少異常類型和處理方式;
6.函數和存儲過程最大的差異是表示不同function和procedure,前者有必須有返回值,後者無返回值,語法相似;