1. 程式人生 > >Oracle建立和呼叫儲存過程,函式,檢視

Oracle建立和呼叫儲存過程,函式,檢視

【1】Oracle建立和呼叫儲存過程
1:寫一個簡單的例子刪除三級級聯
1)create or replace procedure ww_procedure_servicecheck
(V_ID IN NUMBER)-- 定義輸入變數
IS
begin
   DELETE FROM ww_mt_index_dt WHERE index_mainid IN (SELECT id FROM ww_mt_project_dt WHERE project_mainid=V_ID);--第三級
   DELETE FROM ww_mt_serviceRaters where Ratersid in (select id from ww_mt_servicecheck where id=V_ID);--第三級
   DELETE FROM ww_mt_project_dt WHERE project_mainid = V_ID; --第二級
   DELETE FROM ww_mt_servicecheck WHERE id = V_ID;第一級
   commit;--提交
end;
2)plsql執行儲存過程

BEGIN
ww_procedure_servicecheck(id);
END;
3)sql語句呼叫儲存過程
CALL ww_procedure_servicecheck(id);
2:有返回值的儲存過程,就寫一個簡單的返回empno=7935的sal值
1)create or replace procedure emp_out_sal
 (
 v_empno in varchar2,
 v_sal out number
 ) is
 vsal number(7,2);
 begin
 select sal into vsal from emp where empno=v_empno;
 v_sal:=vsal;
 end;
2)plsql呼叫有返回值的過程

SQL> var vsal number
SQL> exec emp_out_sal('7935',:vsal);
3)sql語句呼叫儲存過程
SQL> var vsal number
SQL> call emp_out_sal('7935',:vsal);
【2】函式建立
1例項
create or replace function getRoutineExaminationNew(suppliermdm in varchar2,khyd in varchar2)
 --引數有IN、OUT、IN OUT三種類型;IN代表需要輸入的引數,OUT代表要返回的引數,IN OUT代表即是輸入引數也是返回引數。

return number is--返回型別
  rckhdf number(15,2):=0;
begin
     select round(avg(decode(select_zlsp,0,100,decode(select_zlsp,1,80,decode(select_zlsp,2,60,40))))*0.3+
                  avg(decode(select_jhnl,0,100,decode(select_jhnl,1,80,decode(select_jhnl,2,60,40))))*0.2+
                  avg(decode(select_shfwcxjy,0,100,decode(select_shfwcxjy,1,80,decode(select_shfwcxjy,2,60,40))))*0.2+
                  avg(decode(select_hsepjys,0,100,1,80,2,40,0))*0.1+
                  avg(decode(select_hsepjxz,0,100,1,80,2,40,0))*0.1+
                  avg(decode(select_hsepjaz,0,100,1,80,2,40,0))*0.1
                  ,2 ) into rckhdf
        from formtable_main_126 m  where 1=1
        and substr(m.data_ysrq,1,4)= khyd  and m.txt_gysid= suppliermdm; --執行的SQL
    return rckhdf;
end getRoutineExaminationNew;
2例項
create or replace function avg_pric(v_total in number(10.2),
v_num In OUT number(10,2)) return  number(10,2)
as
v_pric number(10,2);
begin
  v_pric:=v_total/v_num;
  return v_pric;
  end;
1)sql呼叫此函式:
SQL> var vsla number
SQL> call getRoutineExaminationNew('7935',vsla) into :vsal;
2)plsql呼叫此函式
BEGIN  
dbms_output.put_line(getRoutineExaminationNew(2,4));  
END;
【3】檢視建立
create or replace view view_ww_mt_gysrckh as
select distinct substr(data_ysrq,1,4) as year, y.id as id,txt_gysid,txt_gysmc,getRoutineExaminationNew(txt_gysid,substr(data_ysrq,1,4)) as rckhdf
 from  formtable_main_126 y left join workflow_requestbase r on r.requestid=y.requestid
where r.currentnodetype='3' order by year desc,rckhdf desc;
1)檢視查詢
select * from view_ww_mt_gysrckh
【4】檢視函式
select * from  User_Procedures;--使用者擁有的觸發器、儲存過程、函式查詢表
select * from User_Source;--查詢使用者擁有觸發器、儲存過程、函式的原始碼。
select * from dba_Procedures;--系統表
select * from dba_Source;--系統表