oracle簡單的存儲過程和函數以及觸發器的使用

      連續寫了兩篇文章,實在寫的頭疼,所以此刻出去溜個彎,就着春風的愜意,舒緩一下大腦,來寫下面的內容,於是我提筆就開始,生怕錯過了下面的時間而耽誤了我回去的事情,畢竟嘛,春節到了,該回家了(15個例子)。

   1.create or replace function fun_prac(id number)(函數的使用)
    return varchar2
    is
   begin
   dbms_output.put_line('這是第一個函數');
   return 'id的值是:'||id;

   end;

    2.--定義一個函數,獲取給定部門的工資總和,要求:部門號定義爲參數,工資總額定義爲返回值
   create or replace function sum_emp_sal(dno number)(函數的使用)
   return number
   is
    v_sal emp.sal%type;
    begin
   select sum(sal) into v_sal from emp where deptno=dno;
   return v_sal;

    end;

   3.----刪除數據之後然後備份數據到另外一個表中
  create or replace trigger backup_data(觸發器的使用)
  after delete on emp
  for each row
  begin
  insert into emptest values(:old.empno,:old.ename,:old.job,:old.mgr,:old.hiredate,:old.sal,:old.comm,:old.deptno) ;

  end;

  4.查詢某個部門的員工工資總和

   create or replace function ls_sum_emp_sal(dno number,sum_empno_account out number)(函數的使用)
   return number
   is
  sum_sal number(10):=0;
  cursor emp_cursor is select sal from emp where deptno=dno;--定義遊標查詢每個部門下每個員工的工資
  begin
   sum_empno_account:=0;
   for v_sal in emp_cursor loop
   sum_sal:=sum_sal+v_sal.sal;
   sum_empno_account:=sum_empno_account+1;
   end loop;
   return sum_sal;

   end;

 5.求1到100的和用for in loop 循環(函數的使用)

 create or replace function sum_count
return number
is 
---定義變量
v_sum number(10):=0;
begin
  for v_temp in 1..100 loop
  v_sum:=v_sum+v_temp;
  end loop;
 return v_sum;

 end;

6. loop  exit when 求1到100的和(函數的使用)

create or replace function sum_count1
return number
is
v_sum number(10):=0;
v_a number(10);
begin
 v_a:=1;
 loop
 v_sum:=v_sum+v_a;
 v_a:=v_a+1;
 exit when v_a>100;
 end loop;
 return v_sum;

 end;

7.while loop 求1到100的和(函數的使用)

create or replace function sum_count2
return number
is
v_sum number(10):=0;
v_a number(10);
begin
  v_a:=0;
  while v_a<=100 loop
   v_sum:=v_sum+v_a;
   v_a:=v_a+1;
   end loop;
   return v_sum;

   end;

8.動態更新sql(存儲過程的使用)

CREATE OR REPLACE PROCEDURE proc_update1(sno NUMBER,sname VARCHAR2) AS
mysql VARCHAR2(500);  

BEGIN  

 mysql:='UPDATE student SET sname=:1 WHERE sno=:2';  

 EXECUTE IMMEDIATE mysql USING sname,sno;  

 END proc_update1;

9.往學生表中插入1000條數據(存儲過程的使用)

create or replace procedure proc_while_insert(v_typ varchar2) is
cnt number;
begin
for r in 1 ..1000 loop
    insert into student (sno,sname)
      select 'st'||r ,'測試'||r from dual;
  end loop;
 Exception
   when NO_DATA_FOUND
     then
       dbms_output.put_line('數據不存在');       
end;

10.存儲過程遊標的使用

create or replace procedure pro_add_sal(dno number,total_sal out number) is(存儲過程的使用)
---一個部門下有多個員工,所以需要定義遊標
cursor emp_cursor is select sal,hiredate from emp where deptno=dno;
v_temp number(5,2);
begin
  ---使用for in 循環
  total_sal:=0;
  for v_result in emp_cursor loop
    if to_char(v_result.hiredate,'yyyy')<'1995' then v_temp:=0.05;
    elsif to_char(v_result.hiredate,'yyyy')<1998 then v_temp:=0.03;
    else v_temp:=0.01;
    end if;
     total_sal:=total_sal+v_result.sal*v_temp;
    update emp set sal=sal*(1+v_temp) where deptno=dno;
   end loop;

end;

11.存儲過程的更新和查詢語句

create or replace procedure update_emp(v_empno number,v_result out number) is(存出過程的使用)
begin
  update emp set sal=100 where empno=v_empno;
  select sal into v_result from emp where empno=v_empno;

end update_emp;

12.插入emp表數據時觸發(觸發器的使用)

create or replace trigger insert_prac
after insert on emp
for each row
begin
 insert into emptest(empno,ename,job) values(:new.empno,:new.ename,:new.job);

end;

13.更新emp表的時候觸發(觸發器的使用)

create or replace trigger update_prac
after update on emp
for each row
begin
 update emptest set empno=:new.empno;

 end;

14.create or replace procedure proc_selectall(cno in number,s_result out sys_refcursor) is(存儲過程使用)
cnt number;
begin
  select sno into cnt from student where sno=cno;
  if cnt>0 then
  open  s_result for  
   select  * from student  where sno=cno;
   else 
       open  s_result for  
     select  * from  student;
    end if;
 Exception
   when NO_DATA_FOUND
     then
       dbms_output.put_line('數據不存在');     

      end proc_selectall;

15.存儲過程的刪除語句

create or replace procedure proc_delete(cno in number) is(存儲過程使用)

begin
  delete from student where sno=cno;
end proc_delete;


























發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章