1,PL/SQL 是过程语言(Procedural Language)与结构化查询语言(SQL)结合而成的编程语言复合类型
2,PL/SQL 是对 SQL 的扩展
3,支持多种数据类型,如大对象和集合类型,可使用条件和循环等控制结构
4,可用于创建存储过程、触发器和程序包,给SQL语句的执行添加程序逻辑
5,与 Oracle 服务器和 Oracle 工具紧密集成,具备可移植性、灵活性和安全性
PL/SQL 的优点
支持 SQL,在 PL/SQL 中可以使用:
数据操纵命令
事务控制命令
游标控制
SQL 函数和 SQL 运算符
支持面向对象编程 (OOP)
可移植性,可运行在任何操作系统和平台上的Oralce 数据库
更佳的性能,PL/SQL 经过编译执行
与 SQL 紧密集成,简化数据处理。
支持所有 SQL 数据类型
支持 NULL 值
支持 %TYPE 和 %ROWTYPE 属性类型
安全性,可以通过存储过程限制用户对数据的访问
PL/SQL 的体系结构
PL/SQL 引擎驻留在 Oracle 服务器中
该引擎接受 PL/SQL 块并对其进行编译执行
PL/SQL 块简介
PL/SQL 块是构成 PL/SQL 程序的基本单元
将逻辑上相关的声明和语句组合在一起
PL/SQL 分为三个部分,声明部分、可执行部分和异常处理部分
[DECLARE
declarations]
BEGIN
executable statements
[EXCEPTION
handlers]
END;
示例:
DECLARE
qty_on_hand NUMBER(5);--声明部分定义变量、游标和自定义异常
BEGIN
--包含 SQL 和 PL/SQL 语句的可执行部分
SELECT quantity INTO qty_on_hand
FROM Products
WHERE product = '芭比娃娃'
FOR UPDATE OF quantity;
IF qty_on_hand > 0 THEN
UPDATE Products SET quantity = quantity + 1
WHERE product = '芭比娃娃';
INSERT INTO purchase_record
VALUES ('已购买芭比娃娃', SYSDATE);
END IF;
COMMIT;
EXCEPTION /* 异常处理语句 */
--指定出现错误时需要执行的操作
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE('出错:'|| SQLERRM);
END;
变量和常量
PL/SQL 块中可以使用变量和常量
在声明部分声明,使用前必须先声明
声明时必须指定数据类型,每行声明一个标识符
在可执行部分的 SQL 语句和过程语句中使用
声明变量和常量的语法:
identifier [CONSTANT] datatype [NOT NULL] [:= | DEFAULT expr];
给变量赋值有两种方法:
1,使用赋值语句 :=
2,使用 SELECT INTO 语句
示例:DECLARE
icode VARCHAR2(6);
p_catg VARCHAR2(20);
p_rate NUMBER;
c_rate CONSTANT NUMBER := 0.10;
BEGIN
...
icode := 'i205';
SELECT p_category, itemrate * c_rate
INTO p_catg, p_rate
FROM itemfile WHERE itemcode = icode;
...
END;
数据类型
字符数据类型
字符数据类型包括:
CHAR
VARCHAR2
LONG
RAW
LONG RAW
PL/SQL 的数据类型与 SQL数据类型的比较
日期时间和布尔数据类型
日期时间类型
存储日期和时间数据,常用的两种日期时间类型:DATE与TIMESTAMP
布尔数据类型
此类别只有一种类型,即BOOLEAN类型,用于存储逻辑值(TRUE、FALSE和NULL)
注意:
1,不能向数据库中插入BOOLEAN数据
2,不能将列值保存到BOOLEAN变量中
3,只能对BOOLEAN变量执行逻辑操作
LOB 数据类型
用于存储大文本、图像、视频剪辑和声音剪辑等非结构化数据。
LOB 数据类型可存储最大 4GB的数据。
LOB 类型包括:
BLOB 将大型二进制对象存储在数据库中
CLOB 将大型字符数据存储在数据库中
NCLOB 存储大型UNICODE字符数据
BFILE 将大型二进制对象存储在操作系统文件中
LOB 类型的数据库列仅存储定位符,该定位符指向大型对象的存储位置
DBMS_LOB程序包用于操纵 LOB 数据
示例:
SET SERVEROUTPUT ON
DECLARE
clob_var CLOB;
amount INTEGER;
offset INTEGER;
output_var VARCHAR2(100);
BEGIN
SELECT chapter_text INTO clob_var
FROM my_book_text
WHERE chapter_id=5;
amount := 24; -- 要读取的字符数
offset := 1; -- 起始位置
DBMS_LOB.READ(clob_var,amount,offset,output_var);
DBMS_OUTPUT.PUT_LINE(output_var);
END;
/
declare表类型
type emp_record_type is record
(v_ename emp.ename%type,
v_job emp.job%type,
v_sal emp.sal%type);
emp_rec emp_record_type;
begin
select ename,job,sal into emp_rec
from emp where empno=&eno;
dbms_output.put_line(emp_rec.v_ename||':'||
emp_rec.v_job||':'||emp_rec.v_sal);
end;
示例:数组类型
例6.3 索引表类型的定义
SQL > DECLARE
TYPE ename_table_type IS TABLE OF emp.ename%TYPE
INDEX BY BINARY_INTEGER;
Ename_table ename_table_type;
BEGIN
SELECT ename INTO ename_table(1) FROM emp
WHERE empno=7902;
Dbms_output.put_line('员工名:'|| ename_table(1));
END;
/