oracle 存儲過程,包,方法,觸發器,過程

存儲過程:
--修改存儲過程

create or replace procedure emp_proc(
       findname varchar2,
       salary1 number
)is
begin
update employees set salary=salary1 where last_name=findname;
end;

//調用存儲過程,可以傳參數(id,name)
exec emp_proc();
call emp_proc();
--輸入員工名字,如果獎金不是0.15就加0.1,其他加0.3 if/else;
create or replace procedure emp_upCommis(findname varchar2)is
v_comm employees.commission_pct%type;
begin
  select distinct nvl(commission_pct,0) intov_comm from employees where last_name=findname;
  if v_comm<>0.15 then
    update employees set commission_pct=commission_pct+0.1 wherelast_name = findname;
  else
    update employees set commission_pct=commission_pct+0.3 wherelast_name = findname;
endif;    
end;




--輸入輸出參數

create or replace procedure dept_pro(deptno number,dname outvarchar2)
is
begin
 select department_name into dname fromdepartments where department_id = deptno;
end;
--寫個塊檢測
declare
name2 varchar2(50);
begin
   dept_pro(10,name2);
  dbms_output.put_line('deptname:'||name2);
  
end;



異常例外,處理
> declare
  2   v_namevarchar2(10);
  3  v_sal number(8,2);
  4  begin
  5  select last_name,salary intov_name,v_sal from employees whereemployee_id=&empno;
  6 dbms_output.put_line('ename:'|| v_name||'sal'||v_sal);
  7  exception
  8  when no_data_foundthen
  9  dbms_output.put_line('youerror,zhoabudao .sdfjasjf ^^');
 10  end;
 11  /



-------------------函數//select 函數即可:

create function emp_fun(ename varchar2)
return number
is
yearSal number(8,2);
begin
   selectsalary*12+nvl(commission_pct,0)*12 into yearSal from employeeswhere last_name=ename;
   return yearSal;
end;


包:
create or replace package emp_package is

procedure update_sal(ename varchar2,newsal number );
function a_i(ename varchar2) return number;

end;
----包體


create or replace package body emp_package is


procedure update_sal(ename varchar2,newsal number )
is
begin
         update employees set salary=newsal where last_name=ename;
end;

function a_i(ename varchar2)
 return number
is
yearsal number(8,2);
begin

       select salary*12+nvl(commission_pct,0)*12 into yearsal fromemployees where last_name=ename;
       return yearsal;
end;


end;

三種循環:常見語法 is begin end;
--循環 loop / end loop 循環
create or replace procedure deptno_pro(dname varchar2)
is
v_num number:=2;
begin
      loop
     exit when v_num = 6; 
     insert intodepartments(department_id,department_name)values(v_num,dname||v_num);
     v_num:=v_num+1;
end loop;
end;

--循環 while條件 loop / end loop

create or replace procedure deptno_pro(dname varchar2)
is
v_num number:=2;
begin
      while v_num<=6
      loop 
      insert intodepartments(department_id,department_name)values(v_num,dname||v_num);
      v_num:=v_num+1;
end loop;
end;
--循環 for 變量 in reverse 1..10 loop/end loop 1到10循環

for i in reverse 1..10 loop
(department_id,department_name) values(i,dname||i);
      endloop;    goto


--輸入員工姓名,員工工工資
create or replace procedure emp_upCommisTwo(findname varchar2)is
v_job employees.job_id%type;
 begin
  select nvl(job_id,'null') into v_job fromemployees where last_name=findname;
  if v_job='FI_MGR' then
    update employees set salary=salary+1000 where last_name =findname;
  elsif v_job='IT_PROG' then
    update employees set salary=salary+500 wherelast_name=findname;
  else
    update employees set salary=salary+100 where last_name=findname;
end if;
end;

--輸入一個部門編號,顯示這個部門下面的員工信息
create or replace package dept_package is
type test_cursor is ref cursor;
end dept_package;

--遊標輸出一個對象,爲一個數據堆
create or replace procedure deptt_pro(deptno number,dept_cursor outdept_package.test_cursor) is

begin
   open dept_cursor for select *from employees where department_id = deptno;
end;


分頁:
--如何篩選
select * from (select ee.*,rownum rn (select * from employees eorder by e.employee_id)ee where rn<10) where rn>6;
--分頁過程實現 首先數據存在哪裏我輸入的table名數據存在遊標中,遊標在包裏定義
--1,先寫包    //遊標存儲一堆數據返回對象
create or replace package page2_package
as
type test_cursor is ref cursor;
end;
--2,再寫分頁細節 存儲過程方便調用和重複利用
create or replace procedure page2_proc(
tablename varchar2,//表名
pagesize number,//一頁多少條記錄
pagecurrent number,//當前頁數
rowtotal out number,//總記錄
pagetotal out number,//總頁數
emp_cursor out page2_package.test_cursor
)is
    V_SQLvarchar2(1200);
    v_beginnumber:=(pagecurrent-1)*pagesize+1;
    v_endnumber:=pagecurrent*pagesize;
begin
   v_sql:='select * from (select e.*,rownum rn from (select * from'||tablename||') e where rownum<='||v_end||') wherern>='||v_begin;
    openemp_cursor forv_sql;             //注意了表數據存於遊標中

   v_sql:='select count(*) from '||tablename;
    executeimmediate v_sql into rowtotal;

    ifmod(rowtotal,pagesize)=0 then
   pagetotal:=rowtotal/pagesize;
    else
   pagetotal:=rowtotal/pagesize+1;
    endif;

end;


攔截器:

視圖

視圖和表的區別
表需要佔用空間,視圖不需要
視圖不能添加索引.(視圖要比錶慢一點)
使用視圖可以簡化複雜的查詢.
視圖可以提高安全性(不同的用戶可以看到不同的視圖)



觸發器.  //注意所操作的數據將存於old或new特定表中等待觸發

創建,使用,級聯(刪除,插入,更新)

觸發器像一個特殊的存儲過程.


1,問題:刪除作者,級聯刪除這個作者出版的書籍.
create or replace trigger del_trigger
after delete on AUTHOR
for each row

begin

    delete fromBOOK where AUTHORid=:old.AUTHORid;
end;


2,問題:增加作者,給一個提示顯示在控制檯
create or replace trigger del_trigger
after delete on AUTHOR
for each row

begin

    delete fromBOOK where AUTHORid=:old.AUTHORid;
end;


--create insert


create or replace trigger save_trigger
after insert on AUTHOR
for each row

begin

  dbms_output.put_line('author:'||:new.aname||'insert...success  :)');
end;
上.
//開啓輸出流 set serveroutput on;
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章