现在mysql上定义一个函数,一个储存过程

函数:

 delimiter \\
CREATE FUNCTION f2 ( num2 INT, num1 INT ) RETURNS INT BEGIN
DECLARE
a DEFAULT INT 1; SET a = num1 * num2;
RETURN ( a ) ;
END \\
delimiter;

函数式是计算两个值相乘的

在mysql的调用

select f2(9,5); -- 45

同时函数可以是配合select 函数 from 来使用的;函数里面不能写select * from 这样的语言。

储存过程(或者是事物)

定义

delimiter \\
CREATE DEFINER=`root`@`localhost` PROCEDURE `p6`(inout check_num tinyint,
inout num int)
begin
declare exit handler for SQLEXCEPTION
begin
set check_num=1;
rollback;
end; start transaction ;
select * from class;
set num = num *check_num;
insert into class(caption)values('高三九班'),('拒水小学wu年级九班');
commit;
select * from class;
set check_num=2;
end \\
delimiter ;

在mysql上调用事物:

set @a=6;
set @b=5;
call p6(@a,@b);
select @a,@b;

在mysql必须要定义一个全局的变量。然后传值,在查看值得变化,来判断事物是否执行成功,在事物的内部,会显示出来,但是如果有错误,便会对值不会进行修改,而且修改的值必须要进行commit才能修改或者上传成功。

我去,意外发现:

在mysql上定义事物p7

 delimiter \\

 CREATE DEFINER=`root`@`localhost` PROCEDURE `p7`(inout check_num tinyint,
inout num int)
begin
declare exit handler for SQLEXCEPTION
begin
set check_num=1;
rollback;
end; start transaction ;
select * from class;
set num = num *check_num;
insert into class(caption)values('p7高三九班'),('p7拒水小学wu年级九班');
commit;
select * from class;
insert into class(caption)values('p7高十八班','p7wu年级九班');
commit;
set check_num=2;
end \\
delimiter ;

你看一下定义的事物,你会发现18行是错误的写法,也就是说mysql会报错,然后我再去调用这个事物

set @a=6;
set @b=5;
call p7(@a,@b);
select @a,@b;

发现@a=1 @b=30 就是说在12到17行的代码全部都调用了,而且因为里面有个commit所以说表class里面确实是添加('p7高三九班'),('p7拒水小学wu年级九班')这两个变量。

结论:事物的本质是commit的使用,所以需要将检测的数字和commit放在最后,因为事物的代码是会执行的,执行到了错误地地方,才会走报错的地方,因此在写事物的时候,一定要注意commit的位置。

在pymysql里面调用函数和储存过程(以及事物)

import pymysql
conn=pymysql.connect(host='localhost',user='root',password='',database='review60',charset='utf8')
cursor=conn.cursor()#得到信息是以字典的形式
sql ='select f2(3,4)'
cursor.execute(sql)
a=cursor.fetchall()
print('f2(3,4)的返回值:',a)
num1=3
num2=4
cursor.callproc('p6',(num1,num2))#num1=@_p6_0,num2=@_p6_1
print('第一次的p6返回值:',cursor.fetchall())
print('num1 num2:',num1,num2)
cursor.execute('select @_p6_0')
num1=cursor.fetchall()#成功返回2,失败返回1
print('查看返回值num1:',num1)
cursor.execute('select @_p6_1')
num2=cursor.fetchall()#返回num1 x num2
print('查看返回值num2:',num2)
cursor.close()
conn.close()

结果:

f2(3,4)的返回值: ((12,),)
第一次的p6返回值: 一个很长的列表
num1 num2: 3 4
查看返回值num1: ((2,),)
查看返回值num2: ((12,),)

mysql的内置函数:

CHAR_LENGTH(str)
返回值为字符串str 的长度,长度的单位为字符。一个多字节字符算作一个单字符。
对于一个包含五个二字节字符集, LENGTH()返回值为 10, 而CHAR_LENGTH()的返回值为5。 CONCAT(str1,str2,...)
字符串拼接
如有任何一个参数为NULL ,则返回值为 NULL。
CONCAT_WS(separator,str1,str2,...)
字符串拼接(自定义连接符)
CONCAT_WS()不会忽略任何空字符串。 (然而会忽略所有的 NULL)。 CONV(N,from_base,to_base)
进制转换
例如:
SELECT CONV('a',16,2); 表示将 a 由16进制转换为2进制字符串表示 FORMAT(X,D)
将数字X 的格式写为'#,###,###.##',以四舍五入的方式保留小数点后 D 位, 并将结果以字符串的形式返回。若 D 为 0, 则返回结果不带有小数点,或不含小数部分。
例如:
SELECT FORMAT(12332.1,4); 结果为: '12,332.1000'
INSERT(str,pos,len,newstr)
在str的指定位置插入字符串
pos:要替换位置其实位置
len:替换的长度
newstr:新字符串
特别的:
如果pos超过原字符串长度,则返回原字符串
如果len超过原字符串长度,则由新字符串完全替换
INSTR(str,substr)
返回字符串 str 中子字符串的第一个出现位置。 LEFT(str,len)
返回字符串str 从开始的len位置的子序列字符。 LOWER(str)
变小写 UPPER(str)
变大写 LTRIM(str)
返回字符串 str ,其引导空格字符被删除。
RTRIM(str)
返回字符串 str ,结尾空格字符被删去。
SUBSTRING(str,pos,len)
获取字符串子序列 LOCATE(substr,str,pos)
获取子序列索引位置 REPEAT(str,count)
返回一个由重复的字符串str 组成的字符串,字符串str的数目等于count 。
若 count <= 0,则返回一个空字符串。
若str 或 count 为 NULL,则返回 NULL 。
REPLACE(str,from_str,to_str)
返回字符串str 以及所有被字符串to_str替代的字符串from_str 。
REVERSE(str)
返回字符串 str ,顺序和字符顺序相反。
RIGHT(str,len)
从字符串str 开始,返回从后边开始len个字符组成的子序列 SPACE(N)
返回一个由N空格组成的字符串。 SUBSTRING(str,pos) , SUBSTRING(str FROM pos) SUBSTRING(str,pos,len) , SUBSTRING(str FROM pos FOR len)
不带有len 参数的格式从字符串str返回一个子字符串,起始于位置 pos。带有len参数的格式从字符串str返回一个长度同len字符相同的子字符串,起始于位置 pos。 使用 FROM的格式为标准 SQL 语法。也可能对pos使用一个负值。假若这样,则子字符串的位置起始于字符串结尾的pos 字符,而不是字符串的开头位置。在以下格式的函数中可以对pos 使用一个负值。 mysql> SELECT SUBSTRING('Quadratically',5);
-> 'ratically' mysql> SELECT SUBSTRING('foobarbar' FROM 4);
-> 'barbar' mysql> SELECT SUBSTRING('Quadratically',5,6);
-> 'ratica' mysql> SELECT SUBSTRING('Sakila', -3);
-> 'ila' mysql> SELECT SUBSTRING('Sakila', -5, 3);
-> 'aki' mysql> SELECT SUBSTRING('Sakila' FROM -4 FOR 2);
-> 'ki' TRIM([{BOTH | LEADING | TRAILING} [remstr] FROM] str) TRIM(remstr FROM] str)
返回字符串 str , 其中所有remstr 前缀和/或后缀都已被删除。若分类符BOTH、LEADIN或TRAILING中没有一个是给定的,则假设为BOTH 。 remstr 为可选项,在未指定情况下,可删除空格。 mysql> SELECT TRIM(' bar ');
-> 'bar' mysql> SELECT TRIM(LEADING 'x' FROM 'xxxbarxxx');
-> 'barxxx' mysql> SELECT TRIM(BOTH 'x' FROM 'xxxbarxxx');
-> 'bar' mysql> SELECT TRIM(TRAILING 'xyz' FROM 'barxxyz');
-> 'barx'

这是一些mysql的内置函数,更多函数请点击官方中文

需要commit的操作的代码,在增删改是,一般要commit才会生效,不然就回滚了。下列的操作需要commmit,

1.在pymysql中操作 execute和callpro都需要的操作,即使储存对象里面有commit。

2.在mysql的储存过程,事物中需要此操作

3.但是在由表中却不需要此操作。

mysql的函数与储存过程与pymysql的配合使用的更多相关文章

  1. MySQL定时任务event,储存过程(定时删除指定时间前90天指定表的数据)

    MySQL定时任务event,储存过程(定时删除指定时间前90天指定表的数据) 分类: MySql5.x2014-06-23 15:16 1266人阅读 评论(0) 收藏 举报 mysql数据库 &l ...

  2. 数据库Mysql的学习(八)-储存过程和事务和导入导出

    储存过程 DELIMITER // CREATE PROCEDURE pro1() BEGIN SELECT book_id,book_name,category FROM bookinfo t1 J ...

  3. MySQL储存过程

    储存过程 本文章原创,转载需注明出处. 前提: 在大型数据库中 来源: 为了完成特定功能的SQL语句集 定义: 储存在数据库中, 用户通过指定储存过程的名字并给出参数(带有参数的)来执行它 声明: 储 ...

  4. 【转】oracle查询用户表,函数,储存过程,

    ◆Oracle查询用户表空间:select * from user_all_tables ◆Oracle查询所有函数和储存过程:select * from user_source ◆Oracle查询所 ...

  5. C#函数与SQL储存过程

    一点点小认识作为memo,求指正. C#的函数与SQL的储存过程有很多的相似性, 它们都是一段封闭的代码块,来提高代码的重用性,虽然现在复制粘贴很方便,但是我们在写多个函数的时候频繁的复制粘贴相同的内 ...

  6. MySQL 储存过程-原理、语法、函数详细说明

    Mysql储存过程是一组为了完成特定功能的SQL语句集,经过编译之后存储在数据库中,当需要使用该组SQL语句时用户只需要通过指定储存过程的名字并给定参数就可以调用执行它了,简而言之就是一组已经写好的命 ...

  7. Mysql 储存过程以及 python callproc调用

    一.存储过程(stored procedure) 存储过程将存入的一系列SQL语句进行预编译,执行并存放在数据库中,之后如果需要使用sql语句对这一组sql进行访问时可以直接提取(很好理解 存储过程就 ...

  8. SQL SERVER 判断是否存在并删除某个数据库、表、视图、触发器、储存过程、函数

    -- SQL SERVER 判断是否存在某个触发器.储存过程 -- 判断储存过程,如果存在则删除IF (EXISTS(SELECT * FROM sysobjects WHERE name='proc ...

  9. mysql储存过程入门学习

    转载至:https://www.yiibai.com/mysql/getting-started-with-mysql-stored-procedures.html 1.mysql储存过程的创建 DE ...

随机推荐

  1. 死磕 java集合之LinkedHashMap源码分析

    欢迎关注我的公众号"彤哥读源码",查看更多源码系列文章, 与彤哥一起畅游源码的海洋. 简介 LinkedHashMap内部维护了一个双向链表,能保证元素按插入的顺序访问,也能以访问 ...

  2. 在.net core上使用Entity FramWork(Db first)

    在.net core中不可以向往常一样去直接可视化创建EF了,那我们可以通过命令安装 其依赖项有 Install-package Microsoft.EntityFrameworkCore Insta ...

  3. C# 调用IP库(QQWry.Dat)查询IP位置及自动升级IP库方法【转】

    前言 C# 用IP地址(123.125.114.144)查询位置(北京市百度公司)的东西,非常好用也非常方便,可手动升级刷新IP库,一次编码永久收益,可支持winform.asp.net等程序. 本文 ...

  4. NIO 简介

    上文我们描述了五中IO类型.第一种同步阻塞模型我们我们称之为BIO(Blocking IO), 第三种IO复用模型我们称之为NIO(Nonblocking IO). 上图我们可以很容易的发现 BIO会 ...

  5. Asp.Net SignalR - 持久连接类

    持久连接类 通过SignalR持久连接类可以快速的构建一个即时通讯的应用,上篇博文已经我们创建一个owin Startup类和一个持久连接类来完成我们的工作,然后在Startup类的Configura ...

  6. Config安全控制

    1.config server引入依赖 <dependency> <groupId>org.springframework.boot</groupId> <a ...

  7. Perl IO:随机读写文件

    随机读写 如果一个文件句柄是指向一个实体文件的,那么就可以对它进行随机数据的访问(包括随机读.写),随机访问表示可以读取文件中的任何一部分数据或者向文件中的任何一个位置处写入数据.实现这种随机读写的功 ...

  8. haproxy使用演示--技术流ken

    haproxy简介 HAProxy提供高可用性.负载均衡以及基于TCP和HTTP应用的代理,支持虚拟主机,它是免费.快速并且可靠的一种解决方案.基于合理的配置及优化,完全可以实现单机支持数 以万计的并 ...

  9. Spring Cloud Alibaba基础教程:Nacos的数据持久化

    前情回顾: <Spring Cloud Alibaba基础教程:使用Nacos实现服务注册与发现> <Spring Cloud Alibaba基础教程:支持的几种服务消费方式> ...

  10. .net mvc 导出excel表格

    使用using System.IO; /// /// 导出Excel文件,并自定义文件名 /// public static void DataTableExcel(System.Data.DataT ...