oracle儲存過程

2021-08-25 17:46:21 字數 2797 閱讀 7724

oracle簡單儲存過程

create or replace procedure content_editor

--如果儲存過程沒有引數這個地方就不要括號

(--引數in表示輸入引數,out表示輸入引數

is_ym in char) as

--定義變數

vs_msg varchar2(4000);

--定義游標

cursor cur_1 is

select * from new_lm;

begin

for rec in cur_1 loop

vs_msg := replace(rec.oldname, 'abc', '成長');

update new_lm lm set lm.oldname = vs_msg where lm.pid = rec.pid;

end loop;

commit;

exception

when others then

rollback;

return;

end;

此處是乙個完整的儲存過程:(引用別人所寫)

--建立儲存過程

create or replace procedure *********xx_p

(--引數in表示輸入引數,out表示輸入引數,型別可以使用任意oracle中的合法型別。

is_ym  in char)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 area_code,cmcode,sum(rmb_amt)/10000 rmb_amt_sn,sum(usd_amt)/10000 usd_amt_sn

from bgd_area_cm_m_base_t

where ym >= vs_ym_sn_beg

and ym <= vs_ym_sn_end

group by area_code,cmcode;

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 *********xx_t where ym = is_ym;

--然後用內建的dbms_output物件的put_line方法列印出影響的記錄行數,其中用到乙個系統變數sql%rowcount

dbms_output.put_line('del上月記錄='||sql%rowcount||'條');

insert into *********xx_t(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 *********xx_t

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;

Oracle儲存過程呼叫儲存過程

oracle儲存過程呼叫有返回結果集的儲存過程一般用光標的方式,宣告乙個游標,把結果集放到游標裡面,然後迴圈游標 declare newcs sys refcursor cs1 number cs2 number cstype table rowtype table列的個數和newcs返回的個數一樣...

ORACLE儲存過程

自定義函式開始 create or replace function fn wftemplateidget templatecategoryid number,organid number,templatemode number return number istemplateid number i...

Oracle 儲存過程

create or replace procedure p 有就替換,沒有就建立 iscursor c is select from emp for update begin for v emp in c loop if v emp.deptno 10 then update emp2 set sa...