• 猎八哥浅谈存储过程——数据库中的双刃剑


     

    存储过程是指:为完成特定任务的一条或多条MYSQL语句的集合。

    猎八哥原创,本文原址链接:http://www.cnblogs.com/liebagefly/p/7521974.html 

    存储过程的优势:

    1.执行速度快。存储过程只编译一次,以后每次执行都不需要重新编译,而sql语句每次执行都需要编译一次,所以存储过程的执行速度快。(当然第一次的速度并不比sql语句快)。

    2.减少数据库开发人员的工作量,存储过程可以多次使用。

    3.安全性好,可以设置某些用户才具有对指定存储过程的使用权,存储过程的参数化可以防止SQL注入攻击。

    4.可封装性,使复杂的操作简单化,调用存储过程的时候不需要传递过多的SQL语句,只需要传递名称以及参数即可。

    5.减少网络流量。调用存储过程的时候不需要传递过多的SQL语句,只需要传递名称以及参数(当然有的存储过程没有参数就无需传递参数了,但是注意调用存储过程一定要记得加()括号)就可以了,因此降低了网络传输的数据量。

     缺点:1.存储过程可移植性差,不同数据库的存储过程的语法差别较大。(但是我感觉谁会没事乱该数据库呀!今天你用mysql,明天你用oracle,如果更改数据库意味着项目有着重大变动,要更改众多的东西,所以这点存储过程的更改算不了什么)

    2.维护困难,当需求变化或者项目需要扩展时会导致修改较为麻烦。(这个就比较坑了,各种更改的确麻烦)。

    总之存储过程是把双刃剑,具体用或不用要具体问题具体分析。下面看一些存储过程的常用方法和语句。

    存储过程常用语句
    
    展示所有存储过程:show procedure status;
    
    展示存储过程的创建语句:show create procedure procedurename;
    
    删除存储过程:DROP  PROCEDURE  procedurename ;
    

      

    存储过程关键字介绍:
    in为传递给存储过程(默认不写),out从存储过程传出,inout从存储过程传入或传出,into对变量进行赋值
    

    学生表的建表语句。

    存储过程特点:A.调用存储过程,可以显示结果,也可以不显示结果。

    B.每个表中的存储过程不能修改,不能覆盖;也不能出现类似java语言的重载(即:不能建立参数个数不同但存储过程名字相同的存储过:)。

    (1)不显示结果类型的。

    学生表
    CREATE TABLE `student` (
      `id` int(11) NOT NULL,
      `name` varchar(255) DEFAULT NULL,
      `zongfen` int(255) DEFAULT NULL,
      PRIMARY KEY (`id`)
    ) ENGINE=MyISAM DEFAULT CHARSET=gbk

    创建存储过程,out表示相应的参数用来从存储过程传出一个值,into表示给p1等赋值
    1.创建存储过程 create procedure zongfenmma( out p1 DECIMAL(8,2), out ph DECIMAL(8,2), out pa DECIMAL(8,2) ) begin select MIN(zongfen) into p1 from student; select MAX(zongfen) into ph from student; select AVG(zongfen) into pa from student; end; 2.调用存储过程,调用此存储过程不显示结果,它返回以后可以显示(或者处理中需要使用)的变量(@zongfenmin)。 call zongfenmma( @zongfenmin,@zongfenmax,@zongfenavg ); 3.显示变量的值即最小、最大、平均值。 select @zongfenmin,@zongfenmax,@zongfenavg;

                        

    (2)显示结果类型的。

    1.创建存储过程;注意注意:创建存储过程必须要有括号(),即使无参数也要添加。
    create procedure zongfenmax()
    begin 
        select MAX(zongfen) as zfmax from student;
    end;
    
    2.调用存储过程,并返回结果。 call zongfenmax();

    (3)案例:创建一个存储过程,获取学生的名字,不过成绩及格的学生要名字大写。

    思路:获取学生名字,如果成绩及格将名字大写,返回名字。话不多说,直接上代码。

    create procedure cjavg(
        in oid int,
        in pass boolean,
        out oname VARCHAR(50)
    )
    begin
        DECLARE name1 VARCHAR(50);
        SELECT name from student where id = oid into name1;
        IF pass THEN
    	SELECT upper(name1) into name1;
        END IF;
       SELECT name1 into oname;
    end;
    
    在过程begin和end中定义一个变量name1,获取学生姓名并传给name1,
    判断是否及格,如果成绩及格,名字大写,选择名字传给oname,
    
    call cjavg(1,1,@name);
    调用村纯过程,注意,第一个1是int型,是oid,第二个是boolean型,
    1表示成绩及格,0表示不及格
    
    显示名字
    SELECT @name;
    

      

    删除存储过程:drop procedure zongfenmax;注意删除存储过程时不要加()。

  • 相关阅读:
    redis的发布订阅模式pubsub
    django集成celery之callback方式link_error和on_failure
    linux命令和awk
    使用beanstalkd实现定制化持续集成过程中pipeline
    JavaScript实现模糊推荐的input框(类似百度搜索框)
    hadoop streaming编程小demo(python版)
    一个scrapy框架的爬虫(爬取京东图书)
    mongodb生产环境(副本集模式)集群搭建配置
    TensorFlow加载图片的方法
    STC15W408AS简单使用教程-简单的光强检测!
  • 原文地址:https://www.cnblogs.com/liebagefly/p/7521974.html
Copyright © 2020-2023  润新知