精华内容
下载资源
问答
  • MySQL数据库存储过程讲解与实例

    万次阅读 多人点赞 2018-06-03 00:48:17
    SQL语句需要先编译然后执行,而存储过程(Stored Procedure)是一组为了完成特定功能的SQL语句集,经编译后存储在数据库中,用户通过指定存储过程的名字并给定参数(如果该存储过程带有参数)来调用执行它。...

    存储过程简介

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

        存储过程是可编程的函数,在数据库中创建并保存,可以由SQL语句和控制结构组成。当想要在不同的应用程序或平台上执行相同的函数,或者封装特定功能时,存储过程是非常有用的。数据库中的存储过程可以看做是对编程中面向对象方法的模拟,它允许控制数据的访问方式。

        存储过程的优点:

        (1).增强SQL语言的功能和灵活性:存储过程可以用控制语句编写,有很强的灵活性,可以完成复杂的判断和较复杂的运算。

        (2).标准组件式编程:存储过程被创建后,可以在程序中被多次调用,而不必重新编写该存储过程的SQL语句。而且数据库专业人员可以随时对存储过程进行修改,对应用程序源代码毫无影响。

        (3).较快的执行速度:如果某一操作包含大量的Transaction-SQL代码或分别被多次执行,那么存储过程要比批处理的执行速度快很多。因为存储过程是预编译的。在首次运行一个存储过程时查询,优化器对其进行分析优化,并且给出最终被存储在系统表中的执行计划。而批处理的Transaction-SQL语句在每次运行时都要进行编译和优化,速度相对要慢一些。

        (4).减少网络流量:针对同一个数据库对象的操作(如查询、修改),如果这一操作所涉及的Transaction-SQL语句被组织进存储过程,那么当在客户计算机上调用该存储过程时,网络中传送的只是该调用语句,从而大大减少网络流量并降低了网络负载。

        (5).作为一种安全机制来充分利用:通过对执行某一存储过程的权限进行限制,能够实现对相应的数据的访问权限的限制,避免了非授权用户对数据的访问,保证了数据的安全。

    MySQL的存储过程

        存储过程是数据库的一个重要的功能,MySQL 5.0以前并不支持存储过程,这使得MySQL在应用上大打折扣。好在MySQL 5.0开始支持存储过程,这样即可以大大提高数据库的处理速度,同时也可以提高数据库编程的灵活性。

    MySQL存储过程的创建

        语法

    CREATE PROCEDURE  过程名([[IN|OUT|INOUT] 参数名 数据类型[,[IN|OUT|INOUT] 参数名 数据类型…]]) [特性 ...] 过程体

    DELIMITER //
      CREATE PROCEDURE myproc(OUT s int)
        BEGIN
          SELECT COUNT(*) INTO s FROM students;
        END
        //
    DELIMITER ;
        分隔符

        MySQL默认以";"为分隔符,如果没有声明分割符,则编译器会把存储过程当成SQL语句进行处理,因此编译过程会报错,所以要事先用“DELIMITER //”声明当前段分隔符,让编译器把两个"//"之间的内容当做存储过程的代码,不会执行这些代码;“DELIMITER ;”的意为把分隔符还原。

        参数

        存储过程根据需要可能会有输入、输出、输入输出参数,如果有多个参数用","分割开。MySQL存储过程的参数用在存储过程的定义,共有三种参数类型,IN,OUT,INOUT:

    IN参数的值必须在调用存储过程时指定,在存储过程中修改该参数的值不能被返回,为默认值OUT:该值可在存储过程内部被改变,并可返回INOUT:调用时指定,并且可被改变和返回

        过程体

        过程体的开始与结束使用BEGIN与END进行标识。

    MySQL实例与讲解

    1. 创建一存储过程,求l+2+3+…+n,并打印结果

    先使用MySQL语句创建存储过程,再使用call语句调用这一存储过程查看结果,可以看到由于未输入n的值,sum结果为0。

    2.调用上面addresult存储过程,打印l十2+3+…+10的结果

    在第一题的addresult过程基础上,加上一条“set n=10”语句,设定n的值,调用该过程后打印结果,可以看到结果为sum=1+2+3+...+10=55。

     

    3. 修改上述存储过程addresult1,使得n为输入参数,其具体值由用户调用此存储过程时指定。

    在这里需要注意的是,MySQL存储过程只能改名字和定义,不能改里面的内容。要删了重新建。所以这里选择重新建立一个addresult1过程,调用后输入n,查看打印结果。

     

    4.上面修改后的addresult1存储过程,打印l+2+3+…+100的结果

    调用上述过程,输入参数n为100,可以看到打印结果中sum=5050,结果正确。


    5.
    修改上述存储过程addresult2n参数设定默认值为10,并改设sum为输出参数,让主程序能够接收计算结果。

    3中存储过程中的“in n int”修改为“out sum int”,并在存储过程中设定n默认值为10。

     

    6.调用上面修改后的addresult2存储过程,设置变量接收计算l+2+3+…+10的结果

    调用addresult2过程,可以看到输出结果sum=55。

     

    7.创建一存储过程Proc_Student,用于显示学号为“0102”的学生基本信息包括学号、姓名、性别和系

    创建存储过程,将查询语句写在存储过程中,相当于将一个查询语句封装在存储过程中,通过调用这个存储过程,便可执行该查询操作。

     

    8.创建一存储过程Stu_grade通过读取某门课的编号求出不及格的学生的学号

    同上一题,将查询过程封装在存储过程中,并且使用“int ID int”来实现课程编号的自定义输入,再根据输入的课程编号进行查询。

     

    9.调用上面的存储过程Stu_grade,求出课程编号为“0101”的不及格的学生

    调用存储过程Stu_grade,输入课程编号为“0101”,查看打印结果。

     

    10.创建一存储过程avgGrade,通过读取学生的学号以参数形式返回该学生的平均分

    在创建存储过程时,设定学号为输入,平均成绩为输出,且因为平均成绩可能出现小数,所以设定其数据类型为float。通过select语句将平均分以参数形式返回。

     

    11.调用上面的存储过程avgGrade,求出学号为“990102014”的平均分

    输入学号与输出参数,可以看到该学生的平均成绩被打印出来。

     

    12.删除上述存储过程avgGrade

    对于存储过程的删除,使用drop语句即可。

     

    13.创建存储过程search,该存储过程有三个参数,分别为t、p1,p2,根据这些参数,找出书名与t有关,价格在p1与p2(p2>=p1)之间的书的编号,书名,价格,出舨日期。如果用户调用时没有指定t参数的值.则表示可为任意值,如用户没有指定p2,则书本价格没有上限。用到的关系为:titles (title_id,title,price,pubdate)。

     



    14.调用上面的存储过程search,求出书名与computer有关而且价格小于$20大于$10的书。

    调用存储过程search,将参数computer,10,20传入,查看打印结果。



     


    总结

        本次主要是掌握了对于存储过程的使用,总的来说,存储过程实际上类似于C++中的函数,而在C++中我们是需要在创建这一过程的文件中去调用这一函数,但是对于存储过程来说,相当于是将这一操作过程存储在数据库中,可以使用call与对其进行调用,并输入或者输出一些参数和结果。

        印象最深的是类似“in n int”和“out sum int”这样的对于输入输出的定义,通过查看相关博客,可以总结如下对于输入输出定义的使用规律:

        MySQL存储过程的参数用在存储过程的定义,共有三种参数类型

        IN,OUT,INOUT
        格式为:Create procedure|function([[IN |OUT |INOUT ] 参数名 数据类形...])

        IN 输入参数
            表示该参数的值必须在调用存储过程时指定,在存储过程中修改该参数的值不能被返回,为默认值

        OUT 输出参数
            该值可在存储过程内部被改变,并可返回

        INOUT 输入输出参数
            调用时指定,并且可被改变和返回

        IN 和 OUT在实验中已有体会,主要是对INOUT的理解,这里引用一个例子:

     

    参数inout的使用实例(既能输入一个值又能传出来一个值)
        语句功能:传一个年龄,自动让年龄增长10岁
        create procedure p3(inout age int)
        begin
        set age:=age+10;
        end
        其中:调用的时候,inout型的参数值既是输入类型又是输出类型,给它一个值,值不是变量,因此我们需要先设置一个变量并初始化这个值,调用的时候直接传这个变量即可。
        set @currentAge=8$
        call p3(@currentAge)$
        select @currentAge$
        创建并执行完存储过程,运行结果如下:
            

     

    另外,更多关于数据库、网络技术、信息安全等方面的文章,感兴趣的(尤其是想打CTF的)欢迎来我的博客上看看

    展开全文
  • 数据库存储过程

    2017-09-20 17:20:58
    存储过程的概念】   存储过程(Stored ...存储过程是由流控制和 SQL语句书写的过程,这个过程经编译和优化后存储在数据库服务器中。存储过程可由应用程序通过一个调用来执行,而且允许用户声明变量。同

    【存储过程的概念】

     

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

     

    【存储过程的功能】

     

    这类语言主要提供以下功能,让用户可以设计出符合引用需求的程序:

    ① 变量说明

    ② ANSI兼容的SQL命令(如Select,Update….)

    ③ 一般流程控制命令(if…else…、while….)

    ④ 内部函数

     

    【存储过程的优点


    ① 存储过程的能力大大增强了SQL语言的功能和灵活性。存储过程可以用流控制语句编写,有很强的灵活性,可以完成复杂的判断和较复杂的运算。

     

    ② 可保证数据的安全性和完整性。

    理由1:通过存储过程可以使没有权限的用户在控制之下间接地存取数据库,从而保证数据的安全。

    理由2:通过存储过程可以使相关的动作在一起发生,从而可以维护数据库的完整性。

     

    ③ 在运行存储过程前,数据库已对其进行了语法和句法分析,并给出了优化执行方案。

    这种已经编译好的过程可极大地改善SQL语句的性能。

    由于执行SQL语句的大部分工作已经完成,所以存储过程能以极快的速度执行。

     

    ④ 可以降低网络的通信量。

    理由:客户端调用存储过程只需要传存储过程名和相关参数即可,与传输SQL语句相比自然数据量少了很多。

     

    ⑤ 使体现企业规则的运算程序放入数据库服务器中,以便:

    1). 集中控制。

    2). 当企业规则发生变化时在服务器中改变存储过程即可,无须修改任何应用程序。

    企业规则的特点是要经常变化,如果把体现企业规则的运算程序放入应用程序中,则当企业规则发生变化时,就需要修改应用程序工作量非常之大(修改、发行和安装应用程序)。

    如果把体现企业规则的运算放入存储过程中,则当企业规则发生变化时,只要修改存储过程就可以了,应用程序无须任何变化。

     

    【存储过程优点概括】


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

     

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

     

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

     

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

     

    【存储过程缺点】


    ① 调试麻烦,但是用 PL/SQL Developer 调试很方便!弥补这个缺点。

     

    ② 移植问题,数据库端代码当然是与数据库相关的。但是如果是做工程型项目,基本不存在移植问题。

     

    ③ 重新编译问题,因为后端代码是运行前编译的,如果带有引用关系的对象发生改变时,受影响的存储过程、包将需要重新编译(不过也可以设置成运行时刻自动编译)。

     

    ④ 如果在一个程序系统中大量的使用存储过程,到程序交付使用的时候随着用户需求的增加会导致数据结构的变化,接着就是系统的相关问题了,最后如果用户想维护该系统可以说是很难很难、而且代价是空前的,维护起来更麻烦。

     

    【存储过程的种类


    ① 系统存储过程:以sp_开头,用来进行系统的各项设定.取得信息.相关管理工作。

     

    ② 本地存储过程:用户创建的存储过程是由用户创建并完成某一特定功能的存储过程,事实上一般所说的存储过程就是指本地存储过程。

     

    ③ 临时存储过程:分为两种存储过程:

    一是本地临时存储过程,以井字号(#)作为其名称的第一个字符,则该存储过程将成为一个存放在tempdb数据库中的本地临时存储过程,且只有创建它的用户才能执行它;

    二是全局临时存储过程,以两个井字号(##)号开始,则该存储过程将成为一个存储在tempdb数据库中的全局临时存储过程,全局临时存储过程一旦创建,以后连接到服务器的任意用户都可以执行它,而且不需要特定的权限。

     

    ④ 远程存储过程:在SQL Server2005中,远程存储过程(Remote Stored Procedures)是位于远程服务器上的存储过程,通常可以使用分布式查询和EXECUTE命令执行一个远程存储过程。

     

    ⑤ 扩展存储过程:扩展存储过程(Extended Stored Procedures)是用户可以使用外部程序语言编写的存储过程,而且扩展存储过程的名称通常以xp_开头。


    参考:http://blog.csdn.net/yang3wei/article/details/6281255


    展开全文
  • 今天接到一项任务,需要将数据库存储... 取出数据库存储过程SQL语句如下: select o.[name], c.text, c.encrypted, c.number, xtype=convert(nchar(2), o.xtype), datalength(c.text), convert(varbinary(8000), c

           今天接到一项任务,需要将数据库存储过程取出来,并要求取出相对应得存储过程注释。

          取出数据库存储过程SQL语句如下:

    select o.[name], c.text, c.encrypted, c.number, xtype=convert(nchar(2), o.xtype),    
    datalength(c.text), convert(varbinary(8000), c.text), 
    0 from dbo.syscomments c, dbo.sysobjects o   
    where o.id = c.id and  o.xtype = 'p' and o.[NAME] NOT LIKE 'sp_%' order by name

        但是,text字段中有些字符是不需要的。譬如:


    -- =============================================
    -- 作者:    XX
    -- 创建日期: 2011.5.11
    -- 描述:     取得订单信息[public_GetOrderInfo]
    -- =============================================
    CREATE PROCEDURE [dbo].[public_GetOrderInfo]   .......
    只要字符,“取得订单信息”。

            写了一个函数,简单处理了一下!将存储过程里面,取出注释部分,即(从索引1开始,到 "CREATE" 字符的索引)。将里面的字符之类的过滤掉,剩下的中文就是注释了。简单的一个思路,实现的比较粗糙。不过,就是一个展示用。无伤大雅......

        

    IF OBJECT_ID('ReplEng') IS NOT NULL
    DROP FUNCTION ReplEng
    GO
    CREATE FUNCTION ReplEng
    (
    @CONTENT VARCHAR(MAX)
    )
    RETURNS NVARCHAR(MAX)
    AS
    BEGIN
    
    DECLARE @ALLLength INT        --总长度
    DECLARE @NewWord NVARCHAR(MAX)--新字符串
    DECLARE @EndIndex INT         --结束字符索引
    SET @NewWord=''
    SET @EndIndex=charindex('create',@CONTENT) --取出CREATE 字符的索引
    SET @CONTENT=SUBSTRING(@CONTENT,1,@EndIndex)
    SET @ALLLength=LEN(@CONTENT)  --获取总长度
     
    WHILE(@ALLLength>0)
    BEGIN
    DECLARE @LEN INT 
    SET @LEN=0
    SET @LEN=DATALENGTH(SUBSTRING(@CONTENT,1,1))
    IF(@LEN=2)   --如果是中文,叠加字符串
    BEGIN
    SET @NewWord=@NewWord+SUBSTRING(@CONTENT,1,1)
    END
    
    SET @CONTENT=SUBSTRING(@CONTENT,2,LEN(@CONTENT)-1)  --替换字符
    SET @ALLLength=LEN(@CONTENT)
    END
    SET @NewWord=REPLACE(@NewWord,'作者XX创建日期描述','')
    RETURN @NewWord
    END
    go
    

    再加上函数,用SQL语句调用一下。看到结果你会很兴奋。

    --存储过程:
    select [name]+':'+dbo.ReplEng(c.text),c.text, c.encrypted, c.number, 
    xtype=convert(nchar(2), o.xtype),    
    datalength(c.text), convert(varbinary(8000), c.text), 
    0 from dbo.syscomments c, dbo.sysobjects o   
    where o.id = c.id and  o.xtype = 'p' and o.[NAME] NOT LIKE 'sp_%' order by name  









    展开全文
  • 数据库 存储过程

    2019-09-21 16:37:21
    存储过程(Stored Procedure):一组为列完成特定功能的SQL语句集,它存储在数据库中,(调用的时候只需要传递存储过程的名称以及参数即可),一次编译后,永久有效, 存储过程的个人理解:既然存储过程是一组特定...

    存储过程(Stored Procedure):一组为列完成特定功能的SQL语句集,它存储在数据库中,(调用的时候只需要传递存储过程的名称以及参数即可),一次编译后,永久有效,

    存储过程的个人理解:既然存储过程是一组特定功能的sql语句集,那它的功能更我们常用的sql语句相似,都是对数据库的操作,实现某个功能(复杂的功能),只是区别于普通的sql语句,第一,存储过程适合用于对复杂的工作进行预定的编写好sql语句,并用一个指定的名称存储起来;(调用的时候只需要传递存储过程的名称以及参数即可)
    第二,存储过程可以重复使用,只有第一次创建时编译,后面直接通过名称调用,而普通的sql语句,执行一次,编译一次,
    第三,具有防sql注入攻击,安全性强;

    注意:网上盛传----存储过程要比sql语句执行更快,这是个误区,至今还没有根据,
    来源于百度所见在这里插入图片描述

    展开全文
  • SQL Server数据库存储过程——以自定义存储过程为例 1、什么是数据库存储过程 存储过程就是预编译SQL语句的集合,这些语句存储在一个名称下并作为一个单元处理。存储过程代替了传统的逐条执行SQL语句的方式 SQL...
  • MySQL数据库存储过程

    万次阅读 多人点赞 2017-03-22 19:34:29
    本文以MySQL数据库为例对数据库存储过程进行介绍,包括创建、查看、执行和删除存储过程,并对比了WHILE和repeat循环的差别。 存储过程(Stored Procedure)是在大型数据库系统中,一组为了完成特定功能的SQL 语句集...
  • 1、数据库存储过程与存储函数 存储过程是一组为了完成特定功能的SQL语句集,经过编译后存储在数据库中,用户通过指定存储过程的名字并给出参数(如果该存储过程带有参数)来执行它,叫做存储过程、存储函数。 2、...
  • 创建存储过程 语句: create procedure 存储过程名 [{@参数名 参数类型} [=默认值] [output]] [···n] [with {recomple|encription|recom[ile,encription}] as sql语句[···n] 其中: output:该参数在...
  • 总结一些关于操作数据库是sql语句还是存储过程问题 程序中,你跟数据的交互,需要向数据库拿数据、更改数据库的数据等,这些操作,本身不是程序完成的,而是程序发命令给数据库去做的,不管是通过sql语句方式,...
  • 数据库存储过程的使用 1.什么是存储工程 存储过程是一个预编译的SQL语句,优点是允许模块化的设计,就是说只需创建一次,以后在程序中就可以调用多次。如果某次操作需要执行多次SQL,使用存储过程比单纯SQL语句执行...
  • 数据库存储过程详解

    2017-08-18 10:50:58
    MySQL数据库在5.0版本后开始支持存储... 简单的说存储过程是为了完成某个数据库中的特定功能而编写的语句集,该语句集包括SQL语句(对数据的增删改查)、条件语句和循环语句等。  创建存储过程:  存储过程的创
  • 任务六 数据库存储过程设计 文章目录任务六 数据库存储过程设计【实训目的与要求】【实训原理】【实训步骤】一、定义、调用存储过程1.创建不带参数的存储过程2.创建带输入参数的存储过程3.创建带输入、输出参数...
  • 数据库存储过程简单介绍

    千次阅读 2019-03-05 15:37:35
    存储过程就是一条或多条SQL语句的集合 当对数据库进行一系列的操作时 存储过程就可以将这些复杂的操作封装成一个代码块 以便重复使用 大大减少了数据库开发人员的工作量 创建存储过程 创建存储过程的基本语法 CREATE...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 16,602
精华内容 6,640
关键字:

数据库存储过程语句