PL/SQL编制程序_存款和储蓄程序

  可执行部分

(4)显示存储过程

SHOW CREATE {PROCEDURE} sp_name

似于 SHOW CREATE
TABLE,它返回一个可用来重新创建已命名子程序的确切字符串。

存储程序在创建时经过了编译优化,被存放在数据库中,任何用户只要有适当的权限,就可以调用它。
而且在调用时无需再进行编译,因此能以很快的速度执行。
与匿名块相比,存储程序是作为数据库对象存储在数据库中的,因此,首先要在数据库中创建存储程序。

(2)修改存储过程

ALTER {PROCEDURE} sp_name [characteristic …]

说明:

✓ 这个语句可以被用来改变一个存储程序的特征。必须用 ALTER ROUTINE 权限

才可用此子程序。这个权限被自动授予子程序的创建者。

✓ 在 ALTER PROCEDURE 语句中,可以指定超过一个的改变。

EXCEPTION

(7)存储过程的变量:

声明变量:DECLARE var_name[,…] type [DEFAULT value]

变量赋值,SET 语句: SET var_name = expr [, var_name = expr] …

变量赋值,SELECT … INTO 语句 SELECT col_name[,…] INTO
var_name[,…] table_expr

  异常处理部分

(9)存储过程的注释语法

mysql 存储过程可使用两种风格的注释

➢ 双模杠:–,该风格一般用于单行注释

➢ c 风格:/* 注释内容 */, 一般用于多行注释

这个选项有两个可选值,即CURRENT_USERDEFINER
,二者只能选择其中一个。
过程的执行者和创建者可能不是同一个用户,如果使用CURRENT_USER创建存储过程,那么在调用时,该过程以当前登录用户的身份执行。
为此,过程的创建者必须授予当前用户执行该过程的权限。

(10)存储过程的条件和异常处理程序

DECLARE handler_type HANDLER FOR condition_value[,…]

sp_statement

handler_type:

CONTINUE | EXIT | UNDO

condition_value:

SQLSTATE [VALUE] sqlstate_value | condition_name |

SQLWARNING | NOT FOUND | SQLEXCEPTION

这个语句指定每个可以处理一个或多个条件的处理程序。如果产生一个或多个条件,

指定的语句被执行。

对一个 CONTINUE
处理程序,当前子程序的执行在执行处理程序语句之后继续。对

于 EXIT 处理程序,当前 BEGIN…END 复合语句的执行被终止。UNDO 处理程序

类型语句还不被支持。

SQLWARNING 是对所有以 01 开头的 SQLSTATE 代码的速记。

NOT FOUND 是对所有以 02 开头的 SQLSTATE 代码的速记。

SQLEXCEPTION 是对所有没有被 SQLWARNING 或 NOT FOUND 捕获的 SQLSTATE

代码的速记。

AS

Mysql学习笔记(八)

BEGIN

(3)删除存储过程

DROP {PROCEDURE | FUNCTION} [IF EXISTS] sp_name

不能在一个存储过程中删除另一个存储过程,只能调用另一个存储过程

AUTHID CURRENT_USER | DEFINER

(8)存储过程的语句

BEGIN…END 复合语句 [begin_label:] BEGIN [statement_list] END
[end_label] 存储子程序可以使用 BEGIN … END
复合语句来包含多个语句。statement_list 代表一个或多个语句的
列表。statement_list 之内每个语句都必须用分号(;)来结尾。
复合语句可以被标记。除非 begin_label 存在,否则 end_label
不能被给出,并且如果二者都存在,他们必须是同样的。

END;

(5)显示存储过程特征

SHOW {PROCEDURE} STATUS [LIKE ‘pattern’]

它返回子程序的特征,如数据库,名字,类型,创建者及创建和修改日期。

存储程序的调用可以在SQL语句中、应用程序中、SQL*plus
中以及其他PL/SQL块中进行。

在第一次被调用时,存储程序的代码被装载到系统全局区的共享池中,以后再次调用时直接从共享池中取出代码即可执行。
存储程序与前面介绍的子程序的区别在于子程序是完成某个特定功能的程序段,它本身并不能单烛执行,只能作为一个模块,在一个PL/SQL块内部被调用执行。
而存储程序是一个可单独执行的程序,它可以包含多个子程序,可以在SQL语句中、应用程序中、SQL*plus
中以及其他PL/SQL块中被调用执行。
存储程序的形式包括:存储过程、存储函数、触发器和程序包等。

存储过程(Stored Procedure)

(1)是一组为了完成特定功能的 SQL语句集,是利用 SQL Server 所提供的
Transact-SQL
语言所编写的程序。经编译后存储在数据库中。存储过程是数据库中的一个重要对象,用户通过指定存储过程的名字并给出参数(如果该存储过程带有参数)来执行它。存储过程是由
流控制和 SQL
语句书写的过程,这个过程经编译和优化后存储在数据库服务器中,存储过程可由应用程序通过一个调用来执行,而且允许用户声明变量
。同时,存储过程可以接收和输出参数、返回执行存储过程的状态值,也可以嵌套调用。

(2) 存储过程的优点:


存储过程只在创造时进行编译,以后每次执行存储过程都不需再重新编译,而一
般 SQL 语句每执行一次就编译一次,所以使用存储过程可提高数据库执行速度。

➢ 当对数据库进行复杂操作时(如对多个表进行
Update、Insert、Query、Delete 时),
可将此复杂操作用存储过程封装起来与数据库提供的事务处理结合一起使用。

➢ 存储过程可以重复使用,可减少数据库开发人员的工作量。

➢ 安全性高,可设定只有某此用户才具有对指定存储过程的使用权。

这里不再详细描述。存储过程的声明部分开始于关键宇AS ,结束于关键字BEGIN
,而
且不需要使用关键字DECLARE 。
存储过程的可执行部分是它的主要部分,它可以包含SQL语句和流控制语句,是存储过程
功能的集中体现。异常处理部分用来处理存储过程在执行过程中可能出现的错误。例如,下面
的代码用来创建存储过程total_income
,它的功能是计算某部门员工的总收入。这个过程有一
个参数,代表部门编号,并指定了默认值。这样,在调用时,如果提供了参数,则计算指定部
门的数据,否则将计算所有员工的数据。

(1)创建存储过程

CREATE [DEFINER = { user | CURRENT_USER }] PROCEDURE sp_name
([proc_parameter[,…]]) [characteristic …] routine_body

说明:

✓ DEFINER:指明使用存储过程的访问权限。

✓ sp_name: 存储过程名称。

✓ proc_parameter: [ IN | OUT | INOUT ] param_name type

        ☆ in:表示向存储过程中传入参数;存储过程默认为传入参数,所以参数
in 可以省略;

        ☆ out:表示向外传出参数;

        ☆
inout:表示定义的参数可传入存储过程,并可以被存储过程修改后传出存储过程;

        ☆ param_name:参数名;

        ☆ type:参数的类型,可以为 mysql 任何合法得数据类型。

        ☆ 如果有多个参数,参数之间可以用逗号进行分割。

✓ Characteristic: LANGUAGE SQL | [NOT] DETERMINISTIC | { CONTAINS
SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA } | SQL SECURITY {
DEFINER | INVOKER } | COMMENT ‘string’

        ☆ 这个 LANGUAGE SQL
子句是没有作用的。仅仅是为了说明下面过程的主体 使用 SQL
语言编写。这条是系统默认的。

        ☆
如果程序或线程总是对同样的输入参数产生同样的结果,则被认为它是“确定 的
” ( DETERMINISTIC ), 否 则 就 是 “ 非 确 定 ” 的 。 默 认 的 就 是
NOT DETERMINISTIC。         ☆ CONTAINS SQL
表示子程序不包含读或写数据的语句。

        ☆ NO SQL 表示子程序不包含 SQL 语句。

        ☆ READS SQL DATA
表示子程序包含读数据的语句,但不包含写数据的语句。

        ☆ MODIFIES SQL DATA
表示子程序包含写数据的语句。如果这些特征没有明 确给定,默认的是
CONTAINS SQL。

        ☆ SQL SECURITY
特征可以用来指定子程序该用创建子程序者的许可来执行,
还是使用调用者的许可来执行。默认值是 DEFINER。

        ☆ COMMENT 子句是一个 MySQL
的扩展,它可以被用来描述存储程序。这个 信息被 SHOW CREATE PROCEDURE 和
SHOW CREATE FUNCTION 语句来 显示。存储子程序不能使用 LOAD DATA
INFILE。

        ☆ 特 征 子 句 也 有 默 认 值 , 如 果 省 略 了 就 相 当 于 :
LANGUAGE SQL NOT DETERMINISTIC SQL SECURITY DEFINER COMMENT ”

✓ routine_body: 包含合法的 SQL 过程语句。可以使用复合语句语法, 复合语
句可以包含声明,循环和其它控制结构语句。

其中OR
REPLACE选项的作用是当同名的存储过程存在时,首先将其删除,再创建新的存储过程。
当然,条件是当前用户具有删除原存储过程的权限。

(6)调用存储过程

CALL sp_name([parameter[,…]])

调用一个先前用 CREATE PROCEDURE 创建的程序。

CALL 语句可以用声明为 OUT 或的 INOUT
参数的参数给它的调用者传回值。它也“返回”

受影响的行数,客户端程序可以在 SQL 级别通过调用
ROW_COUNT()函数获得这个数,从

C 中是调用 the mysql_affected_rows() C API 函数来获得。

发表评论

电子邮件地址不会被公开。 必填项已用*标注