30.PLSQL中的過程

一、引言

        過程,是對一組PLSQL語句的封裝,以達到代碼複用的目的。創建一個過程之後,它便存儲在了數據庫中,我們隨時隨地可在其他PLSQL的數據塊中進行引用。

二、創建一個簡單的存儲過程

        接下來,我們先創建一個簡單的顯示“Hello World”的存儲過程,代碼如下:
create procedure print_proc
as
begin
  dbms_output.put_line('Hello World!');
end;
/
        這個過程很簡單,創建完成之後,我們發現在SQL developer中已經存在了該過程:
        如果需要調用該存儲過程,只需在PLSQL塊中直接使用:
begin
 print_proc();
end;
/
       最終執行的結果如下:

三、創建一個帶參的查詢過程

        同其他語言中的函數類似,PLSQL中的過程也可以帶自己的參數,接下來我們實現一個例子,根據emp表中的僱員編號來查詢其相關的信息,首先假設有以下emp表:

        我們實現的功能就是根據empno查詢僱員信息,打印出僱員的enamel和sal:
create or replace procedure query_by_empno(v_empno  emp.empno%type)
as
  v_ename emp.ename%type;
  v_sal emp.sal%type;
begin
  select ename,sal into v_ename,v_sal from emp where empno=v_empno;
  dbms_output.put_line('姓名:'||v_ename||',薪資:'||v_sal);
end;
/
        帶參過程就是在定義過程時同時聲明瞭過程的形參,和其他語言的函數定義類似,形參的格式是形參名稱後面緊跟着形參的類型。調用時我們也只需傳入參數即可:
begin
 query_by_empno(7566);
end;
/

四、創建修改數據庫的過程

        過程不僅能夠查詢數據庫,而且可以使用insert、Update、Delete等語句插入、修改或者刪除數據,在下面的例子中,我們編寫一個可以修改數據的存儲過程,根據部門號,來修改每個部門人員sal提升的幅度。
--帶參的修改過程
create or replace procedure update_by_deptno(v_deptno emp.deptno%type,v_multiple number)
as
begin
  update emp set sal=sal*v_multiple where deptno=v_deptno;
end;
/

五、帶異常處理的存儲過程

        存儲過程和PLSQL的代碼塊類似,也可以增加異常處理的代碼塊,一般情況下我們進行DML操作時,若出現異常,可在異常區進行捕獲然後進行回滾操作,如我們定義如下的存儲過程,向emp表中插入新的人員,如果增加不成功就拋出異常:
create or replace procedure insert_emp(v_empno emp.empno%type,v_ename emp.ename%type,v_job emp.job%type,v_mgr emp.mgr%type,v_sal emp.sal%type,v_deptno emp.deptno%type)
as 
 v_count number;
begin
  select count(*) into v_count from emp where empno=v_empno;
  if v_count>0 then
   raise_application_error(-20789,'增加失敗,該部門已經存在');
  else
   insert into emp values(v_empno,v_ename,v_job,v_mgr,sysdate,v_sal,null,v_deptno);
  end if;
exception
  when others then
      dbms_output.put_line('sqlerrm='||sqlerrm);
      rollback;
end;
/
        我們可以看到,在上面的存儲過程中多了exception的代碼塊,這就是我們進行異常處理的地方。上述的例子也是一般利用儲存過程進行插入的程序結構,我們在插入之前先查看當前的數據庫中是否存在相同主鍵的數據行,在不存在的情況下再去插入。
        如果我們插入已經存在的empno,結果如下:
begin
 insert_emp(7499,'Hyman','salesman',7698,3000,30);
end;
/
        只有不存在衝突的empno時,插入纔會成功。





        

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