`
hudeyong926
  • 浏览: 2032725 次
  • 来自: 武汉
社区版块
存档分类
最新评论

mysql 5.0存储过程学习总结

阅读更多
以下功能主要供学习。高并发场景不要使用mysql特性(触发器,存储过程,外键,自定义函数等)使用会降低系统的并发性,数据库升级困难,迁移困难诸多问题。

存储过程
缺点:
1、可移植性是存储过程和触发器最大的缺点。
2、占用服务器端太多的资源,对服务器造成很大的压力。
3、不能做DDL。
4、触发器排错困难,而且数据容易造成不一致,后期维护不方便。
优点:
1、预编译,已优化,效率较高。避免了SQL语句在网络传输然后再解释的低效率。
2、存储过程可以重复使用,减少开发人员的工作量。
3、业务逻辑封装性好,修改方便。数据库的优化好处理,如果发现速度慢了,可以很容易在数据库层面找到究竟是那个存储过程的第几行的那个sql写的不够好,我们可以对其优化,提高效率
4、安全。不会有SQL语句注入问题存在。

5.学习成本,存储过程掌握起来,简单容易单一;但是如果通过各种前台语言就麻烦了,有的项目用java,c#,,有用php...;而且还有那么多框架;项目实施到一半,经常换人;以后维护,也换人;存储过程人人都会;复杂的逻辑在存储过程里实现维护成本低

 

1,使用非SELECT语句
UPDATE/INSERT/SET、DDL、DML等非查询语句可以随意在存储程序里执行

 2,使用INTO
如果SELECT语句只返回一行记录,则可以使用INTO语句来把结果存入一个变量 ,如果SELECT语句返回多行记录,则使用INTO会出现运行时错误

SELECT LAST_INSERT_ID() into _ticketid;

3,创建和使用Cursor
可以使用Cursor来处理SELECT语句返回多好记录时的场景, Cursor提供对查询结果集的访问,并且可以循环结果集的每一行,然后每行单独处理

DECLARE l_dept_id BIGINT;
DECLARE c_dept CURSOR FOR
    SELECT department_id FROM departments;

OPEN c_dept;
dept_cursor: LOOP
    FETCH c_dept INTO l_dept_id;
END LOOP dept_cursor;
CLOSE c_dept;

存在的第一个问题:变量声明必须在CURSOR声明之前
存在的第二个问题:上面的程序在FETCH结果集遇到最后一条之后会报错"no data to fetch" error (MySQL error 1329; SQLSTATE 02000)
为了避免第二个问题,我们需要声明一个HANDLER

DECLARE l_dept_id BIGINT;
DECLARE l_last_row_fetched INT;
DECLARE c_dept CURSOR FOR
    SELECT department_id FROM departments;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET l_last_row_fetched=1;

SET l_last_row_fetched=0;
OPEN c_dept;
dept_cursor: LOOP
    FETCH c_dept INTO l_dept_id;
    IF l_last_row_fetched=1 THEN
        LEAVE dept_cursor;
    END IF;
END LOOP dept_cursor;
CLOSE c_dept;
SET l_last_row_fetched=0;

 4,使用UNBOUNED SELECT语句返回数据给调用者
sp:

CREATE PROCEDCURE sp_get_all_users()
BEGIN
    SELECT user_name, age
        FROM users;
END;

5,使用Prepared Statements处理动态SQL
MySQL支持server-side prepared statements,PREPARE创建,EXECUTE执行,DEALLOCATE销毁:

mysql> PREPARE prod_insert_stmt FROM "INSERT INTO product_codes VALUES(?,?)";
Query OK, 0 rows affected (0.00 sec)
Statement prepared

mysql>
mysql> SET @code='QB';
Query OK, 0 rows affected (0.00 sec)

mysql> SET @name='MySQL Query Browser';
Query OK, 0 rows affected (0.00 sec)

mysql> EXECUTE prod_insert_stmt USING @code,@name;
Query OK, 1 row affected (0.00 sec)

mysql> SET @code='AD';
Query OK, 0 rows affected (0.00 sec)

mysql> SET @name='MySQL Administrator';
Query OK, 0 rows affected (0.02 sec)

mysql> EXECUTE prod_insert_stmt USING @code,@name;
Query OK, 1 row affected (0.00 sec)

mysql> DEALLOCATE PREPARE prod_insert_stmt;
Query OK, 0 rows affected (0.00 sec)

 这样一来就可以在sp里做一些手脚,让sp更flexible:

CREATE PROCEDURE set_col_value
    (in_table     VARCHAR(128),
     in_column    VARCHAR(128),
     in_new_value VARCHAR(1000),
     in_where     VARCHAR(4000))

BEGIN
    DECLARE l_sql VARCHAR(4000);
    SET l_slq=CONCAT_ws(' ',
                 'UPDATE', in_table,
                 'SET', in_column, '=', in_new_value,
                 'WHERE', in_where);
    SET @sql=l_sql;
    PREPARE s1 FROM @sql;
    EXECUTE s1;
    DEALLOCATE PREPARE s1;
END;

 6,声明HANDLER的语法

DECLARE {CONTINUE | EXIT} HANDLER FOR
    {SQLSTATE sqlstate_code | MySQL error code | condition_name}
    stored_program_statement

 

 

分享到:
评论

相关推荐

    mysql5.0存储过程学习总结资料.pdf

    MySQL 5.0 存储过程是数据库管理系统中一种强大的功能,它允许用户编写一系列的SQL语句并封装成一个可重用的程序单元。在本文中,我们将深入探讨存储过程的基本概念、创建、调用、删除以及一些关键特性。 **一、...

    MySQL 5.0存储过程 mysql5.0 mysql 用户手册 中文版

    MySQL 5.0存储过程 mysql5.0 mysql 用户手册 中文版 新特性

    MySQL5.0存储过程

    SQL语句需要先编译然后执行,而存储过程(Stored Procedure)是一组为了完成特定功能的SQL语句集,经编译后存储在数据库中,用户通过指定存储过程的名字并给定参数(如果该存储过程带有参数)来调用执行它。...

    MySQL5.0 存储过程教程 中文

    MySQL5.0 存储过程教程

    小题大做之MySQL 5.0存储过程编程入门(转)

    在《MySQL中文参考手册.chm》中,你可以找到关于MySQL 5.0存储过程的详细文档,包括语法、示例、以及如何调试和优化存储过程。通过深入学习这本手册,你将能够更好地掌握存储过程的各个方面,提升你在数据库开发和...

    MySQL 5.0存储过程

    MySQL 5.0存储过程是数据库管理中的一个重要概念,它是一种预编译的SQL语句...在MYSQL_GC这个压缩包中,可能包含的是关于MySQL 5.0存储过程的相关教程、示例代码或实践案例,可以帮助学习者进一步理解和应用这一技术。

    \MySQL 5.0 存储过程.pdf

    根据提供的文档信息,本文将深入解析《MySQL 5.0 存储过程》这一主题,重点探讨存储过程的概念、特点以及在 MySQL 5.0 中的应用。存储过程是数据库管理系统中一项重要的功能,它允许开发者编写可重用的 SQL 代码块,...

    MySQL 5.0 存储过程

    ### MySQL 5.0 存储过程核心知识点详解 #### 引言 随着数据库技术的发展,MySQL 5.0 版本引入了一系列重要的新特性,其中最值得关注的是**存储过程**的功能增强。这一功能不仅提高了数据库操作的灵活性,还极大地...

    jdbc调用mysql5.0的存储过程和方法

    CallableStatement 调用mysql5.0的存储过程和方法 配有创建存储过程和方法的源代码

    PowerDesigner16.5版本包含MySQL5.0模型的DBMS文件

    在本场景中,我们关注的是PowerDesigner16.5版本与MySQL5.0模型的相关性。通常,PowerDesigner会包含多种数据库管理系统的模型支持,以适应不同数据库平台的需求。然而,有些用户在使用PowerDesigner16.5时可能会...

    mysql5.0官方存储过程翻译

    本资料集合包含了对MySQL 5.0官方存储过程的详细翻译,旨在帮助学习者深入理解并熟练运用这一功能。 存储过程是一种预编译的SQL代码集合,可以在需要时多次调用,减少了网络流量,提高了性能,并且能够更好地控制...

Global site tag (gtag.js) - Google Analytics