1、MySQL中创建存储过程时通过DEFINER和SQL SECURITY设置访问权限

procedure与function、trigger等创建时紧接着CREATE都有个definer可选项,该definer规定了访问该procedure等的安全控制

CREATE DEFINER=`root`@`%` FUNCTION `f_emp_get_shift_time`(`@attent_date` date,
`@shift` VARCHAR(50),
`@type` VARCHAR(50)) RETURNS datetime BEGIN
......
END;
CREATE DEFINER=`root`@`%` PROCEDURE `p_asset_setItManager`(`uuid` varchar(50),`user_id_par` varchar(20),`apply_no_par` varchar(20), `table_name` varchar(50))
BEGIN
......
END;

上面示例指定definer为用户

root`@`%`

,所以任意用户A访问该PROCEDURE 时,能否成功取决于A是否有调用该PROCEDURE的权限,以及definer是否有procedure中的SELECT的权限。

2、mysql 存储过程中的 prepare语句(存储过程中动态增减表字段)

在存储过程中创建一张临时表,然和在动态增减临时表的字段,所以就用到了mysql的prepare预编译语句。

基本语法:

PREPARE stmt from '你的sql语句';
EXECUTE stmt (如果sql有参数的话, USING xxx,xxx); // 这里USING的只能是会话变量
DEALLOCATE PREPARE stmt;

这三句话分别就是预定义好sql.
执行预定义的sql
释放掉数据库连接
使用这个语法便可以在存储过程中写一些ddl语句,但是在网上看到的是在存储过程中最好是不要写ddl,因为ddl操作会锁表,总之就是不建议在存储过程中去更改表结构。不过我们这里是对临时表的改变,是不影响的啦。

  • 他还可以在存储过程中动态的拼接表名,字段名,来达到动态查询的效果
  • sql语句中还可以用?来代表参数,这样可以有效的防止sql注入
    delimiter //
    create procedure myTest()
    begin
    set @_sql = 'select ? + ?';
    set @a = 5;
    set @b = 6;
    PREPARE stmt from @_sql; // 预定义sql
    EXECUTE stmt USING @a,@b;// 传入两个会话变量来填充sql中的 ?
    DEALLOCATE PREPARE stmt; // 释放连接
    end //

    调用上面的存储过程,会得到11的结果,就是这么简单,关于存储过程我的其他博客里面有,可以去看,值得一提的是,如果是要动态的选择表名,表名并不能用 ? 来当占位符。我们只能采用字符串拼接的方法。

  • delimiter //
    create procedure myTest(in columnName varchar(32)) // 传入一个字符串
    BEGIN
    drop table if exists tmpTable; // 如果临时表存在先删除掉
    set @_sql = concat('create temporary table if not exists tmpTable( ', columnName, ' varchar(32), id int(11), _name varchar(32));');

    // 创建临时表的语法,我们把传入的参数拼接进来
    PREPARE stmt from @_sql;
    EXECUTE stmt;
    DEALLOCATE PREPARE stmt; // 执行
    desc tmpTable;
    end //

    以上存储过程我们可以看到我们传入的字符串可以动态的添加到临时表里面去。
    创建临时表时还可以直接从结果集创建。 create temporary table tmpTable select * from tableName;

3、MySQL-存储过程-游标 CURSOR FOR

1,游标

游标是一个存储在MySQL服务器上的数据库查询,它不是一条select语句,而是被该语句所检索出来的结果集。

2,定义游标

这个过程并没有检索到数据,只是定义要使用的select语句

DECLARE t_cursor CURSOR FOR SELECT t.id FROM t_dept t;

2,定义游标

这个过程并没有检索到数据,只是定义要使用的select语句

DECLARE t_cursor CURSOR FOR SELECT t.id FROM t_dept t;

3,如果没有数据返回或者select出现异常,程序继续,并将变量done设为true ,

DECLARE CONTINUE HANDLER FOR NOT FOUND SET done=true;

3,打开游标

open t_cursor;

4,使用游标

使用fetch来取出数据

fetch t_cursor in variable;

5,关闭游标

close t_cursor;

过程:定义游标(使用游标前必须先定义游标)—》打开游标—》关闭游标

MySQL 预处理语句prepare、execute、deallocate的使用

PREPARE stmt_name FROM preparable_stmt

EXECUTE stmt_name
[USING @var_name [, @var_name] ...] - {DEALLOCATE | DROP} PREPARE stmt_name
mysql> PREPARE pr1 FROM 'SELECT ?+?';
Query OK, 0 rows affected (0.01 sec)
Statement prepared mysql> SET @a=1, @b=10 ;
Query OK, 0 rows affected (0.00 sec) mysql> EXECUTE pr1 USING @a, @b;
+------+
| ?+? |
+------+
| 11 |
+------+
1 row in set (0.00 sec) mysql> EXECUTE pr1 USING 1, 2; -- 只能使用用户变量传递。
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the
right syntax to use near '1, 2' at line 1 mysql> DEALLOCATE PREPARE pr1;
Query OK, 0 rows affected (0.00 sec)

使用PAREPARE STATEMENT,可以减少每次执行SQL的语法分析,
比如用于执行带有WHERE条件的SELECT和DELETE,或者UPDATE,或者INSERT,只需要每次修改变量值即可。
同样可以防止SQL注入,参数值可以包含转义符和定界符。
适用在应用程序中,或者SQL脚本中均可。

Mysql存储过程二的更多相关文章

  1. MySQL存储过程详解 mysql 存储过程(二)

    mysql存储过程详解 1.      存储过程简介 我们常用的操作数据库语言SQL语句在执行的时候需要要先编译,然后执行,而存储过程(Stored Procedure)是一组为了完成特定功能的SQL ...

  2. mysql 总结二(自定义存储过程)

    mysql执行流程: sql命令--->mysql引擎-----(分析)---->语法正确-----(编译)--->可识别命令----(执行)---->执行结果---(返回)- ...

  3. mysql深入浅出的笔记(存储过程二)

    1.条件的定义和处理可以用来定义在处理过程中遇到问题时相应的处理步揍: DECLARE condition_name CONDITION FOR condition_value condition_v ...

  4. MYSQL进阶学习笔记二:MySQL存储过程和局部变量!(视频序号:进阶_4-6)

    知识点三:MySQL存储过程和局部变量(4,5,6) 存储过程的创建:     创建存储过程的步骤: 首先选中数据库 改变分隔符,不让分号作为执行结束的标记.(通常情况下,改变分隔符命令 DELIMI ...

  5. MySQL存储过程(转)

    一.MySQL 创建存储过程 "pr_add" 是个简单的 MySQL 存储过程,这个存储过程有两个 int 类型的输入参数 "a"."b" ...

  6. PHP调用MYSQL存储过程实例

    PHP调用MYSQL存储过程实例 标签: mysql存储phpsqlquerycmd 2010-09-26 11:10 11552人阅读 评论(3) 收藏 举报 实例一:无参的存储过程$conn = ...

  7. mysql存储过程语法及实例

    存储过程如同一门程序设计语言,同样包含了数据类型.流程控制.输入和输出和它自己的函数库. --------------------基本语法-------------------- 一.创建存储过程cr ...

  8. J2EE之oracle、mysql存储过程调用

    最近几天在研究hibernate.JPA对存储过程的调用,主要是针对有返回结果集的存储过程的调用方法,个人感觉存储过程是个好东西,虽然说heibernate对数据访问封装的比较不错,再加上他的缓存机制 ...

  9. Mysql存储过程语法

    一口气弄完了! 一.条件语句if-then-else: create procedure demo_1(in param int) begin declare var int; ; then inse ...

随机推荐

  1. HCNP Routing&Switching之组播技术-组播协议IGMP

    前文我们了解了组播地址相关话题,回顾请参考https://www.cnblogs.com/qiuhom-1874/p/15616740.html:今天我们来聊一聊组播协议中IGMP协议相关话题: 组播 ...

  2. 自动化集成:Jenkins管理工具详解

    前言:该系列文章,围绕持续集成:Jenkins+Docker+K8S相关组件,实现自动化管理源码编译.打包.镜像构建.部署等操作:本篇文章主要描述Jenkins基础用法. 一.Jenkins安装 1. ...

  3. python 字符编码讲解

    ANSI不是一种具体的编码格式 ANSI在中文Windows操作系统代码指的是GBK编码 ANSI在中文Mac操作系统代码指的是UTF-8编码 ANSI在其他国家的操作系统中有其他的编码格式 #ASC ...

  4. C++11新特性:enable_shared_from_this

    enable_shared_from_this是一个模板类,定义于头文件<memory>,其原型为:template< class T > class enable_share ...

  5. MAMP的使用

    MAMP下载并安装 下载地址:https://pan.baidu.com/s/1TgoKBG3F59NGO8lEj9mf4Q 密码:2m3d 安装:按照提示,一直下一步直到完成 MAMP操作

  6. JAVAWEB项目处理XSS漏洞攻击处理方案

    对页面传入的参数值进行过滤,过滤方法如下 public static String xssEncode(String s) { if (s == null || s.equals("&quo ...

  7. cmake配置MFC项目属性

    MFC的使用 使用下面的代码设置为: # 设置MFC的使用 SET(CMAKE_MFC_FLAG 2) 这里的 2 代表: 在共享 DLL 中使用 MFC, 1代表在静态库中使用 MFC 设置字符集 ...

  8. 网络编程之UDP(3)丢包总结

    读书笔记 from here UDP socket缓冲区满造成的UDP丢包 如果socket缓冲区满了,应用程序没来得及处理在缓冲区中的UDP包,那么后续来的UDP包会被内核丢弃,造成丢包.在sock ...

  9. nim_duilib(2)之xml目录结构理解

    introduction 本文将总结我对nim_duilib的xml配置. 更多控件和控件属性的具体说明, 请参考 here before starting 1 You should clone th ...

  10. 1742 开心的小Q

    如果一个数字存在一个约数是完全平方数,那么小Q就认为这个数是有趣的. 小Q喜欢收集有趣的数字,每找到一个有趣的数,小Q就会变得很开心. 小Q发现12是有趣的,18也是有趣的,它们都是36的约数,而在3 ...