mysql存储过程基本语法_MySql基本语法及存储过程学习

本文详细介绍MySQL存储过程的基础语法、变量定义、流程控制等,并演示如何通过API调用存储过程及其实现方法。此外还介绍了存储过程的调试技巧及实用案例。

2ff34e647e2e3cdfd8dca593e17d9b0a.png

今日概要MySql 基本语法学习

MySql 存储过程

WebView 嵌入 JavaScript 代码

WebView 修改 UserAgent

X5 访问外链的坑

Kotlin 正则表达式

大纲数据库的连接

数据库里的信息

查看数据库信息

调用存储过程

内容

数据库的连接

连接 MySQL 时需要提供 IP 地址、端口号、用户名、密码;

根据业务需求给该连接起个连接名称。

数据库里的信息

数据库里信息只需要关注数据表、函数(存储过程)、查询。数据表:项目中使用的业务数据存储的地方

函数(存储过程):常用查询代码的整理

查询:每天都会重复写的查询代码,可以保存在这里,不必须重复敲码

数据表1

2# 创建数据表

create table

存储过程

没有参数时,直接调用存储过程名称:1call pro_version

需要传参数时:1call pro_query_app_report_etl(9903, 3)

《调试文档 - 报表刷新状态》

查看存储过程需要传的参数:1show create procedure pro_query_app_report_etl

把 create procedure 字段的内存拷贝出来就可以看到存储过程的定义,及参数的定义。1

2

3

4

5CREATE DEFINER=`shengyiplus`@`%` PROCEDURE

`pro_query_app_report_etl`

(in var_report_id varchar(50),in var_day varchar(50))

...

end

返回结果,存储过程中 select 的结果集就是返回的结果。

接口调用实现存储过程

通过调用接口,把存储过程名称作为参数传入

通过接口获取存储过程执行的结果

实现存储过程

如上

通过调用接口,把存储过程名称作为参数传入

存储过程若无参数1get /api/v2/procedure/data?api_token=288d848d3bdf31ec764e2af72669bb90&procedure=shengyiplus_s.pro_manage_expense_p1&ordered_params

有参数时使用ordered_params 决定了参数的数量及顺序

后面给 ordered_params 中的参数赋值,若无则赋值为空1get /api/v2/procedure/data?api_token=288d848d3bdf31ec764e2af72669bb90&procedure= shengyiplus_s.pro_manage_expense_chart&[email protected]&month=201711&city=深圳市

delimiter

delimiter 告诉 mysql 解释器,该段命令是否已结束。

默认情况下,delimiter 是分号 ;

在命令行客户端中,如果有一行命令以分号结束,那么回车后,mysql 将会执行该命令。

输入下面的语句:1msyql> select * from test_table;

然后回车,那么 mysql 会立即执行该语句。

但有时候,不希望 mysql 这么做,可能输入较多的语句,且语句中包含有分号。

如试图在命令行客户端中输入如下语句1

2

3

4

5

6

7

8

9drop procedure if exists pr_param_in;

create procedure pr_param_in(in id int)

begin

if (id is not null) then

set id = id + 1;

end if;

select id as id_inner;

end;

默认情况下,不可能等到用户把这些语句全部输入完之后,再执行整段语句。

因为 MySQL 一遇到分号,它就要自动执行。

这种情况下,就需要事先把 delimiter 换成其它符号,如 ;;

这样只有当 ;; 出现之后,MySQL 解释器才会执行这段语句

完整的示例:1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16drop procedure if exists pr_param_in;

delimiter ;; -- 声明以 ;; 作为结束符告诉 mysql 已可以运行

create procedure pr_param_in(in id int)

begin

if (id is not null) then

set id = id + 1;

end if;

select id as id_inner;

end;

;; -- 告诉 mysql 可以执行上述代码

delimiter ; -- 恢复结束符

存储过程

一组 sql 语句集,功能强大,可以实现一些比较复杂的逻辑功能;

存储过程跟触发器有点类似,都是一组 sql 集,但是存储过程是主动调用的,且功能比触发器更加强大,触发器是某件事触发后自动调用;

每句 sql 记得在行尾加分号

基本语法:1

2

3

4

5

6

7drop procedure if exists `proc_if`;

delimiter ;;

create definer=`root`@`localhost` procedure `proc_if`

begin

end

;;

delimiter ;delimiter ;;:之前说过了,把默认的输入的结束符;替换成;;。

definer:创建者;

变量

三种定义方式:declare

这种方式定义的变量,语句的位置必须在begin下,同时要带上参数类型。1declare tname varchar(50);set

这种方式定义的变量,定义同时赋值,语句的位置可以任意出现,不需要带上参数类型,但定义的变量是会话变量,如果想定义局部变量,[email protected]1set @aa='xxx';select

性质同上一个set,但是这个可以通过插询记录去赋值1

2set @var=(select cnm from tbnm);

select @var=cnm from tbnm;

prepare1

2

3prepare statement_name from sql_text /*定义*/

execute statement_name [using variable [,variable...]] /*执行预处理语句*/

deallocate prepare statement_name /*删除定义*/

实例

更新所有数据表的字符串为 utf81

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20begin

declare done boolean default 0;

declare tbl_name varchar(255);

declare t_index cursor for select ist.table_name from information_schema.tables as ist where ist.table_schema = 'shengyiplus_pro' and ist.table_type = 'base table';

declare continue handler for sqlstate '02000' set done = 1;

open t_index;

repeat

fetch t_index into tbl_name;

set @sql = concat('alter table ', tbl_name, ' convert to character set utf8;');

prepare stmt from @sql; -- 定义

execute stmt; -- 执行

deallocate prepare stmt;-- 释放

until done end repeat;

close t_index;

end

存储过程列表

方法一:1show procedure status;

方法二:1

2

3

4

5

6

7

8select

routine_schema as database_name

, routine_name as procedure_name

from information_schema.routines

where routine_schema = database()

and routine_name like 'pro_%'

and routine_type = 'PROCEDURE'

order by routine_name asc

参考

WebView 嵌入 JavaScript 代码方法写在 WebView 的 WebViewClient 的 onPageFinished 方法中1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16@Override

public void onPageFinished(WebView view, String url)

{

super.onPageFinished(view, url);

webview.loadUrl("javascript:(function(){" +

"var objs=document.getElementsByTagName("span");" +

"for(var i=0;i

"{"

+ " objs[i].onclick=function() " +

" { "

+ " window.authorlistener.openAuthor(this.getAttribute('data-author-id')); " +

" window.textlistener.openText(this.getAttribute('data-source-id')); "+

" } " +

"}" +

"})()");

}替换 UserAgent 中的 Chrome 版本为最新1

2val userAgentWithNewChromeVersion = Regex("[Cc]hrome/[0-9.]*\s+").replace(webSettings?.userAgentString!!, "Chrome/57.0.2987.132 ")

webSettings.setUserAgent(userAgentWithNewChromeVersion)

TipsQ : 阿里云数据可视化网页打开提示”请尝试使用Chrome最新版本浏览”A : 查看网页源码,发现有一个浏览器检查的 js , js 使用了查看浏览器版本信息的 UserAgent 插件 UAParser 测试连接 ,js 中通过插件获取浏览器信息,发现只支持 Chrome (主版本大于等50) 和 Safari(主版本大于等于10)

而我们的应用嵌入了 X5 内核浏览器,综上所诉三个坑设备在硬件上不支持 X5

js 没有判断腾讯的 X5 内核浏览器(既 MQQBrowser)

在把 UserAgent 中的 X5 信息去掉之后,依然有问题,去掉 wv 会提示 Browser 为Android Browser ,再去掉 Version/4.0 之后 Browser 变为 ChromeBrowser 为 Chrome WebView

Mozilla/5.0 (Linux; Android 6.0.1; SM919 Build/MXB48T; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/57.0.2987.132 Mobile Safari/537.36

Browser 为 Chrome

Mozilla/5.0 (Linux; Android 6.0.1; SM919 Build/MXB48T) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.97 Mobile Safari/537.36

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值