Use_of_Procedure

Mac安装使用Mysql教程(从零开始)

第十章 使用存储过程

10.1 存储过程简介

       存储过程就是为以后使用而保存的一条 或多条 SQL 语句。可将其视为批文件,虽然它们的作用不仅限于批处理。
       不同数据库中的存储过程使用方式差别很大,且支持度也不太相同。Access和SQLite不支持存储过程,且MySQL 5之后才支持存储过程。要了解各数据库中存储过程的使用方式需看相关参考文档,本文着重对MySQL中的存储过程进行介绍。

10.2 存储过程优缺点

  • 通过把处理封装在一个易用的单元中,可以简化复杂的操作(如前面 例子所述)。

  • 由于不要求反复建立一系列处理步骤,因而保证了数据的一致性。如 果所有开发人员和应用程序都使用同一存储过程,则所使用的代码都是相同的。这一点的延伸就是防止错误。需要执行的步骤越多,出错的可能性就越大。防止错误保证了数据的一致性。

  • 简化对变动的管理。如果表名、列名或业务逻辑(或别的内容)有变化,那么只需要更改存储过程的代码。使用它的人员甚至不需要知道这些变化。这一点的延伸就是安全性。通过存储过程限制对基础数据的访问,减少了数据讹误(无意识的或别的原因所导致的数据讹误)的机会。

  • 因为存储过程通常以编译过的形式存储,所以 DBMS 处理命令所需的 工作量少,提高了性能。

  • 存在一些只能用在单个请求中的 SQL 元素和特性,存储过程可以使用 它们来编写功能更强更灵活的代码。
           简而言之,存储过程具有简单,安全,高效的优点。但SQL代码的存储过程依然存在如下两个缺陷:

  • 不同 DBMS 中的存储过程语法有所不同。事实上,编写真正的可移植 存储过程几乎是不可能的。不过,存储过程的自我调用(名字以及数 据如何传递)可以相对保持可移植。因此,如果需要移植到别的 DBMS, 至少客户端应用代码不需要变动。

  • 一般来说,编写存储过程比编写基本 SQL 语句复杂,需要更高的技能, 更丰富的经验。因此,许多数据库管理员把限制存储过程的创建作为 安全措施(主要受上一条缺陷的影响)。受DBMS限制,即使不可以编写自己的存储过程,但可以使用别的存储过程。

       文中提到的优点也可以解释为什么要使用存储过程。

10.3 执行存储过程

       尽管不同DBMS执行存储过程的具体语法有所不同,但结构大体相同,可总结为如下形式:

声明(var,DECLARE)参数;
执行(EXE或EXECUTE) OUT参数=存储过程名(‘IN参数’/:OUT参数);
SELECT 参数(检索输出存储过程中的数据);

       以下通过一个具体例子介绍Oracle,SQL Server,MySQL三种数据库执行存储过程的具体操作。其中RetrunValue是从存储过程返回的值,在创建存储过程时用OUT标示。其中MySQL的命令是在终端输入并验证成功,其它的命令参考自SQL必知必会-中文-第4版,未经亲自验证。
Oracle

var ReturnValue NUMBER
EXEC MailingListCount(:ReturnValue);
SELECT ReturnValue;

SQL Server

DECLARE @ReturnValue INT
EXECUTE @ReturnValue=MailingListCount;
SELECT @ReturnValue;

MySQL

mysql> CALL MailingListCount(@ReturnValue);
mysql> SELECT @ReturnValue;

10.4 创建存储过程

       还是通过具体例子分别介绍三种数据库创建存储过程的具体方式。其中MySQL的命令依然是在终端中执行并且经过亲自验证正确。其它的命令均摘抄自书本SQL必知必会-中文-第4版,我还未亲自实践检验过。
Oracle

CREATE PROCEDURE MailingListCount (
 ListCount OUT INTEGER
)
IS
v_rows INTEGER;
BEGIN
    SELECT COUNT(*) INTO v_rows
    FROM Customers
    WHERE NOT cust_email IS NULL;
    ListCount := v_rows;
END;

SQL Server

CREATE PROCEDURE MailingListCount
AS
DECLARE @cnt INTEGER
SELECT @cnt = COUNT(*)
FROM Customers
WHERE NOT cust_email IS NULL;
RETURN @cnt;

MySQL

mysql> DELIMITER //
mysql> CREATE PROCEDURE MailingListCount (OUT v_rows INT)
          BEGIN
          SELECT COUNT(*) INTO v_rows
          FROM Customers
          WHERE NOT cust_email IS NULL;
          END//
mysql> DELIMITER ;
mysql> CALL MailingListCount(@v_rows);
mysql> SELECT @v_rows;

关于MySQL创建存储过程的详细讲解请参见MySQL创建存储过程

10.5 参考

[1] Ben Forta.SQL必知必会-中文-第4版
[2] .MySQL 8.0参考手册(pdf)
[3] .MySQL 8.0参考手册(web)
[4] 风亡小窝.mysql存储过程详细教程
[5] 量变决定质变.MySQL调用存储过程

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
void ADC_Activate(void) { __IO uint32_t wait_loop_index = 0U; #if (USE_TIMEOUT == 1) uint32_t Timeout = 0U; /* Variable used for timeout management / #endif / USE_TIMEOUT / /## Operation on ADC hierarchical scope: ADC instance #####################/ / Note: Hardware constraint (refer to description of the functions / / below): / / On this STM32 series, setting of these features is conditioned to / / ADC state: / / ADC must be disabled. / / Note: In this example, all these checks are not necessary but are / / implemented anyway to show the best practice usages / / corresponding to reference manual procedure. / / Software can be optimized by removing some of these checks, if / / they are not relevant considering previous settings and actions / / in user application. / if (LL_ADC_IsEnabled(ADC1) == 0) { / Run ADC self calibration / LL_ADC_StartCalibration(ADC1, LL_ADC_CALIB_OFFSET); / Poll for ADC effectively calibrated / #if (USE_TIMEOUT == 1) Timeout = ADC_CALIBRATION_TIMEOUT_MS; #endif / USE_TIMEOUT / while (LL_ADC_IsCalibrationOnGoing(ADC1) != 0) { #if (USE_TIMEOUT == 1) / Check Systick counter flag to decrement the time-out value / if (LL_SYSTICK_IsActiveCounterFlag()) { if(Timeout-- == 0) { / Error: Time-out / Error_Handler(); } } #endif / USE_TIMEOUT / } / Delay between ADC end of calibration and ADC enable. / / Note: Variable divided by 2 to compensate partially / / CPU processing cycles (depends on compilation optimization). / wait_loop_index = (ADC_DELAY_CALIB_ENABLE_CPU_CYCLES >> 1); while(wait_loop_index != 0) { wait_loop_index--; } / Enable ADC / LL_ADC_Enable(ADC1); / Poll for ADC ready to convert / #if (USE_TIMEOUT == 1) Timeout = ADC_ENABLE_TIMEOUT_MS; #endif / USE_TIMEOUT / while (LL_ADC_IsActiveFlag_ADRDY(ADC1) == 0) { #if (USE_TIMEOUT == 1) / Check Systick counter flag to decrement the time-out value / if (LL_SYSTICK_IsActiveCounterFlag()) { if(Timeout-- == 0) { / Error: Time-out / Error_Handler(); } } #endif / USE_TIMEOUT / } / Note: ADC flag ADRDY is not cleared here to be able to check ADC / / status afterwards. / / This flag should be cleared at ADC Deactivation, before a new / / ADC activation, using function "LL_ADC_ClearFlag_ADRDY()". */ }请逐行解释代码
06-09
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值