我们通常使用PL/SQL语言来建立存储过程,
其中PL/SQL集合了
P1.SQL的数据操作能力
P2.过程化语言的流程控制能力
————————————————————————定义————————————————————————
PL/SQL的基本结构是块,每个块可以互相嵌套,每个块可以完成一个逻辑操作。
1.PL/SQL定义变量的语法形式:
变量名 数据结构 [ [NOT NULL] : = 初值表达式 ] or
变量名 数据结构 [ [NOT NULL] 初值表达式 ]
2.常量定义的语法形式
常量名 数据结构 CONSTANT : = 常量表达式
常量必须赋值,并且不能改变,如果试图修改则会返回异常。
3.赋值语句
变量名称 : 表达式
4.PL/SQL块的基本结构
定义部分 DECLARE 定义的变量常量等只能在该基本块中使用
————变量常量游标异常等 当基本块执行结束,则定义不再存在
执行部分 BEGIN
----------SQL语句 PL/SQL的流程控制语句
EXCEPTION 遇到不能继续执行的情况称为异常
----------异常处理部分 遇到异常时,需要采取措施来纠正错误或者报告错误
END
————————————————————————控制结构————————————————————————
5.条件控制语句
一般有三种形式的条件控制语句 IF-THEN,IF-THEN-ELSE和嵌套的IF语句
(1)IF condition THEN
sequence_of_statements
ENDIF
(2)IF condition THEN
sequence_of_statements1
ELSE
sequence_of_statements2
END IF
(3)IF condition THEN
IF ~
END IF
6.循环控制语句
三种:LOOP ,WHILE-LOOP 和 FOR-LOOP
(1)LOOP:
LOOP
sequence_of_statements
END LOOP
多数数据库服务器的PL/SQL提供EXIT,BREAK,LEAVE来结束循环
(2)WHILE_LOOP
WHILE condition LOOP
Sequence_of_statements
END LOOP
(3)FOR-LOOP
FOR count IN [ REVERSE ] bound1 ... bound2 LOOP
Sequence_of_statements
END LOOP
FOR循环的执行过程:将count设置为循环的下界bound1,检查它是否小于上界bound2.当指定REVERSE时将count设置为循环的上界bound2,检查count是否大于下界bound1,增减步长为1
————————————————————————存储过程————————————————————————
PL/SQL块主要有2个类型,命名块和匿名块。
匿名块每次执行都要编译,不能被存储于数据库中,也不能被其他PL/SQL块调用。
命名块包含存储过程和函数,被编译后保存于数据库中,可以被反复调用
存储过程是指:由PL/SQL语句书写的过程(与对象对应)
优点:存储过程运行效率高,不像解释执行的SQL语句在提出请求时才进行语法分析和优化工作。
存储过程降低了客户机与服务器之间的通信量。
存储过程方便实施企业规划。需要修改时只要修改存储过程,无需修改其他应用程序。
——————————————————————用户创建存储过程————————————————————————
1.创建存储过程
CREATE Procedure 过程名 ( [ 参数1,参数2,...])//存储过程首部
AS
< PL/SQL 块>; //存储过程体,描述该存储过程的操作
过程名:数据库服务器合法的对象标识
参数列表:用名字来表示调用时给出的参数值,必须制定值得数据类型。存储结构的参数也可定义输入参数、输出参数或输入/输出参数。默认输入
过程体:一个< PL/SQL 块>。包括声明部分和可执行语句部分。
示例:从一个账户转指定数额的款项到另一个账户中
CREATE PROCEDURE TRANSFER(inAccount INT,outAccount INT, amount FLOAT)
AS DECLEAR
totalDeposit FLOAT; //变量
BEGIN /*检查转出账户的余额*/
SELECT total INTO totalDeposit FROM ACCOUNT WHERE ACCOUNTNUM = outAccount
/*SELECT INTO 语句从一个表中选取数据,然后把数据插入另一个表中
SELECT INTO 语句常用于创建表的备份复件或者用于对记录进行存档。*/
IF totalDeposit IS NULL THEN /*账户不存在或账户中没有存款*/
ROLLBACK;
RETURN;
END IF;
IF totalDeposit < amount THEN/*账户存款不足*/
ROLLBACK;
RETURN;
END IF;
UPDATE account SET total = total - amount WHERE ACCOUNTNUM = outAccount;/*修改转出账户,减去转出额*/
UPDATE account SET total = total + amount WHERE ACCOUNTNUM = inAccount;/*修改转入账户,增加转入额*/
COMMIT;
END;
重命名存储过程
ALTER Procedure 过程名 1 RENAME TO 过程2;
执行存储过程
CALL/PERFORM Procedure 过程名 ([参数1,参数2,...]);
示例:
CALL Procedure TRANSFER(01003815868,01003813828,10000)
删除存储过程
DROP Procedure 过程名();