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;

来自为知笔记(Wiz)

转载于:https://www.cnblogs.com/51runsky/p/005f7a5df6cdcdb5ac8469f343bdfda8.html

4. 存储过程 · sql编程相关推荐

  1. MySQL5_存储过程-sql编程-函数-触发器-用户管理

    文章目录 MySQL_存储过程-sql编程-函数-触发器-用户管理 建立表 1.存储过程(procedure) (1)创建存储过程 (2)参数的类别 (3)删除存储过程 (4)查看存储过程的信息 (5 ...

  2. sqL编程篇(三) 游标与存储过程

    sql编程2 游标与存储过程 sql编程中的游标的使用: 提供的一种对查询的结果集进行逐行处理的一种方式 不用游标的处理解决方式: 逐行修改工资 update salar set 工资='新工资' w ...

  3. Oracle学习2 视图 索引 sql编程 游标 存储过程 存储函数 触发器

    ---视图 ---视图的概念:视图就是提供一个查询的窗口,来操作数据库中的数据,不存储数据,数据在表中. ---一个由查询语句定义的虚拟表.---查询语句创建表 create table emp as ...

  4. pl/sql编程基础

    PL/SQL 1.过程.函数.触发器是pl/sql编写的 2.过程.函数.触发器是存放在oracle数据库中的 3.pl/sql是非常强大的过程化语言 4.过程.函数.触发器可以在java程序中调用 ...

  5. ORACLE PL/SQL编程之六:把过程与函数说透(穷追猛打,把根儿都拔起!)

    原文:ORACLE PL/SQL编程之六:把过程与函数说透(穷追猛打,把根儿都拔起!) ORACLE PL/SQL编程之六: 把过程与函数说透(穷追猛打,把根儿都拔起!)   继上篇:ORACLE P ...

  6. oracle pl/sql编程详细,Oracle框架:PL/SQL编程:

    PL/SQL编程 一:什么是PL/SQL (1.)PL/SQL体系结构: PL/SQL引擎用来编译和执行,PL/SQL块或子程序,该引擎驻留在Oracle服务器中. (2.)PL/SQL块简介 PL/ ...

  7. 15、sql编程基本语法介绍

    使用sql也可以像java一样进行程序编写,说到编程,就离不开变量和流程控制,接下来介绍一下 变量 sql中的变量可分为系统变量和自定义变量 系统变量 用于控制服务器表现的变量 查看所有系统变量 sh ...

  8. PL/SQL编程基本概念

    /* =============================================================================pl/sql编程 =========== ...

  9. [顶]ORACLE PL/SQL编程详解之二:PL/SQL块结构和组成元素(为山九仞,岂一日之功)...

    [顶]ORACLE PL/SQL编程详解之二:PL/SQL块结构和组成元素(为山九仞,岂一日之功) 原文:[顶]ORACLE PL/SQL编程详解之二:PL/SQL块结构和组成元素(为山九仞,岂一日之 ...

最新文章

  1. MxGraph从入门到精通之4:布局
  2. 系统优化怎么做-Linux系统配置优化
  3. Anaconda:成功解决利用conda下载pytorch和torchvision时速度超慢的问题
  4. 机器学习实战:PCA降维 样本协方差
  5. java求正整数和_求连续正整数的和-Java
  6. git 合并其他分支代码到自己的分支
  7. 微型计算机ROW,微型计算机原理与汇编语言程序设计 第3章 80x86微处理器及其体系结构zrow0c_d.ppt...
  8. 51单片机的矩阵键盘、跑马灯和呼吸灯设计
  9. KEPServerEX V6轻松连接Wonderware InTouch
  10. 小米卸载动画-图标爆炸实现
  11. 腾讯回应“暴力裁员”
  12. ArcGIS10.0专题图制作文档
  13. 计蒜客 蒜头君的积木
  14. 古墓丽影暗影显卡测试软件,游戏新消息:战地5古墓丽影暗影8K测试单显卡根本带不动...
  15. JAVA8元空间是什么?
  16. android 权限模型,android-棉花糖权限模型在Airbnb中的AccountManager getAccounts()异常,该怎么做?...
  17. 美股上市游戏公司第九城市入局链游平台Dontplaywithkitty.io
  18. 百度小程序命中搜索算法的常见问题(官方解读)
  19. 小米路由(OpenWrt)折腾记(二)-- 搭建LLMP服务
  20. One ID中的核心技术ID-Mapping究竟是怎么实现的?

热门文章

  1. java项目遇到风险漏洞示例与解决方案
  2. h5游戏间接转换为微信小游戏
  3. 【论文阅读】Phase-aware speech enhancement with deep complex U-net
  4. R语言迹检验协整关系式_使用R语言进行协整关系检验
  5. RollBack RX Professional 设置快照教程
  6. 温度变送器转换程序c语言,两线制智能温度变送器的设计
  7. dns服务器经赏要修复,十要诀帮你修复DNS域名解析服务故障
  8. HTML+CSS基础文字和字体
  9. 《ISLR》学习笔记 —— Bagging、随机森林、Boosting
  10. 平面设计转UI设计难吗?