mysql的函数与储存过程与pymysql的配合使用
现在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'
需要commit的操作的代码,在增删改是,一般要commit才会生效,不然就回滚了。下列的操作需要commmit,
1.在pymysql中操作 execute和callpro都需要的操作,即使储存对象里面有commit。
2.在mysql的储存过程,事物中需要此操作
3.但是在由表中却不需要此操作。
。
mysql的函数与储存过程与pymysql的配合使用的更多相关文章
- MySQL定时任务event,储存过程(定时删除指定时间前90天指定表的数据)
MySQL定时任务event,储存过程(定时删除指定时间前90天指定表的数据) 分类: MySql5.x2014-06-23 15:16 1266人阅读 评论(0) 收藏 举报 mysql数据库 &l ...
- 数据库Mysql的学习(八)-储存过程和事务和导入导出
储存过程 DELIMITER // CREATE PROCEDURE pro1() BEGIN SELECT book_id,book_name,category FROM bookinfo t1 J ...
- MySQL储存过程
储存过程 本文章原创,转载需注明出处. 前提: 在大型数据库中 来源: 为了完成特定功能的SQL语句集 定义: 储存在数据库中, 用户通过指定储存过程的名字并给出参数(带有参数的)来执行它 声明: 储 ...
- 【转】oracle查询用户表,函数,储存过程,
◆Oracle查询用户表空间:select * from user_all_tables ◆Oracle查询所有函数和储存过程:select * from user_source ◆Oracle查询所 ...
- C#函数与SQL储存过程
一点点小认识作为memo,求指正. C#的函数与SQL的储存过程有很多的相似性, 它们都是一段封闭的代码块,来提高代码的重用性,虽然现在复制粘贴很方便,但是我们在写多个函数的时候频繁的复制粘贴相同的内 ...
- MySQL 储存过程-原理、语法、函数详细说明
Mysql储存过程是一组为了完成特定功能的SQL语句集,经过编译之后存储在数据库中,当需要使用该组SQL语句时用户只需要通过指定储存过程的名字并给定参数就可以调用执行它了,简而言之就是一组已经写好的命 ...
- Mysql 储存过程以及 python callproc调用
一.存储过程(stored procedure) 存储过程将存入的一系列SQL语句进行预编译,执行并存放在数据库中,之后如果需要使用sql语句对这一组sql进行访问时可以直接提取(很好理解 存储过程就 ...
- SQL SERVER 判断是否存在并删除某个数据库、表、视图、触发器、储存过程、函数
-- SQL SERVER 判断是否存在某个触发器.储存过程 -- 判断储存过程,如果存在则删除IF (EXISTS(SELECT * FROM sysobjects WHERE name='proc ...
- mysql储存过程入门学习
转载至:https://www.yiibai.com/mysql/getting-started-with-mysql-stored-procedures.html 1.mysql储存过程的创建 DE ...
随机推荐
- mockjs,json-server一起搭建前端通用的数据模拟框架
无论是在工作,还是在业余时间做前端开发的时候,难免出现后端团队还没完成接口的开发,而前端团队却需要实现对应的功能,不要问为什么,这是肯定存在的.本篇文章就是基于此原因而产出的.希望对有这方面的需求的同 ...
- 使用QuertZ组件来搞项目工作流(一)
前言:抛弃windows计划,拥抱.NET组件.每个人都喜欢监听和插件.今天,几乎下载任何开源框架,你必定会发现支持这两个概念.监听是你创建的C#类,当关键事件发生时会收到框架的回调.例如,当一个作业 ...
- Python爬虫入门教程 39-100 天津市科技计划项目成果库数据抓取 scrapy
爬前叨叨 缘由 今天本来没有打算抓取这个网站的,无意中看到某个微信群有人问了一嘴这个网站,想看一下有什么特别复杂的地方,一顿操作下来,发现这个网站除了卡慢,经常自己宕机以外,好像还真没有什么特殊的.. ...
- 从锅炉工到AI专家(10)
RNN循环神经网络(Recurrent Neural Network) 如同word2vec中提到的,很多数据的原型,前后之间是存在关联性的.关联性的打破必然造成关键指征的丢失,从而在后续的训练和预测 ...
- 《HelloGitHub月刊》第 11 期
<HelloGitHub>第 11 期 兴趣是最好的老师,<HelloGitHub>就是帮你找到兴趣! 简介 最开始我只是想把自己在浏览 GitHub 过程中,发现的有意思.高 ...
- [Leetcode]674. Longest Continuous Increasing Subsequence
Given an unsorted array of integers, find the length of longest continuous increasing subsequence. E ...
- Python的协程
什么是协程 协程又叫做微线程,它是在单一线程内通过不断切换执行的.协程的切换不是上下文的切换也就是说不是CPU的执行任务的切换,比如CPU执行一会线程1,然后再执行一会线程2,在多核CPU上,Pyth ...
- springmvc 项目完整示例01 需求与数据库表设计 简单的springmvc应用实例 web项目
一个简单的用户登录系统 用户有账号密码,登录ip,登录时间 打开登录页面,输入用户名密码 登录日志,可以记录登陆的时间,登陆的ip 成功登陆了的话,就更新用户的最后登入时间和ip,同时记录一条登录记录 ...
- 【憩园】C#并发编程之概述
写在前面 并发编程一直都存在,只不过过去的很长时间里,比较难以实现,随着互联网的发展,人口红利的释放,更加友好的支持并发编程已经成了主流编程语言的标配,而对于软件开发人员来说,没有玩过并发编程都会有点 ...
- Android ios嵌套web页面
我们现在做一个活动页面,Android和ios的活动页面用web来做,方便更改,下面有几个小问题: 1.在Android和ios中,虽然web上面可以存localstorage,但是到了Android ...