数据库学习日记x

存储过程--Stored  Procedural

我们通常使用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 过程名();

你可能感兴趣的:(数据库学习)