4. 存储过程 · sql编程
1、存储过程框架
变量:局部、全局、内置
declare 仅用在begin...end中, 声明的是局部变量, 作用范围也仅在此begin...end中
declare 前不能有任何其他非declare语句
declare v1, v2, v3 int default 0; -- 无default则初始值为null
declare a, b int;
set a = 10, b = 20
全局变量: 以@开头如@a
set @a = 100; select @a := 'xyz';
begin
declare a int;
declare b int default 200;
set a = 100;
select a, b, @a; -- 可以获取全局变量@a
end
@@ 内置系统变量
select @@version;
select @@sql_mode;
例子1:
drop procedure if exists sp1;
delimiter // ---定义//为结束符
create procedure sp1(stuID int,stuName varchar(16),c int ,d varchar(64) charset utf8) ---默认为In
begin
insert into stu select stuID,stuName,c,d;
end //
delimiter ; ---恢复;为结束符 注意空格
call sp1(20,'kitty',3,'长沙'); ---传入值
存储过程 stored procedure
优点:较快的执行速度,减少网络流量
sp是数据库内的一种对象, 与表一样, call ds.sp1();
一段sql语句的集合, 无返回值 可以接收参数, 可以没有参数, 可以传出参数 用户自定义的
例 2:
drop procedure if exists sp1;
delimiter //
create procedure sp1()
begin
declare a int default 0;
select count(1) into a from information_schema.columns where table_schema = 'ds' && table_name= 'stu' && column_name = 'stuAddr';
if a = 1 then
select 'stuAddr haved';
else
alter table stu add stuAddr varchar(32);
end if;
end//
delimiter ;
call sp1();
例 3:
delimiter //
create procedure sp1(out a int) ---传出值
begin
select count(distinct deptID) into a from stu;
end //
delimiter ;
call sp1(@x); -- 用@x来接收这个传出来的值a
select @x;
例 4:
create procedure sp1(a int, b int, out c int)
begin
select a + b into c;
end //
delimiter ;
call sp1(10, 20, @x); ---传入、传出
select @x;
例 5:
sp1(inout a int) ---传入又传出
begin
set a = a + 10;
end
set @x = 10;
call sp1(@x); ---传入
select @x; ---传出更新
查看与删除 sp
show procedure status\G
show procedure status like 'sp1'\G
show create procedure sp1\G
select * from information_schema.routines\G
select * from mysql.proc\G
drop procedure if exists sp1;
2、sp 应用
判断(if)
if a = 100 then – 注意判断相等就是=
select ‘a’;
select ’b’;
elseif a = 200 then
…
else
…
end if;
if a >= 0 && a <= 10 then -- between and也可
set @a = 1; if @a即可
判断(case)
case operator
简单格式:
set @a = 10;
select case @a when 10 then ‘abc’ when 20 then ‘def’ else ‘xyz’ end;
select case age when 20 then salary*1. 2 when 30 then salary*1.3 else salary*1.4 end from ds.emp;
搜索格式:
select case
when age >= 20 && age < 30 then
salary * 1.1
when age >= 30 then
salary * 1.2
else
salary
end from stu;
case statement 搜索格式:
when @a >= 80 && @a <= 100 then
‘abc’
when @a >= 60 && @a < 80 then
‘ def’
else
‘xyz’
end;
while 循环
delimiter //
create procedure sp1()
begin
declare i int default 0;
while i <= 5
do
select i;
set i = i + 1;
end while;
end //
delimiter ;
循环写入数据
insert into t1 values (i, concat('tom', i));
循环中的leave 与 iterate
作用同break与continue
declare a int default 1;
aix:while a <= 10
do
if a % 2 = 0 then
leave aix;
#set a = a + 1;
#iterate aix; 跳过当前循环, 即不执行后面的语句, 进入下一轮循环
end if;
select a;
set a = a + 1;
end while;
repeat … until循环(相当于do…while)
declare i int default 1;
repeat
select i;
set i = i + 1;
until i > 5 end repeat;
function
可传入参数, 也可无参数传入
没有参数传出 必须有返回值
函数体中不可有create table、drop table、select结果
格式:
drop function if exists fun1;
delimiter //
create function fun1(a varchar(32) [charset utf8]) ----定义函数,设置参数,字符集
returns varchar(32) [charset utf8] ----返回值格式
begin
declare x varchar(32) charset utf8;
set x = concat('hello ', a, ' !');
return x; ----返回值
#return concat('hello ', a, ' !'); 也可, begin...end都可不要 #多条语句时就用begin...end括起来
end//
delimiter ;
select fun1('tom'); ----调用函数
例子:
drop function if exists fun1;
delimiter //
create function fun1( a varchar(32) charset utf8, b int)
returns varchar(32) charset utf8
begin
if isnull(a) || char_length(a) = 0 then
return 'error';
elseif char_length(a) <= b then
return a;
else
return concat (left(a,b),'...');
end if;
end//
delimiter ;
select fun1('abc',3)
cursor
drop procedure if exists sp1;
delimiter //
create procedure sp1()
begin
declare a int;
declare b varchar(16);
declare cur cursor for select stuID,stuName from stu order by stuID; ----声明游标
open cur; ----打开游标
fetch cur into a,b; ----获取游标
fetch cur into a,b; ---a,b不能是全局变量,可用循环获取数据
select a,b;
close cur; ----关闭游标
end//
delimiter ;
event 事件
类似linux下的crontab
show variables like '%event%'; 或者 select @@event_scheduler;
默认是关闭的,set global event_scheduler = on 或= 1
格式:
drop event if exists ev1;
create event ev1
on schedule every 1 minute
do
insert into t1(f1) values (now()); ----只有一条语句,可以不用begin…..end
----立即启动, 只做一次
on schedule at now() -- show events不见了
----30秒后启动, 只做1次:
on schedule at now() + interval 30 second -- show events不见了
alter event ev1 enable|disable;
view (视图)
虚拟表, 数据库中的对象,主要用来查看数据
数据放在表中, 视图中没有数据
基表的数据变化会自动在视图中体现出来
权限控制, 只让用户看到某些列某些行,将多表查询的结果放在视图中
删除视图不影响基表及其数据,不会向视图增删改数据, 视图只用来查数据
例子:
drop view if exists v1;
create view v1
as
select empName, empAddr from emp where ifnull(salary, 0) > 3000;
create view v2
as
select bookName, pressName, authorName from book b, press p, author a
where b.pressID = p.pressID && b.authorID = a.authorID;
查看视图:
desc v1;
show tables; ----这里视图可以看出一张表
show create view v1\G
select * from information_schema.views;
转载于:https://www.cnblogs.com/51runsky/p/005f7a5df6cdcdb5ac8469f343bdfda8.html
4. 存储过程 · sql编程相关推荐
- MySQL5_存储过程-sql编程-函数-触发器-用户管理
文章目录 MySQL_存储过程-sql编程-函数-触发器-用户管理 建立表 1.存储过程(procedure) (1)创建存储过程 (2)参数的类别 (3)删除存储过程 (4)查看存储过程的信息 (5 ...
- sqL编程篇(三) 游标与存储过程
sql编程2 游标与存储过程 sql编程中的游标的使用: 提供的一种对查询的结果集进行逐行处理的一种方式 不用游标的处理解决方式: 逐行修改工资 update salar set 工资='新工资' w ...
- Oracle学习2 视图 索引 sql编程 游标 存储过程 存储函数 触发器
---视图 ---视图的概念:视图就是提供一个查询的窗口,来操作数据库中的数据,不存储数据,数据在表中. ---一个由查询语句定义的虚拟表.---查询语句创建表 create table emp as ...
- pl/sql编程基础
PL/SQL 1.过程.函数.触发器是pl/sql编写的 2.过程.函数.触发器是存放在oracle数据库中的 3.pl/sql是非常强大的过程化语言 4.过程.函数.触发器可以在java程序中调用 ...
- ORACLE PL/SQL编程之六:把过程与函数说透(穷追猛打,把根儿都拔起!)
原文:ORACLE PL/SQL编程之六:把过程与函数说透(穷追猛打,把根儿都拔起!) ORACLE PL/SQL编程之六: 把过程与函数说透(穷追猛打,把根儿都拔起!) 继上篇:ORACLE P ...
- oracle pl/sql编程详细,Oracle框架:PL/SQL编程:
PL/SQL编程 一:什么是PL/SQL (1.)PL/SQL体系结构: PL/SQL引擎用来编译和执行,PL/SQL块或子程序,该引擎驻留在Oracle服务器中. (2.)PL/SQL块简介 PL/ ...
- 15、sql编程基本语法介绍
使用sql也可以像java一样进行程序编写,说到编程,就离不开变量和流程控制,接下来介绍一下 变量 sql中的变量可分为系统变量和自定义变量 系统变量 用于控制服务器表现的变量 查看所有系统变量 sh ...
- PL/SQL编程基本概念
/* =============================================================================pl/sql编程 =========== ...
- [顶]ORACLE PL/SQL编程详解之二:PL/SQL块结构和组成元素(为山九仞,岂一日之功)...
[顶]ORACLE PL/SQL编程详解之二:PL/SQL块结构和组成元素(为山九仞,岂一日之功) 原文:[顶]ORACLE PL/SQL编程详解之二:PL/SQL块结构和组成元素(为山九仞,岂一日之 ...
最新文章
- MxGraph从入门到精通之4:布局
- 系统优化怎么做-Linux系统配置优化
- Anaconda:成功解决利用conda下载pytorch和torchvision时速度超慢的问题
- 机器学习实战:PCA降维 样本协方差
- java求正整数和_求连续正整数的和-Java
- git 合并其他分支代码到自己的分支
- 微型计算机ROW,微型计算机原理与汇编语言程序设计 第3章 80x86微处理器及其体系结构zrow0c_d.ppt...
- 51单片机的矩阵键盘、跑马灯和呼吸灯设计
- KEPServerEX V6轻松连接Wonderware InTouch
- 小米卸载动画-图标爆炸实现
- 腾讯回应“暴力裁员”
- ArcGIS10.0专题图制作文档
- 计蒜客 蒜头君的积木
- 古墓丽影暗影显卡测试软件,游戏新消息:战地5古墓丽影暗影8K测试单显卡根本带不动...
- JAVA8元空间是什么?
- android 权限模型,android-棉花糖权限模型在Airbnb中的AccountManager getAccounts()异常,该怎么做?...
- 美股上市游戏公司第九城市入局链游平台Dontplaywithkitty.io
- 百度小程序命中搜索算法的常见问题(官方解读)
- 小米路由(OpenWrt)折腾记(二)-- 搭建LLMP服务
- One ID中的核心技术ID-Mapping究竟是怎么实现的?
热门文章
- java项目遇到风险漏洞示例与解决方案
- h5游戏间接转换为微信小游戏
- 【论文阅读】Phase-aware speech enhancement with deep complex U-net
- R语言迹检验协整关系式_使用R语言进行协整关系检验
- RollBack RX Professional 设置快照教程
- 温度变送器转换程序c语言,两线制智能温度变送器的设计
- dns服务器经赏要修复,十要诀帮你修复DNS域名解析服务故障
- HTML+CSS基础文字和字体
- 《ISLR》学习笔记 —— Bagging、随机森林、Boosting
- 平面设计转UI设计难吗?