pl/sql程式設計---過程、函式、包
阿新 • • 發佈:2018-12-26
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'));