1. 程式人生 > >pl/sql程式設計---過程、函式、包

pl/sql程式設計---過程、函式、包

1.註釋

單行註釋 --
	select * from emp where empno=7788; --取得員工資訊
多行註釋 /*...*/來劃分

2.標誌符號的命名規範

1).當定義變數時,建議用v_作為字首v_sal
2).當定義常量時,建議用c_作為字首c_rate
3).當定義遊標時,建議用_cursor作為字尾emp_cursor
4).當定義例外時,建議用e_作為字首e_error

3.塊結構示意圖

pl/sql塊由三個部分構成:定義部分,執行部分,例外處理部分。
如下所示:
declare
/*定義部分——定義常量、變數、遊標、例外、複雜資料型別*/
begin
/*執行部分——要執行的pl/sql語句和sql語句*/
exception
/*例外處理部分——處理執行的各種錯誤*/
end;
定義部分是從declare開始的,該部分是可選的;
執行部分是從begin開始的,該部分是必須的,至少要寫null,不能不寫;
例外處理部分是從exception開始的,該部分是可選的。
& 表示要接收從控制檯輸入的變數。

4.過程

過程用於執行特定的操作,當建立過程時,既可以指定輸入引數(in),也可以指定輸出引數(out),
通過在過程中使用輸入引數,可以將資料傳遞到執行部分;
通過使用輸出引數,可以將執行部分的資料傳遞到應用環境。
在sqlplus中可以使用create procedure命令來建立過程。

--只有輸入引數的儲存過程
create or replace procedure proc01(eno number) --in 輸入引數  out輸出引數
as
begin
  update emp set sal = sal+500 where empno = eno;
   ---select sal into money from emp where empno=eno;
end proc01;
在oracle中呼叫儲存過程:
第一種:call proc01(7654);
第二種:在plsql塊中呼叫	
	SQL> begin
	  3  proc01(7654);
	  5  end;
	  6  /

–既有輸入又有輸出引數的儲存過程

create or replace procedure proc02(eno in number,money out number) is
begin
  update emp set sal=sal+1000 where empno=eno;
  select sal into money from emp where empno=eno;
  commit;
  exception
	rollback;
end proc02;

在oracle中呼叫儲存過程:

	SQL> set serveroutput on;
	SQL> declare money number;
	  2  begin
	  3  proc02(7654,money);
	  4  dbms_output.put_line(money);
	  5  end;
	  6  /

5.JAVA中呼叫儲存過程

Java程式碼   
1.	CallableStatement cs = con.prepareCall("{call emp_pro(?,?)}");  
2.	//4.給?賦值  
3.	cs.setString(1,"SMITH");  
4.	cs.setInt(2,10);  
5.	//5.執行  
6.	cs.execute();  

6.函式

函式用於返回特定的資料,當建立函式時,在函式頭部必須包含return子句。
而在函式體內必須包含return語句返回的資料。我們可以使用create function來建立函式,實際案例:
Sql程式碼   
1.	--編寫函式 返回指定人員的年薪  
2.	create function annual_income(name varchar2)  
3.	return number is  
4.	annual_salary number(7, 2);  
5.	begin  
6.	  select sal*12 + nvl(comm, 0) into annual_salary from emp where ename = name;  
7.	  return annual_salary;  
8.	end;  
在sqlplus中呼叫函式
Sql程式碼   
1.	SQL> var income number  
2.	SQL> call annual_incomec('scott') into :income; --注意:和income之間不能有空白  
3.	SQL> print income  
同樣我們可以在java程式中呼叫該函式 select annual_income('SCOTT') from dual;

7.包

包用於在邏輯上組合過程和函式,它由包規範和包體兩部分組成。
1).我們可以使用create package命令來建立包。
Sql程式碼   
1.	--使用create package命令建立包  
2.	create package pkg_sal is  
3.	  procedure update_sal(name varchar2, new_sal number);  
4.	  function annual_income(name varchar2) return number;  
5.	end;  
包的規範只包含了過程和函式的說明,但是沒有過程和函式的實現程式碼。包體用於實現包規範中的過程和函式。
2).建立包體可以使用create package body命令
Sql程式碼   
1.	--使用create package body建立包體  
2.	create or replace package body pkg_sal is  
3.	  procedure update_sal(name varchar2, new_sal number) is  
4.	    begin  
5.	      update emp set sal = new_sal where ename = name;  
6.	    end;  
7.	  function annual_income(name varchar2) return number is  
8.	    income number(7, 2);  
9.	    begin  
10.	      select sal*12 + nvl(comm, 0) into income from emp where ename = name;  
11.	      return income;  
12.	    end;  
13.	end;  
3).如何呼叫包的過程或是函式
當呼叫包的過程或是函式時,在過程和函式前需要帶有包名,如果要訪問其它方案的包,還需要在包名前加方案名。
呼叫儲存過程
exec pkg_sal.update_sal('zhang',50000);
呼叫函式

1.plsql程式碼塊
   DECLARE 
  v_income number;
     begin
     v_income :=pkg_sal.annual_income('zhang');
      DBMS_OUTPUT.PUT_LINE('年薪為:'||v_income);
    end;
    /
  
    2.execute
     variable v_income number
     execute :v_income :=pkg_sal.annual_income('xiaoming');
結果:
PL/SQL procedure successfully completed
     v_income
     ---------
     60000
   
    3.call
    var v_income number;
    call pkg_sal.annual_income('xiaoming') into :v_income;
    
    4.select
    select pkg_sal.annual_income('xiaoming') from dual;
    結果:
    PKG_SAL.ANNUAL_INCOME('XIAOMIN
      ------------------------------
                     60000
5.將函式作為另一個子程式的引數
    execute dbms_output.put_line(pkg_sal.annual_income('xiaoming'));