SQL只是访问、操作数据库的语言,而并不是一种程序设计语言,因此不能用于程序开发。
PL/SQL (Procedural Language/SQL)是Oracle在标准SQL上进行过程性扩展后形成的程序设计语言,是 Oracle数据库特有的、支持应用开发的语言。
参考资料:
- Oracle 12c从入门到精通
- Oracle 11g 数据库基础教程课件
基本结构
PL/SQL是一种模块式结构的语言,其大体结构如下:
DECLARE
--声明一些变量、常量、用户定义的数据类型以及游标等[可选]
BEGIN
--主程序体,在这可以加入各种合法语句[必须]
EXCEPTION
--异常处理程序,当程序中出现错误时执行这一部分[可选]
END; --主体程序结束
例如:
DECLARE
v_fname VARCHAR2(10);
BEGIN
SELECT first_name INTO v_fname FROM employees
WHERE employee_id=109;
DBMS_OUTPUT.PUT_LINE(v_fname);
EXCEPTION
WHEN NO_DATA_FOUND THEN
DBMS_OUTPUT.PUT_LINE('There is not such an employee');
END;
/*
若要在SQL*Plus环境中看到DBMS_OUTPUT.PUT_LINE方法的输出结果,必须将环境变量SERVEROUTPUT设置为ON。
SET SERVEROUTPUT ON
*/
分类
匿名块:匿名块是指动态生成,只能执行一次的块,不能由其他应用程序调用。
命名块:命名块是指一次编译可多次执行的PL/SQL程序,包括函数、存储过程、包、触发器等。它们编译后放在服务器中,由应用程序或系统在特定条件下调用执行。
数据类型
数字类型
存储整数或实数。包含NUMBER、PLS_INTEGER、BINARY_INTEGER
NUMBER
可存储整数或浮点数
NUMBER(P,S)是一种格式化的数字,其中P是精度,S是刻度范围。精度是数值中所有有效数字的个数,而刻度范围是小数点右边数字位的个数。精度和刻度范围都是可选的,但是如果指定了刻度范围,那么也必须指定精度。
PLS_INTEGER、BINARY_INTEGER
只存储整数
字符类型
存储字符串或字符数据。包括VARCHAR2、CHAR、LONG
日期类型
存储日期和时间信息。DATE
布尔类型
BOOLEAN
,控制程序流程。值可以是TRUE、FALSE、NULL
记录类型
类似于结构体,例如
TYPE Typ_ERR IS RECORD(
Err_No VARCHAR2(20),Err_Msg VARCHAR2(1000)
);
%TYPE与%ROWTYPE
如果要定义一个类型与某个变量的数据类型或数据库表中某个列的数据类型一致(不知道该变量或列的数据类型)的变量,可以利用%TYPE来实现。
如果要定义一个与数据库中某个表结构一致的记录类型的变量,可以使用%ROWTYPE来实现。
变量的类型随参照的变量类型、数据库表列类型、表结构的变化而变化;
例如
DECLARE
v_sal employees.salary%TYPE;
v_emp employees%ROWTYPE;
BEGIN
SELECT salary INTO v_sal FROM employees
WHERE employee_id=109;
SELECT * INTO v_emp FROM employees
WHERE employee_id=150;
DBMS_OUTPUT.PUT_LINE(v_sal);
DBMS_OUTPUT.PUT_LINE(v_emp.first_name||
v_emp.salary);
END;
变量与常量
变量命名规范
- 字符串:V_
- 日期:D_
- 数值:N_
- 表:T_
- 布尔:B
- 游标:CUR_
- 记录类型:R_
定义格式
variable_name [CONSTANT] datatype [NOT NULL] [DEFAULT|:=expression];
说明:
每行只能定义一个变量;
如果加上关键字CONSTANT,则表示所定义的是一个常量,必须为它赋初值;
如果定义变量时使用了NOT NULL关键字,则必须为变量赋初值;
如果变量没有赋初值,则默认为NULL;
使用DEFAULT或“:=”运算符为变量初始化。
例如:
DECLARE
v1 NUMBER(4);
v2 NUMBER(4) NOT NULL :=10;
v3 CONSTANT NUMBER(4) DEFAULT 100;
BEGIN
IF v1 IS NULL THEN
DBMS_OUTPUT.PUT_LINE('V1 IS NULL! ');
END IF;
DBMS_OUTPUT.PUT_LINE(v2||' '||v3);
END;
作用域
变量的作用域是指变量的有效作用范围,从变量声明开始,直到块结束。
如果PL/SQL块相互嵌套,则在内部块中声明的变量是局部的,只能在内部块中引用,而在外部块中声明的变量是全局的,既可以在外部块中引用,也可以在内部块中引用。
如果内部块与外部块中定义了同名变量,则在内部块中引用外部块的全局变量时需要使用外部块名进行标识。
控制结构
IF语句
语法
IF condition1 THEN statements1;
[ELSIF condition2 THEN statements2;]
……
[ELSE else_statements];
END IF;
/*条件是一个布尔型变量或表达式,取值只能是TRUE,FALSE,NULL。*/
例如:输入一个员工号,修改该员工的工资,如果该员工为10号部门,则工资增加100;若为20号部门,则工资增加150;若为30号部门,则工资增加200;否则增加300。
DECLARE
v_deptno employees.department_id%type;
v_increment NUMBER(4);
v_empno employees.employee_id%type;
BEGIN
v_empno:=&x;
SELECT department_id INTO v_deptno
FROM employees WHERE employee_id=v_empno;
IF v_deptno=10 THEN v_increment:=100;
ELSIF v_deptno=20 THEN v_increment:=150;
ELSIF v_deptno=30 THEN v_increment:=200;
ELSE v_increment:=300;
END IF;
UPDATE employees SET salary=salary+v_increment
WHERE employee_id=v_empno;
END;