DECLARE
/*
* 定義部分——定義常量、變量、復雜數據類型、游標、用戶自定義異常
*/
BEGIN
/*
* 執行部分——PL/SQL語句和SQL語句
*/
EXCEPTION
/*
* 異常處理部分——處理運行錯誤
*/
END;
/*塊結束標記 */
2. 使用變量和常量
1) PL/SQL 塊中可以使用變量和常量a. 在聲明部分聲明,使用前必須先聲明b. 聲明時必須指定數據類型,每行聲明一個標識符c. 在可執行部分的 SQL 語句和過程語句中使用2) 聲明變量和常量的語法:identifier [CONSTANT] datatype [NOT NULL]
[:= | DEFAULT exPR];
3) 給變量賦值有兩種方法:a. 使用賦值語句 :=b. 使用 SELECT INTO 語句例如:DECLARE
v_name varchar2(10);
BEGIN
select dname into v_name
from dept
where deptno = 90;
dbms_output.put_line('dname:'|| v_name);
EXCEPTION WHEN NO_DATA_FOUND THEN
dbms_output.put_line('沒有該部門');
END;
3. PL/SQL塊的類型
1) 匿名塊前面各個示例執行的都是沒有名稱的匿名塊。2) 子程序a. 過程:能夠完成一系列的增刪改查的動作的“方法”。示例:更新指定姓名員工工資,姓名不區別不大小寫。create or replace procedure update_sal
(p_ename VARCHAR2, p_newsal NUMBER)
AS
BEGIN
UPDATE emp SET sal = P_newsal
WHERE lower(ename) = lower(P_ename);
commit;
END;
調用:
exec update_sal(‘scott’, 2000); --SQL*PLUS中的命令
call update_sal(‘SCOTT’, 2000); --java中調用的語句
b. 函數:能夠完成計算并返回計算結果,注意不能修改數據。示例:計算一個數的兩倍后并返回。create or replace function f_add(a number )
return number
as
begin
return a*2;
end;
調用:
select f_add(2) from dual;
select f_add(deptno) from dept;
c. 觸發器:當觸發器所監控的表的數據發生改變(增刪改)時自動執行的代碼塊。d. 包:包用于邏輯“包含”相關的過程和函數,它由包頭和包體兩部分組成。示例:將前面的函數f_add定義在包中并調用。create or replace package my_bao is
function f_add(a number ) return number;
end;
/
create or replace package body my_bao is
function f_add(a number ) return number
as
begin
return a*2;
end;
end;
/
調用:select my_bao.f_add(2) from dual;
4. 標量變量1) 標量變量a. 標量變量是指只能存入單個數值的變量。b. 標量變量必須先定義后使用。2) 常用的標量類型a. VARCHAR2(n):該數據類型用于定義可變長度的字符串 ,n<=4000。b. CHAR(n):該數據類型用于定義固定長度的字符串,n<=2000。c. NUMBER(總位數, 小數位):定義整數或小數。d. DATE:該數據類型用于定義日期和時間數據。e. BOOLEAN:該數據用于定義布爾變量,其變量的值為TRUE、FALSE或NULL。 注意此類型只能在PL/SQL中使用,表列是沒有此類型的。f. %type:通常用于指定表的某個列的數據類型,可以理解為“的類型”(小技巧:%讀“的”)。示例:打印部門編號為10的部門名稱。declare
v_name dept.dname%type;
begin
select dept.dname into v_name
from dept
where deptno = 10;
dbms_output.put_line('dept = '||v_name);
end;
運行結果:
dept = ACCOUNTING
5. 復合變量
1) 復合變量a. 復合變量是指用于存放多個值的變量。b. 在使用復合變量時,必須先用TYPE進行定義“新的數據類型”,然后再用這些新的類型定義新的變量。2) 復合數據類型a. 記錄類型:可以簡單理解為具有多個“屬性”的變量。DECLARE
TYPE emp_record_type IS RECORD (
name emp.ename%TYPE,
salary emp.sal%TYPE);
emp emp_record_type;
BEGIN
SELECT ename,sal,job into emp
FROM emp WHERE empno=7788;
dbms_output.put_line('雇員名:' || emp .name);
END;
b. 索引表類型PL/SQL索引表類似Collection接口,或者看成是一個1維數組也可以。不連續索引可為負數動態增長語法:type xx is table of 類型 index by 整型c. 嵌套表類型d. 變長數組類型e. 集合類型6. 引用變量1) 引用變量引用變量是指用于存放數據地址(指針)的變量。2) 好處通過使用引用變量,可以使得應用程序共享相同對象,從而降低占用空間。3) 引用變量類型a. REF CURSOR:引用游標類型先定義游標變量,再定義該游標使用的select語句。具體將在后面游標講解更深入講解。b. REF obj_type:引用對象類型編寫對象類型應用時,為了共享相同對象,可以使用REF引用對象類型,REF實際是指向對象實例的指針。7. LOB變量
1) LOB變量LOB變量是指用于存儲大批量數據的變量。2) 分類a. 內部LOB:存儲在數據庫中,并且支持事務操作(提交、回退、保存點)。CLOB:存儲大批量字符數據(指定字符集)NCLOB:存儲大批量字符數據 (所有字符集)BLOB:存儲大批量二進制數據b. 外部LOB:只有一種類型,該類型的數據被存儲在操作系統文件中,并且不支持事務操作。BFILE:存儲指向操作系統文件的指針8. 使用SQL*Plus綁定變量
a. 當在SQL*Plus中與PL/SQL塊之間進行數據交互時,需要使用SQL*Plus綁定變量來完成。b. 當在PL/SQL中引用非PL/SQL變量時,必須要在非PL/SQL變量前加冒號(“:”)。SQL> var name varchar2(10);
SQL> BEGIN
2 SELECT ename INTO :name FROM emp
3 WHERE empno = 7788;
4 end;
5 /
SQL> print name;
name
---------
SCOTT
9. PL/SQL詞匯單元
當編寫PL/SQL塊時,每個PL/SQL塊都包含多行代碼,而每行代碼又是由多個合法單元組成的,這些合法單元被稱為詞匯單元。
1) PL/SQL詞匯單元分類a. 標識符通過使用標識符,可以定義常量、變量、異常、顯式游標、游標變量、參數、子程序以及包的名稱。示例:declare v_name emp.ename%type;b. 字面量寫在代碼各種具體的數值,如數字、字符、字符串、日期值或布爾值 。示例: v_name := 'lovo';c. 分隔符分隔符是指具有特定含義的單個符號(+、-、*、/)或組合符號( := 、>=)。示例: a := 10 + 20 ;3) 注釋a. 單行注釋 --單行注釋b. 多行注釋 /*多行注釋*/示例DECLARE
--定義v_sal變量
v_sal NUMBER(6,2);
BEGIN
/*
給變量賦值,
然后打印此變量
*/
v_sal := 1000;
dbms_output.put_line(v_sal);
END;
10.PL/SQL代碼編寫規則
1)好處使用適當的編寫規則,可以提高代碼的可讀性,降低程序維護難度。2) 規則A. 標識符命名規則a. v_變量名 定義變量b. e_變量名 定義異常c. …….B. 大小寫規則代碼不區別大小寫,但建議關鍵字大寫。C. 代碼縮進D. 嵌套塊和變量范圍外部塊能夠訪問內部塊的變量,反之則不能。新聞熱點
疑難解答