精华内容
下载资源
问答
  • 1、存储过程介绍​迄今为止,我们学过大多数SQL语句都是针对一个或多个表单条语句。但是并不是所有操作都是可以一条语句来完成,经常有一些操作是需要多条语句配合才能完成。我们引入的存储过程(Stored ...

    1、存储过程介绍

    ​迄今为止,我们学过的大多数SQL语句都是针对一个或多个表的单条语句。但是并不是所有的操作都是可以用一条语句来完成的,经常有一些操作是需要多条语句配合才能完成。我们引入的存储过程(Stored Procedure)是一组为了完成特定功能的SQL语句集,经编译后存储在数据库中,用户通过指定存储过程的名字并给定参数(如果该存储过程带有参数)来调用执行它。

    2、存储过程创建、调用、修改、删除

    ① 创建

    语法:

    DELIMITER $$ //更改mysql默认的分符号

    CREATE PROCEDURE 名称()

    BEGIN

    select * from user;

    END

    $$//结束存储过程分割符

    DELIMITER ;//还原存储过程分隔符

    示例

    DELIMITER $$

    CREATE PROCEDURE proc_name_demo()

    BEGIN

    select * from user;

    END

    $$

    DELIMITER;

    ②调用

    语法:call 名称()

    示例:call proc_name_demo()

    ③修改

    ALTER PROCEDURE 名称 [characterustic...]

    - {CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA}:指定子程序使用存储过程的限制。

    CONTAINS SQL:说明子程序包含SQL语句,但是不包含写数据语句

    NO SQL:说明子程序不包含SQL语句

    READS SQL DATA:说明子程序包含读数据读数据语句

    MODIFIES SQL DATA:说明子程序包含写数据语句

    - SQL SECURITY {DEFINER | INVOKER}:指明谁有权限执行,默认值:DEFINER

    DEFINER:只有定义者才能执行

    INVOKER:拥有权限的调用者才可以执行

    - COMMNET:注释信息

    ps:

    目前,MySQL还不提供对已存在的存储过程的代码修改

    如果,一定要修改存储过程的内容,必须,先将存储过程删除之后,再重新编写代码,或者创建一个新的存储过程

    ④删除

    语法:DROP PROCEDURE 名称;

    示例:DROP PROCEDURE proc_namedemo;

    示例2:DROP PROCEDURE if exists proc_namedemo;//删除存在的存储过程

    展开全文
  • 比如B初始值为1,被某个存储过程改为了0,但是现在存储过程大概有1000多个,有没有什么好方法,可以监测到这个字段是被谁修改的。 实现思路: 这种情况下,可以多种方法,比较简单就是触发器,...

    实际问题如下:

    有一个表A,表A中有一个字段B被某个存储过程修改了。

    比如B的初始值为1,被某个存储过程改为了0,但是现在存储过程大概有1000多个,有没有什么好的方法,可以监测到这个字段是被谁修改的。


    实现思路:

    这种情况下,可以用多种方法,比较简单的就是用触发器,比如,要监控A表的数据修改,那么可以给A表创建一个触发器,同时创建一个日志表,当A表的数据被修改时,通过日志表记录,但是修改数据的sql语句或者存储过程。


    实现代码如下:

    --1.建表
    create table t(id int,v varchar(10));
    
    insert into t values(1,'abc')
    
    
    
    --2.存储过程,用来模拟修改t表的数据
    create proc proc_t(@id int,@v varchar(10))
    as
    update t
    set v = @v
    where id = @id
    
    go
    
    
    
    --3。创建日志表
    create table tb_log(eventtype nvarchar(14),prama smallint,eventinfo nvarchar(1000),create_time datetime default getdate())
    go
    
    
    
    --4.触发器,修改数据时可以触发,从而记录下修改的sql
    create trigger dbo.trigger_t
    on t
    after update
    as
    
    insert into tb_log(eventtype,prama,eventinfo)
    exec('DBCC INPUTBUFFER('+@@spid+')') 
    go
    
    
    
    
    --5.模拟修改数据
    exec proc_t 1,'123'
    go
    
    
    update t 
    set v = 'xxx'
    where id = 1 
    go
    
    
    
    --6.显示监控日志
    select * from tb_log
    /*
    eventtype	prama	eventinfo	create_time
    Language Event	0	update t set v = 'xxx'where id = 1 	2016-12-14 10:25:55.820
    Language Event	0	exec proc_t 1,'123'	2016-12-14 10:26:05.840
    */
    

    展开全文
  • 平时和数据打交道比较多测试同学,可能会经常接触到数据库,增删改查是最基本sql语句运用,但是遇到一些特殊场景时候,需要同时对大批...存储过程,就是在数据库中编写sql语句集合,只要编写一次就可以反复...

    f1c74aa5a9b59947066257113dd953d5.png

    平时和数据打交道比较多的测试同学,可能会经常接触到数据库,增删改查是最基本的sql语句运用,但是遇到一些特殊场景的时候,需要同时对大批量数据进行操作,常备的基本句式可能就应付不过来了,例如你要准备5万条测试数据,难道要用insert into一行行新增吗;或者让你批量修改某张大表中的某一列数据呢?

    这种时候我们往往需要借助存储过程。

    存储过程,就是在数据库中编写的sql语句集合,只要编写一次就可以反复使用,学习过Python或者其它语言的同学,把它当成函数或者方法,可能会更加容易理解一点。

    ----------------------------------------

    首先,我们来学习一下,存储过程的基本结构:

    存储过程叫做procedure,我们使用create语句来创建,begin和end中间的部分,就是存储过程需要执行的语句。

    c73e5e7b2d78863b5d5af9715a9ec839.png

    test是这个存储过程的名字,括号里面可以写传入或者传出的参数,我们来写个简单的例子。

    06fc3314080424d05629e1089327ee51.png

    这个例子里面,添加了两行新内容,in a int,in b int ,表示可以接收用户传入的两个整型值,select a+b 表示将用户传入的两个值相加后输出打印。

    调用刚刚写好的存储过程,我们使用call。

    call后面加上存储过程的名字,括号中加上传入的参数值,数量和顺序要与定义的参数类型和数量一致。

    9372562ff6e71569ef61029e91ccebfa.png

    ----------------------------------------

    除了可以在括号中定义参数,也可以在存储过程内部定义。

    707b1752cd916acd9008b01a7accc04f.png

    declare是声明变量的名字和类型,set给这个变量赋值,select将其值输出打印。

    71a93d21dd335a5fd4a6766af308b573.png

    ----------------------------------------

    接下来可以讲讲最基本的两个控制语句了。

    ----------------------------------------

    if 判断语句在存储过程中的基本结构是:

    bf1c07b77c5408926c563d19f30b5d5f.png

    写一个简单的脚本:

    21f34866767cf16ee23b2ab96cf9bdb0.png

    脚本的意思是,让用户输入一个数,我在过程内定义一个数,然后比较两个数字的大小。

    f1f25ab349b0a411beb2de468bffd137.png

    ----------------------------------------

    循环语句可选择的比较多,这里我们主要用while来尝试一下。

    while的基本语法结构是:

    9ce5a20425c043395db5343bb976b567.png

    我们来写个简单的例子

    90f2979929f0604cb40c1134ff04db67.png

    循环的打印1到10的数(一定要注意循环中是否有自增或者自减的存在):

    91c67269601843dab304c748279a01d4.png

    ----------------------------------------

    现在我们来看看如何使用随机函数来制造随机的数字、随机的字符串和随机的日期。

    随机函数在mysql中是rand(),这个函数随机的范围是0--1之间的小数。

    ★如果想要随机某个范围的整数,有个基本的数学公式:

    floor(开始值+rand()*(结束值-开始值+1));

    例如要随机50-100之间的整数,可以使用floor(50+rand()*(100-50+1));

    ★随机字符串需要将rand()随机,substr()字符串截取,concat()字符串拼接这几个函数结合起来运行

    举个例子,加入现在想要随机一个姓名,可以简单的这么设计,随机一个姓,再随机一个名,然后拼起来。

    现在实现姓的随机:

    2bbadc47e759d447a3ae3fd2430c88ef.png

    在百家姓中随机一个位置,然后截取一个长度的字符,这不就是随机一个姓氏吗。

    相同的操作再来一遍:

    33cd880a7b6636082f0635117d3ce6ee.png

    现在我们有了随机的名。

    最后拼接一下:

    87dc1c39c36db03a1fcf0ae6f7b2a90c.png

    随机的名字出现了!

    ★随机的日期我们也可以实现一下:

    a7d67d05a108efb76b7229cee3f425fc.png

    看到这里的同学们,肯定觉得脚本已经渐渐疯狂......

    还没有停止,我们把这些随机统统塞到一起去,实现往表中指定插入数据的效果。

    现在有张空表,往里面插入100行测试数据:

    d66c2c3a21ad28a7f2063617963e44c2.png

    359637cf5b3cfd54005a6f1309bc76c8.png

    528c292988064af62aae60411416b8fe.png

    看下效果:

    85626b8a95b10a717c447f0aa0a1785a.png

    搞定!!!

    学会了吗?

    小z老师讲测试

    展开全文
  • 存储过程的好外,我就不多说了,想必各位都已了然于胸当然,存储过程也有不少坏处:1,当存储过程数量越来越多时候,在众多存储过程中找到想要修改的存储过程是一件麻烦事.2.如果嵌入式SQL语句,可以在修改代码时,...
    存储过程的好外,我就不多说了,想必各位都已了然于胸
    当然,存储过程也有不少坏处:
    1,当存储过程数量越来越多的时候,在众多存储过程中找到想要修改的存储过程是一件麻烦的事.
    2.如果用嵌入式SQL语句,可以在修改代码时,顺便就修改了数据库操作语句,方便

    针对这两个所谓的缺点,我提出我的一些看法:
    1.如果说存储过程多了,不好找,那你该检讨一下您的命名习惯是否规范是否达意,如果是多人合作的团队,大家更应该对于存储过程的命名有一致的规则,当然,不只存储过程需要这样,其他部分也都要需要这样.好的存储过程命名最好能包含操作名称(insert/update/get/list等),要操作的对象名称(表名)等,这样,即便你的存储过程再多,一样也能快速找到要改的那个,这样命名,还可以让你通过SQL 2000的对象查找功能一次性的按表名找到与此表相关的所有存储过程的名称,同理,你用LIST来查,也可以查到所有LIST功能的存储过程
    2,对于第二种观点,我是不大同意的,在过往的例子中,我发现,将SQL语句从代码中分离出来,带来的好处远远大于坏处,而且这样更符合分层的原则,如果我们将SQL语句嵌入到代码中,当你仅需要多获取一个字段的值,或者对SQL语句本身做一些修改时,你就必须要编译,然后上传DLL,而如果你是用存储过程的话,你直接改一下存储过程就好了,而且,将二者分离,DBA写好存储过程,列好说明及使用规则,交给负责写DAL层的同学,DAL层的同学闭上眼无需了解SQL语句,也可完成他的工作,因此,从这个角度来说,很好的分隔了工作,不必要要写DAL层的同学也是SQL存储过程高手了
    3,防止注入攻击,如果不用存储过程而用嵌入式SQL,你势必要为了防止注入攻击而对输入的用户数据做更多的处理工作,例如处理一些SQL敏感字符等
    4.更为重要的是,如果你要朝一个表中插入的是一个BINARY内容的时候,难道你会用SQL语句吗?
    5,嵌入式SQL特别是拼贴SQL语句,一向是比较容易出问题的环节,而存储过程在写的时候,就经过检查,储如漏掉符号,INSERT的字段数目与参数数目不一致的小错误,会立即被纠正
    6,谁都知道存储过程是预编译的
    7,如果你是高手,你可以分析并优化存储过程来提高性能(以前记得看过MS的一个牛人技术支持讲述存储过程分析和优化,非常启发人)

    最常见的是,在实际运用中,为了减少DATASET数据集的大小和提高性能,通常我们只SELECT当前需要的字段,但是,随着发展,你可以需要其他字段,这时,如果用嵌入SQL,就要修改SQL语句,编译,再写上绑定该字段的表达式,但是,如果用存储过程,你只要绑定表达式,然后给存储过程中加上这个字段名就可以了.
    再如,如果用STRING来拼贴SQL的INSERT语句,那很可能是这样拼
    string strSql="insert into table (id,username,password,address) value ("+Id.ToString()+","+UserName...
    这样拼贴,多加个字段时,一花眼,就拼贴错了
    如果用存储过程,你顶多用
    SqlParameter myPara=new SqlParameter("@field5",Field5);
    再在存储过程里加上这个输入参数就可以了,和修改一下SQL语句就行了,SQL还会在修改过程中帮你检查语法
    后者显然比前者用那么多+号与双引号拼贴出错的几率小多了

    最后,以上观点仅体现个人观点,不过,绝不是书上看来的,而是自己做了几个项目,边做边体会到的

    转载于:https://www.cnblogs.com/Heroman/archive/2006/01/10/314631.html

    展开全文
  • 总结一些关于操作数据库是sql语句还是存储过程问题 ...在程序中,你如果将数据库操作那块封装成存储过程调用,以后即使换了数据库,如果存储过程不变,你程序就不需要修改,实现相对隔离。 不用存储过程...
  • 存储过程的好外,我就不多说了,想必各位都已了然于胸当然,存储过程也有不少坏处:1,当存储过程数量越来越多时候,在众多存储过程中找到想要修改的存储过程是一件麻烦事.2.如果嵌入式SQL语句,可以在修改代码时,...
  • 没办法,只能修改自己的存储过程,因为分页存储过程是不能动。 开始想到方法是将里层select语句抽出来,exec(strInnerSql)执行,将查询胡来数据放到临时表中,在@s中用临时表获取数据,结果以时报告终 ...
  • 下面是利用SQL语句创建数据库、表、存储过程、视图、索引、规则、修改表、查看数据等方法。所要增加控件如下: Imports System.Data Imports System.Data.SqlClient Public Class Form1  ...
  • Entity Framework 进行数据库交互,在代码里直接lamda表达式和linq...通常可以采用方式是EF执行SQL语句或者“存储过程”,特别是执行复杂批量任务,当然也可以在MVC底层ADO.NET,这里就不多说了。怎么做批...
  • mysql中修改存储过程的命令是“ALTER PROCEDURE”,语法格式为“ALTER PROCEDURE 存储过程名 [ 特征 ... ]”,特征可能取值为CONTAINS SQL、NO SQL、INVOKER、DEFINER等等。在实际开发过程中,业务需求修改情况...
  • 下面是利用SQL语句创建数据库、表、存储过程、视图、索引、规则、修改表、查看数据等方法。所要增加控件如下: Imports System.Data Imports System.Data.SqlClient Public Class Form1 Inherits System....
  • "为分隔符,如果我们没有声明分割符,那么编译器会把存储过程当成SQL语句进行处理,则存储过程的编译过程会报错,所以要事先DELIMITER关键字声明当前段分隔符,这样MySQL才会将";"当做存储过程代码,不会执行...
  • MySQL的存储过程

    2020-03-31 08:34:02
    1、增强SQL语言功能和灵活性:存储过程可以控制语句编写,有很强灵活性,可以完成复杂判断和较复杂运算。 2、标准组件式编程:存储过程被创建后,可以在程序中被多次调用,而不必重新编写该存储过程的SQL...
  • Mysql存储过程是我们学习Mysql重要知识点,这篇文章主要给大家讲解一下创建...假设现在有一种应用程序包含了这两 种,现在要修改其中一个查询sql语句,那么我们可能要同时修改他们中对应查询sql语句,当我们
  • 存储过程

    2020-11-18 11:11:29
    1)增强SQL语言功能和灵活性:存储过程可以控制语句编写,有很强灵活性,可以完成复杂判断和较复杂运算。 2)标准组件式编程:存储过程被创建后,可以在程序中被多次调用,而不必重新编写该存储过程的SQL...
  • 这个业务需要修改20个表内容,那么不用存储过程,就是一条一条sql语句实现咯; 就算不直接sql,也是间接使用吧;不管你有没有所谓中间层业务处理服务器,它也要和数据库打交道吧;试想一下,提交20条sql,...
  • 什么是存储过程,有哪些优缺点 定义: 存储过程是一个预编译sql语句; 只要创建一次就可以多次调用;...当存储过程已经存在时候 可以alter 来进行修改 存储过程使用实列: 列如在book表里面添加存储过程
  • 存储过程可以流控制语句编写,有很强灵活性,可以完成复杂判断和较复杂运算。 存储过程允许标准组件是编程。存储过程被创建后,可以在程序中被多次调用,而不必重新编写该存储过程的SQL语句。而且数据库专业...
  • 为什么要用存储过程? 1.程序分两种,一种是基于web,一种是基于桌面,他们都和数据库进行交互来完成数据存取工作。假设现在有一种应用程序包含了这两种,现在要修改其中一个查询sql语句,那么我们可能要同时修改...
  • 大纲:创建、删除、调用。声明变量、变量赋值、存储过程的入参声明游标声明异常处理器判断循环使用心得mybatis调用存储过程一、创建、删除、... #存储过程的语句用;结尾END$$ #存储过程本身用修改后的分隔符$$结...
  • Oracle存储过程

    2017-07-19 17:25:00
    存储过程和存储函数相同点:完成特定功能程序存储过程和存储函数区别:是否return语句返回值 //存储过程无返回值 语法//创建或者替换一个存储过程(不能修改 替换相当于修改)create [or replace] PROCED...
  • 入门存储过程

    2019-08-18 21:44:14
    存储过程是为了完成特定功能SQL语句集,经编译创建并保存在数据库中,用户可通过指定存储过程的名字并给定参数(需要时)来调用执行。 优点 存储过程的执行速度快,因为存储过程是预编译。 模块化程序设计,可以...
  • 简单地说,存储过程就是一条或者多...存储程序可以分为存储过程和函数,MySQL 中创建存储过程和函数使用的语句分别是:CREATE PROCEDURE和CREATE FUNCTION。使用CALL语句来调用存储过程,只能输出变量返回值。函数...
  • 简单地说,存储过程就是一条或者多...存储程序可以分为存储过程和函数,MySQL 中创建存储过程和函数使用的语句分别是:CREATE PROCEDURE和CREATE FUNCTION。使用CALL语句来调用存储过程,只能输出变量返回值。函数...
  • MYSQL存储过程

    2014-07-18 16:16:48
    存储过程可以流控制语句编写,有很强灵活性,可以完成复杂判断和较复杂运算。 (2).存储过程允许标准组件是编程。存储过程被创建后,可以在程序中被多次调用,而不必重新编写该存储过程的SQL语句。而且...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 508
精华内容 203
关键字:

修改存储过程用的语句是