oracle學習之路(二 儲存過程)

2021-06-26 00:26:40 字數 3747 閱讀 3420

1  create or replace procedure 儲存過程名

2  is

3  begin

4  null;

5  end;

行1:create or replace procedure 是乙個sql語句通知oracle資料庫去建立乙個叫做skeleton儲存過程, 如果存在就覆蓋它;

行2:行3:

行4:null pl/sql語句表明什麼事都不做,這句不能刪去,因為pl/sql體中至少需要有一句;

行5:create or replace procedure 儲存過程名(param1 in type,

param2 out type) 

as 變數1 型別(值範圍); --vs_msg   varchar2(4000); 

變數2 型別(值範圍);

begin

select count(*) into 變數1 from 表a where列名=param1;

if (判斷條件) then

select 列名 into 變數2 from 表a where列名=param1;

dbms_output。

put_line(『列印資訊』);

elsif (判斷條件) then

dbms_output。

put_line(『列印資訊』);

else

raise 異常名(no_data_found);

end if;

exception

when others then

rollback;

end;

注意事項:

1, 儲存過程引數不帶取值範圍,in表示傳入,out表示輸出

型別可以使用任意oracle中的合法型別。

2,  變數帶取值範圍,後面接分號

3,  在判斷語句前最好先用count(*)函式判斷是否存在該條操作記錄

4,  用select 。。。into。。。給變數賦值

5,  在**中拋異常用 raise+異常名

create or replace procedure儲存過程名

(--定義引數

is_ym  in char(6) ,

the_count out number,

) 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);     --同期終止月份

--定義游標(

簡單的說就是乙個可以遍歷的結果集)

cursor cur_1 is 

select 。。。 

from 。。。 

where 。。。

group by 。。。; 

begin 

--用輸入引數給變數賦初值,用到了oralce

的substr to_char add_months 

to_date 等很常用的函式。 

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'); 

--先刪除表中特定條件的資料。 

delete from 表名 where ym = is_ym; 

--然後用內建的dbms_output

物件的put_line

方法列印出影響的記錄行數,其中用到乙個系統變數

sql%rowcount

dbms_output.put_line('del上月記錄

='||sql%rowcount||'

條');

insert into表名(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||'

條'); 

--遍歷游標處理後更新到表。遍歷游標有幾種方法,用for

語句是其中比較直觀的一種。

for rec in cur_1 loop 

update 表名

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

是系統內建變數儲存了當前錯誤的詳細資訊。

exception 

when others then 

vs_msg := 'error in *********xx_p('||is_ym||'):'||substr(sqlerrm,1,500);

rollback; 

--把當前錯誤記錄進日誌表。 

insert into log_info(proc_name,error_info,op_date) 

values('*********xx_p',vs_msg,sysdate); 

commit; 

return; 

end;

例項:刪除空表

create or replace procedure empty_table_drop as

cursor cur1 is select table_name from user_tables;

var_table_count integer;

begin

for rs in cur1 loop

begin

execute immediate 'select count(*) from ' || rs.table_name into var_table_count;

if(var_table_count=0) then

execute immediate 'drop table ' || rs.table_name;

dbms_output.put_line('刪除:' || rs.table_name);

else

dbms_output.put_line(rs.table_name || ':' || var_table_count);

end if;

end;

end loop;

end empty_table_drop;

oracle儲存過程學習(二)

建立乙個最簡單的儲存過程 create or replace procedure test xg p1 is begin dbms output.put line hello world this is the first procedure end 建立乙個帶輸入輸出引數的儲存過程 把輸入的資料傳...

Oracle儲存過程學習

儲存過程是一組為了完成特定功能的 sql 語句塊,經編譯後儲存在資料庫中,使用者通過指定儲存過程的名字並給出引數 如果該儲存過程帶有引數 來執行它。1 儲存過程和函式以命名的資料庫物件形式儲存於資料庫當中。儲存在資料庫中的優點是很明顯的,因為 不儲存在本地,使用者可以在任何客戶機上登入到資料庫,並呼...

Oracle儲存過程學習

儲存過程建立語法 create or replace procedure 儲存過程名 param1 in type,param2 out type as 變數1 型別 值範圍 變數2 型別 值範圍 begin select count into 變數1 from 表a where列名 param1 ...