OraclePL/SQL通俗的讲就是过程语言(Procedural Language)和结构化查询的相关语言(SQL)相结合而演变成的编程语言,OraclePL/SQL其实就是对SQL 的扩展,它支持多种数据类型,如大对象和集合类型可以使用条件和循环等控制结构。
可以创建存储过程,触发器和程序包,给SQL 语句的执行添加程序逻辑!他与Oracle服务器
和Oracle工具紧密集成,具备可移植,灵活性和安全性。
PL/SQL 的优点
支持 SQL
数据操纵命令
事务控制命令
游标控制
SQL 函数和 SQL 运算符
支持面向对象编程 (OOP)
可移植性
可运行在任何操作系统和平台上的Oralce 数据库。
更佳的性能
与 SQL 紧密集成,简化数据处理
支持所有 SQL 数据类型
支持 NULL 值
支持 %TYPE 和 %ROWTYPE 属性类型
安全性
可以通过存储过程限制用户对数据的访问。
PL/SQL 的体系结构
PL/SQL引擎驻留在Oracle服务器中,该引擎接受PL/SQL块,并且对起
进行编译执行!#p#
PL/SQL 块简介
OraclePL/SQL块是构成程序的基本单位,每一个块都包含有PL/SQL和SQL语句,典型的PL/SQL代码块包含如下结构:
(1).声明部分
(2)可执行部分
(3)异常处理
语法结构如下:
[DECLARE
declarations]—声明部分
BEGIN
executable statements—可执行部分
[EXCEPTION –异常处理
handlers] END;
代码示例:
DECLARE
qty_on_hand NUMBER(5); –程序声明部分,定义变量,游标和自定义常量
BEGIN SELECTquantityINTOqty_on_hand- FROMProducts- WHEREproduct='芭比娃娃'- FORUPDATEOFquantity;- IFqty_on_hand>0THEN- UPDATEProductsSETquantityquantity=quantity+1-
WHERE product = ‘芭比娃娃’; 程序执行部分
INSERTINTOpurchase_record- VALUES('已购买芭比娃娃',SYSDATE);- ENDIF;- COMMIT;-
EXCEPTION /* 异常处理语句 * / ———————–异常处理
WHENOTHERSTHEN- DBMS_OUTPUT.PUT_LINE('出错:'||SQLERRM);- END;
变量和常量
OraclePL/SQL 块中可以使用变量和常量
在声明部分声明,使用前必须先声明
声明时必须指定数据类型,每行声明一个标识符
在可执行部分的 SQL 语句和过程语句中使用
声明变量和常量的语法
identifier[CONSTANT]datatype[NOTNULL] [:=|DEFAULTexpr];
给变量赋值有两种方法
使用赋值语句 :=
使用 select into 语句
代码示例:
DECLARE icodeVARCHAR2(6); p_catgVARCHAR2(20); p_rateNUMBER; c_rateCONSTANTNUMBER:=0.10; BEGIN ... icode:='i205'; SELECTp_category,itemrate*c_rate INTOp_catg,p_rate FROMitemfileWHEREitemcode=icode; ... END;
数据类型
OraclePL/SQL支持的内置数据类型有如下几种:
如图:
标量类型
数字
字符
CHAR
VARCHAR2
LONG
RAW
LONG RAW
结构如图:
日期时间类型
日期时间类型
存储日期和时间数据
常用的两种日期时间类型
DATE
TIMESTAMP
布尔类型
此类别只有一种类型,即BOOLEAN类型
用于存储逻辑值(TRUE、FALSE和NULL)
不能向数据库中插入BOOLEAN数据
不能将列值保存到BOOLEAN变量中
只能对BOOLEAN变量执行逻辑操作
如图:
LOB类型
用于存储大文本、图像、视频剪辑和声音剪辑等非结构化数据。
LOB数据类型可存储*** 4GB的数据。
LOB 类型包括:
BLOB 将大型二进制对象存储在数据库中
CLOB 将大型字符数据存储在数据库中
NCLOB 存储大型UNICODE字符数据
BFILE 将大型二进制对象存储在操作系统文件中
LOB 类型的数据库列仅存储定位符,该定位符指向大型对象的存储位置
DBMS_LOB程序包用于操纵 LOB 数据
代码示例:
SETSERVEROUTPUTON DECLARE clob_varCLOB; amountINTEGER; offsetINTEGER; output_varVARCHAR2(100); BEGIN SELECTchapter_textINTOclob_var FROMmy_book_text WHEREchapter_id=5;
amount := 24; — 要读取的字符数
offset := 1; — 起始位置
DBMS_LOB.READ(clob_var,amount,offset,output_var); DBMS_OUTPUT.PUT_LINE(output_var); END; /