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

被折叠的 条评论
为什么被折叠?



