PL/SQL
-
PL/SQL 是对 SQL 语言存储过程语言的扩展
-
它现在已经成为 一种过程处理语言,简称 PL/SQL。
-
(有些类似普通编程语言与sql的结合)
PL/SQL 块
- PL/SQL 程序由三个块组成,即声明部分、执行部分、异常处理部分
DECLARE
/* 声明部分: 在此声明 PL/SQL 用到的变量,类型及游标,以及局部的存储过程和函数 */
BEGIN
/* 执行部分: 过程及 SQL 语句 , 即程序的主要部分 */
EXCEPTION
/* 执行异常部分: 错误处理 */
END;
PL/SQL 块可以分为三类:
- 无名块:动态构造,只能执行一次。
- 子程序:存储在数据库中的存储过程、函数及包等。当在数据库上建立好后可以在其它程序中调用它们
- 触发器:当数据库发生操作时,会触发一些事件,从而自动执行相应的程序。
例子:
declare
type test_rec is record(
l_name varchar2(30),
d_id number(4) ),
V_emp test_rec;
begin
vemp.l_name:=Tom:
vemp.d_id:=1234;
select last_name,department_id
into v_emp
from employees
where employee_id=200;
dbms_output.put_line(v emp.l_name ||','|| v emp.d_id):
end;
- plsql内的变量类型,大多数与数据库列的数据类型一样。
-
plsql内的赋值号为
:=
-
程序中
type test_rec is record(……)
是记录类型, 记录类型是把逻辑相关的数据作为一个单元存储起来,称作 PL/SQLRECORD
的域(FIELD
),其作用是存放互不相同但逻辑相关的信息。 -
定义记录类型语法如下:
TYPE record_type IS RECORD(
Field1 type1 [NOT NULL] [:= exp1 ],
Field2 type2 [NOT NULL] [:= exp2 ],
. . . . . .
Fieldn typen [NOT NULL] [:= expn ] ) ;
-
对于
select …… into v_emp……
可以用SELECT
语句对记录变量进行赋值,只要保证记录字段与查询结果列表中的字段相配即可。 -
DBMS_OUTPUT.PUT_LINE
过程的功能类似于 Java 中的System.out.println()
直接将输出结果送到 标准输出中.- 在使用上述过程之前必须将
SQL * PLUS
的环境参数SERVEROUTPUT
设置为ON
, 否则将看不 到输出结果:set serveroutput on
- 在使用上述过程之前必须将
使用%TYPE
对于上面例子中记录类型内,除了明确写清是哪个类型,还可以通过%type
来写
例如
declare
type test_rec is record (
l_name employees.last_name%type,
d_id employees.department_id%type );
V_emp test_rec;
begin
end;
使用%TYPE 特性的优点在于:
-
所引用的数据库列的数据类型可以不必知道;
-
所引用的数据库列的数据类型可以实时改变。
使用%ROWTYPE
PL/SQL 提供%ROWTYPE
操作符, 返回一个记录类型, 其数据类型和数据库表的数据结构相一致。
例如:
declare
v_emp empoyees%rowtype;
使用%ROWTYPE
特性的优点在于:
- 所引用的数据库中列的个数和数据类型可以不必知道;
- 所引用的数据库中列的个数和数据类型可以实时改变。
标识符
PL/SQL 程序设计中的标识符定义与 SQL 的标识符定义的要求相同。
要求和限制有:
- 标识符名不能超过 30 字符;
- 第一个字符必须为字母;
- 不分大小写;
- 不能用’-‘(减号);
- 不能是 SQL 保留字。
- 提示: 一般不要把变量名声明与表中字段名完全一样,如果这样可能得到不正确的结果
练习
1
- 创建函数,输入参数n, 计算1!+2!+ 3!+ …+ n! 的值。
预备知识
* plsql的函数创建语法
CREATE [OR REPLACE] FUNCTION function_name
[ (argment [ { IN | IN OUT }] Type,
argment [ { IN | OUT | IN OUT } ] Type ]
[ AUTHID DEFINER | CURRENT_USER ]
RETURN return_type
{ IS | AS }
<类型.变量的说明>
BEGIN
FUNCTION_body
EXCEPTION&l