plsql 語法、過程、函數、包、觸發器

語法


塊定義語法

DECLARE
       --定義部分--定義常量、變量、複雜數據類型、遊標
BEGIN
       --執行部分--PL/SQL語句和SQL語句
EXCEPTION
       --異常處理部分——處理運行錯誤 異常中可以插入邏輯代碼
END;
       注:PL/SQL中結束輸入使用‘/’字符


dbms_output是oracle提供的系統包;put_line是該包中的過程,用於輸出字符串信息。當使用dbms_output包時必須要先激活服務器輸出
dbms_output.put_line(“輸出的字符串內容”);
激活服務器輸出語句: set serveroutput on(默認是關閉的)

示例:

DECLARE
       str          varchar(5)    --變量的定義
BEGIN
       Select name INTO str FROM emp        --INTO是將name的值賦值給str
where empno=$no;    --$no是替代變量
EXCEPTION
         When NO_DATA_FOUND then         --PL/SQL預定義的異常類型
         dbms_output.put_line(“輸出的字符串內容”);
END;

NO_DATA_FOUND 只有在select..into中才可能出現,

變量定義語法

變量名 [CONSTANT] 數據類型 [NOT NULL] [:=|DEFAULT 默認值或函數]
--CONSTANT表示常量;
--:=設置默認值

%TYPE屬性
示例:
Name    emp.ename%TYPE          --name與emp表中ename列的類型和長度相同
Sex         Name%TYPE                    --sex與name類型和長度相同

%ROWTYPE屬性
語法:
變量名         表名%ROWTYPE
示例:
Str   T1%ROWTYPE           
--str變量對應T1表中所有列,並且該表中的所有列的類型與長度相同

PL/SQL中使用的操作符
:=           --賦值操作符
=>      --關聯操作符
||           --連接操作符
 
PL/SQL遊標
遊標定義語法:
CURSOR              遊標名         IS    SQL語句
 
遊標名%ISOPEN        判斷遊標是否已經打開
遊標名%FOUND        SQL語句有作用行市,其屬性值爲TRUE;
遊標名%NOTFOUND SQL語句沒有作用行市,其屬性值爲TRUE;
遊標名%ROWCOUNT       返回SQL語句所作用的總行數
 
注:遊標名默認爲‘SQL’

PL/SQL控制語句


1、分支語句
IF    條件      THEN     執行操作
ELSEIF 條件THEN     執行操作
ELSE       執行操作
END      IF;
2、多重分支語句
CASE      表達式
WHEN    要判斷的值        THEN     執行操作
WHEN    要判斷的值        THEN    執行操作
ELSE      執行操作
END      CASE;
3、循環語句一
WHILE   條件      LOOP
執行操作···
END      LOOP;
4、循環語句二
FOR              變量      IN    [REVERSE]    起點值 ..終點值 LOOP
執行操作
END              LOOP;
注:REVERSE表示由終點值到起點值循環; ..是固定格式;


過程


調用過程有兩種方法: exec  call
 
exec是sqlplus的命令,只能在sqlplus中使用。call是sql命令,任何工具都可以使用。

create procedure sp_pro3(spName varchar2, newSal number) is 
--不要寫成number(3,2),表明類型就可以了,不需要大小。就好像Java寫方法時的參數一樣 
begin  
  --執行部分,根據用戶名去修改工資   
update emp set sal=newSal where ename=spName;   
end;   
/  
begin
  --執行部分,根據用戶名去修改工資
update emp set sal=newSal where ename=spName;
end;
說明:
不用 declare 語句 
  參數列表裏的IN表示向存儲過程傳遞參數,OUT表示從存儲過程返回參數。而IN OUT 表示傳遞參數和返回參數;在聲明變量的時候,IN變量不可以賦常量,OUT可以賦常量,不可以賦變量.

//演示java程序去調用oracle的存儲過程案例 
Java代碼 
import java.sql.*;   
public class TestOraclePro{   
    public static void main(String[] args){   
           
        try{   
            //1.加載驅動   
            Class.forName("oracle.jdbc.driver.OracleDriver");   
            //2.得到連接   
            Connection ct = DriverManager.getConnection("jdbc:oracle:[email protected]:1521:MYORA1","scott","m123");   
  
            //3.創建CallableStatement   
            CallableStatement cs = ct.prepareCall("{call sp_pro3(?,?)}");   
            //4.給?賦值   
            cs.setString(1,"SMITH");   
            cs.setInt(2,10);   
            //5.執行   
            cs.execute();   
            //關閉   
            cs.close();   
            ct.close();   
        } catch(Exception e){   
            e.printStackTrace();   
        }   
    }   
}


函數


     函數用於返回特定的數據,當建立函數時,在函數頭部必須包含return子句。而在函數體內必須包含return語句返回的數據。我們可以使用create function來建立函數,實際案例:


--輸入僱員的姓名,返回該僱員的年薪   
create function annual_incomec(name varchar2)   
return number is  
annual_salazy number(7,2);   
begin  
    --執行部分   
    select sal*12+nvl(comm, 0) into annual_salazy from emp where ename=name;   
    return annual_salazy;   
end;   

如果函數創建過程有編譯錯誤,可以使用show error;命令顯示錯誤.

函數與過程的區別
1.返回值的區別,函數有1個返回值,而存儲過程是通過參數返回的,可以有多個或者沒有
2.函數和過程的主要區別不在於返回值,而在於他們的調用方式。函數可以在查詢語句中直接調用,而存儲過程必須單獨調用.
函數一般情況下是用來計算並返回一個計算結果而存儲過程一般是用來完成特定的數據操作(比如修改、插入數據庫表或執行某些DDL語句等等)

包 


     包是一種將過程、函數和數據結構捆綁在一起的容器;包由兩個部分組成:外部可視包規範,包括函數頭,過程頭,和外部可視數據結構;另一部分是包主體(package body),包主體包含了所有被捆綁的過程和函數的聲明、執行、異常處理部分。

1、  包規範創建語法
create [or replace] package 程序包名
is | as
procedure 過程名(過程參數列表);
function 函數名(函數參數列表);
……
end 程序包名;
 
2、  包體創建語法
create [or replace] package body 程序包名
is | as
之前定義的函數、過程的具體實現部分
end 程序包名;
 
3、包的調用
當調用包的過程或是函數時,在過程和函數前需要帶有包名,如果要訪問其它方案的包,還需要在包名前加方案名。 
exec 程序包名.過程名(參數列表);


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