Oracle PL/SQL 学习笔记:
PL/SQL是一种高级数据库程序设计语言,PL/SQL语言在将SQL语言的灵活性及功能与第三代语言的可配置能力相结合方面是独一无二的。该语言集成了面向过程语言的过程结构和强大的数据库操作,为设计复杂的数据库应用提供了功能强大、健壮可靠的程序设计语言。该语言专门用于在各种环境下对Oracle数据库进行访问。由于该语言集成于数据库服务器中,所以PL/SQL代码可以对数据进行快速高效的处理。
PL/SQL作为一种高级数据库程序设计语言的核心在于其提供了强大的变量、控制结构和循环机制,方便进行逻辑事务的组织;
PL/SQL 是 ORACLE 系统的核心语言,现在 ORACLE 的许多部件都是由 PL/SQL 写 成。在 PL/SQL 中可以使用的 SQL 语句有:
INSERT , UPDATE , DELETE , SELECT INTO , COMMIT , ROLLBACK , SAVEPOINT
提示:在 PL/SQL 中只能用 SQL 语句中的 DML 部分,不能用 DDL 部分,如果要在
PL/SQL 中使用 DDL( 如 CREATE table 等 ) 的话,只能以动态的方式来使用。
PL/SQL语言注意事项:
ORACLE的PL/SQL 组件在对 PL/SQL 程序进行解释时,同时对在其所使用的表名列名及数据类型进行检查。
PL/SQL 可以在 SQL*PLUS 中使用。
PL/SQL 可以在高级语言中使用。
PL/SQL 可以 在 ORACLE 的 开发工具中使用。
其它开发工具也可以调用 PL/SQL 编写的过程和函数,如 Power Builder 等
都可以调用服务器端的 PL/SQL 过程。
PL/SQL中的程序一般由三个部分组成:声明部分、执行部分、异常处理部分;在Pl/SQL中。程序语句以块为单位进行组织。
PL/SQL 块的结构如下:
DECLARE
/* 声明部分 : 在此声明 PL/SQL 用到的变量 , 类型及游标,以及局部的存储过程和函数 * /
BEGIN
/* 执行部分 : 过程及 SQL 语句 , 即程序的主要部分 */
EXCEPTION
/* 执行异常部分 : 错误处理 */
END;
PL/SQL 块可以分为三类:
1. 无名块:动态构造,只能执行一次。
2. 子程序:存储在数据库中的存储过程、函数及包等。当在数据库上建立好后可以在其它程序中调用它们。
3. 触发器:当数据库发生操作时,会触发一些事件,从而自动执行相应的程序。
2.2 PL / SQL 结构
PL/SQL 块中可以包含子块;
子块可以位于 PL/SQL 中的任何部分;
子块也即 PL/SQL 中的一条命令;
§ 2.3 标识符
PL/SQL 程序设计中的标识符定义与 SQL 的标识符定义的要求相同。要求和限制有:
标识符名不能超过 30 字符; '标识名不能超过30个字符'
第一个字符必须为字母; ‘第一个字符必须为字母’
不分大小写; '不区分大小写'
不能用 ’-‘ ( 减号 ); ‘不能用减号’
不能是 SQL 保留字。 ‘不能是SQL保留字’
Oracle除了提供以上数据类型外,还提供了一种复合数据类型:记录和表;
记录类型:2 . 4.2.1 记录类型
记录类型是把逻辑相关的数据作为一个单元存储起来,它必须包括至少一个标量型或ECORD 数据类型的成员,称作 PL/SQL RECORD 的域 (FIELD) ,其作用是存放互不相同但逻辑相关的信息。
定义记录类型语法如下 :
TYPE record_type IS RECORD(
Field1 type1 [NOT NULL] [:= exp1 ] ,
Field2 type2 [NOT NULL] [:= exp2 ] ,
. . . . . .
Fieldn typen [NOT NULL] [:= expn ] ) ;
声明样例:
DECLARE
TYPE test_rec IS RECORD(
Code VARCHAR2(10),
Name VARCHAR2(30) NOT NULL := ’ a book ’ );
V_book test_rec;
BEGIN
V_book.code := ’ 123 ’ ;
V_book.name := ’ C++ Programming ’ ;
DBMS_OUTPUT.PUT_LINE(v_book.code||v_book.name);
END;
可以用 SELECT 语句对记录变量进行赋值 , 只要保证记录字段与查询结果列表中的字段相配即可。
§ 2 . 4.2.2 使用 %TYPE
定义一个变量,其数据类型与已经定义的某个数据变量的类型相同,或者与数据库表的某 个
列的数据类型相同,这时可以使用 %TYPE 。
使用 %TYPE 特性的优点在于:
所引用的数据库列的数据类型可以不必知道;
所引用的数据库列的数据类型可以实时改变。
DECLARE
用 %TYPE 类型定义与表相配的字段
TYPE t_Record IS RECORD(
T_no emp.empno %TYPE,
T_ name emp.e name%TYPE,
T_sal emp.sal %TYPE );
声明接收数据的变量
v_emp t _ Record;
BEGIN
SELECT empno, ename, sal INTO v_ emp FROM emp WHERE empno = 7788 ;
D BMS_OUTPUT.PUT_LINE
( TO_CHAR (v_emp.t_no)||v_emp.t_name||TO_CHAR (v_emp.t_sal));
END;
DECLARE
v_empno emp.empno%TYPE :=&em
Type r_record is record (
v_name e mp.ename%TYP
v_sal emp.sal%TYPE,
v_date emp.hiredate%TY
Rec r_record;
BEGIN
SELECT ename, sal, hiredate INTO Rec FROM emp WHERE empno=v_empno;
DBMS_OUTPUT.PUT_LINE(Rec.v_name||''||Rec.v_sal||''||Rec.v_date);
END;
§ 2 . 4.3 使用 %ROWTYPE
PL/SQL 提供 %ROWTYPE 操作符 , 返回一个记录类型 , 其数据类型和数据库表的数据结构相一致。
使用 %ROWTYPE 特性的优点在于:
所引用的数据库中列的个数和数据类型可以不必知道;
所引用的数据库中列的个数和数据类型可以实时改变。
使用样例:例 7 :
DECLARE
v_empno emp.empno%TYPE :=&empno;
rec emp
%ROWTYPE;
BEGIN
SELECT * INTO r ec FROM emp WHERE empno=v_empno;
DBMS_OUTPUT.PUT_LINE(' 姓名 :'||r ec .ename||'工资 :'||r ec .sal||' 工作时间 :'||r ec .hiredate);
END;
§ 2.4.4 LOB 类型 *
ORACLE 提供了 LOB ( L arge OB ject) 类型,用于存储大的数据对象的类型。 ORACLE
目前主要支持 BFILE, BLOB, CLOB 及 NCLOB 类型。
BFILE (Movie)
存放大的二进制数据对象,这些数据文件不放在数据库里,而是放在操作系统的某个 目
录里,数据库的表里只存放文件的目录。
BLOB(Photo)
存储大的二进制数据类型。变量存储大的二进制对象的位置。大二进制对象的大小
<=4GB 。
CLOB(Book)
存储大的字符数据类型。每个变量存储大字符对象的位置,该位置指到大字符数据块。
大字符对象的大小 <=4GB 。
NCLOB
存储大的 NCHAR 字符数据类型。每个变量存储大字符对象的位置,该位置指到大字 符
数据块。大字符对象的大小 <=4GB 。