CREATE PROCEDURE
1 CREATE PROCEDURE(创建)
CREATE PROCEDURE存储过程名(參数列表) BEGIN SQL语句代码块 END |
注意:
由括号包围的參数列必须总是存在。假设没有參数,也该使用一个空參数列()。每一个參数默认都是一个IN參数。要指定为其他參数,可在參数名之前使用关键词 OUT或INOUT
在mysqlclient定义存储过程的时候使用delimiter命令来把语句定界符从;变为//。
当使用delimiter命令时,你应该避免使用反斜杠(‘"’)字符,由于那是MySQL的转义字符。
如:
mysql> delimiter // mysql> CREATE PROCEDURE simpleproc (OUT param1 INT) -> BEGIN -> SELECT COUNT(*) INTO param1 FROM t; -> END -> // Query OK, 0 rows affected (0.00 sec) |
1.2 ALTER PROCEDURE(改动)
ALTER PROCEDURE存储过程名SQL语句代码块 |
这个语句能够被用来改变一个存储程序的特征。
1.3 DROP PROCEDURE(删除)
DROP PROCEDURE IF EXISTS存储过程名 eg:DROP PROCEDURE IF EXISTS proc_employee (proc_employee存储过程名) |
这个语句被用来移除一个存储程序。不能在一个存储过程中删除还有一个存储过程,仅仅能调用还有一个存储过程
1.4 SHOW CREATE PROCEDURE(类似于SHOW CREATE TABLE,查看一个已存在的存储过程)
SHOW CREATE PROCEDURE存储过程名 |
1.5 SHOW PROCEDURE STATUS(列出全部的存储过程)
SHOW PROCEDURE STATUS |
1.6 CALL语句(存储过程的调用)
CALL存储过程名(參数列表) |
CALL语句调用一个先前用CREATE PROCEDURE创建的程序。
CALL语句能够用声明为OUT或的INOUT參数的參数给它的调用者传回值。
存储过程名称后面必须加括号,哪怕该存储过程没有參数传递
1.7 BEGIN ... END(复合语句)
[begin_label:] BEGIN [statement_list] END [end_label] |
存储子程序能够使用BEGIN ... END复合语句来包括多个语句。
statement_list代表一个或多个语句的列表。statement_list之内每一个语句都必须用分号(;)来结尾。
复合语句能够被标记。除非begin_label存在,否则end_label不能被给出,而且假设二者都存在,他们必须是相同的。
1.8 DECLARE语句(用来声明局部变量)
DECLARE语句被用来把不同项目局域到一个子程序:局部变量
DECLARE仅被用在BEGIN ... END复合语句里,而且必须在复合语句的开头,在不论什么其他语句之前。
1.9 存储程序中的变量
1.1 DECLARE局部变量
DECLARE var_name[,...] type [DEFAULT value] 这个语句被用来声明局部变量。 要给变量提供一个默认值,请包括一个DEFAULT子句。 值能够被指定为一个表达式,不须要为一个常数。 假设没有DEFAULT子句,初始值为NULL。 局部变量的作用范围在它被声明的BEGIN ... END块内。 它能够被用在嵌套的块中,除了那些用同样名字声明变量的块。 |
1.2 变量SET语句
SET var_name = expr [, var_name = expr] 在存储程序中的SET语句是一般SET语句的扩展版本号。 被參考变量可能是子程序内声明的变量,或者是全局server变量。 在存储程序中的SET语句作为预先存在的SET语法的一部分来实现。这同意SET a=x, b=y, ...这种扩展语法。 当中不同的变量类型(局域声明变量及全局和集体变量)能够被混合起来。 这也同意把局部变量和一些仅仅对系统变量有意义的选项合并起来。 |
1.3 SELECT ... INTO语句
SELECT col_name[,...] INTO var_name[,...] table_expr 这个SELECT语法把选定的列直接存储到变量。 因此,仅仅有单一的行能够被取回。 SELECT id,data INTO x,y FROM test.t1 LIMIT 1; 注意,用户变量名在MySQL 5.1中是对大写和小写不敏感的。 |
重要: SQL变量名不能和列名一样。假设SELECT ... INTO这种SQL语句包括一个对列的參考,并包括一个与列同样名字的局部变量,MySQL当前把參考解释为一个变量的名字。
1.10 MySQL存储过程參数类型(in、out、inout)
此小节内容来自:
參见地址:http://www.blogjava.net/nonels/archive/2009/04/22/233324.html
MySQL存储过程參数(in)
MySQL存储过程 “in”參数:跟 C语言的函数參数的值传递类似, MySQL存储过程内部可能会改动此參数,但对 in类型參数的改动,对调用者(caller)来说是不可见的(not visible)。 |
MySQL存储过程參数(out)
MySQL存储过程 “out”參数:从存储过程内部传值给调用者。在存储过程内部,该參数初始值为 null,不管调用者是否给存储过程參数设置值 |
MySQL存储过程參数(inout)
MySQL存储过程 inout參数跟 out类似,都能够从存储过程内部传值给调用者。不同的是:调用者还能够通过 inout參数传递值给存储过程。 |
总结
假设只想把数据传给 MySQL存储过程,那就使用“in”类型參数;假设只从 MySQL存储过程返回值,那就使用“out”类型參数;假设须要把数据传给 MySQL存储过程,还要经过一些计算后再传回给我们,此时,要使用“inout”类型參数。 |
1.11 样例:
1.1 创建存储过程
带(输出參数)返回值的存储过程:
--删除存储过程 DROP PROCEDURE IF EXISTS proc_employee_getCount --创建存储过程 CREATE PROCEDURE proc_employee_getCount(out n int) BEGIN SELECT COUNT(*) FROM employee ; END --MYSQL调用存储过程 CALL proc_employee_getCount(@n); |
带输入參数的存储过程:
--删除存储过程 DROP PROCEDURE IF EXISTS proc_employee_findById; --创建存储过程 CREATE PROCEDURE proc_employee_findById(in n int) BEGIN SELECT * FROM employee where id=n; END --定义变量 SET @n=1; --调用存储过程 CALL proc_employee_findById(@n); |
操作存储过程时应注意:
1. 删除存储过程时仅仅须要指定存储过程名就可以,不带括号;
2. 创建存储过程时,无论该存储过程有无參数,都须要带括号;
3. 在使用SET定义变量时应遵循SET的语法规则;
SET @变量名=初始值;
4. 在定义存储过程參数列表时,应注意參数名与数据库中字段名差别开来,否则将出现无法预期的结果
CREATE PROCEDURE的更多相关文章
- 翻译:CREATE PROCEDURE语句(已提交到MariaDB官方手册)
本文为mariadb官方手册:CREATE PROCEDURE的译文. 原文:https://mariadb.com/kb/en/create-procedure/我提交到MariaDB官方手册的译文 ...
- SQL _ Create Procedure
-- ================================================ -- Template generated from Template Explorer usi ...
- sql: Oracle 11g create procedure
CREATE OR REPLACE PROCEDURE proc_Insert_BookKindList ( temTypeName nvarchar2, temParent int ) AS nco ...
- SQL Server 在多个数据库中创建同一个存储过程(Create Same Stored Procedure in All Databases)
一.本文所涉及的内容(Contents) 本文所涉及的内容(Contents) 背景(Contexts) 遇到的问题(Problems) 实现代码(SQL Codes) 方法一:拼接SQL: 方法二: ...
- sql:MySql create FUNCTION,VIEW,PROCEDURE
use geovindu; #函数 DELIMITER $$ drop function if exists f_GetDepartmentName $$ CREATE function f_GetD ...
- sql:Mysql create view,function,procedure
create database Liber; use Liber; #顯示數据庫 20150210 Geovin Du 涂聚文 SHOW DATABASES; drop table BookKindL ...
- Create MSSQL Procedure
代码: CREATE PROCEDURE [dbo].[sp_UpdateCouponCount] AS GO
- 解决sql server中批处理过程中“'CREATE/ALTER PROCEDURE 必须是查询批次中的第一个语句”
在批处理中加字段或表或视图或存储过程是否存在的判断 -----------------------------------------line----------------------------- ...
- Oracle: 禁忌给一般用户授权create any procedure、execute any procedure
给一般用户授 create any procedure.execture any procedure 这2个权限是很不安全的事. 因为授权后,通过一些处理,该用户可以取得dba权限,请一定注意. 下面 ...
随机推荐
- App版本更新时对SQLite数据库升级或者降级遇到的问题
SQLite是Android内置的一个很小的关系型数据库.SQLiteOpenHelper是一个用来辅助管理数据库创建和版本升级问题的抽象类.我们可以继承这个抽象类,实现它的一些方法来对数据库进行自定 ...
- 查看哪些ip破解你ssh密码以及次数
在互联网中,总有一些无聊的人,每天不断的猜解别人服务器的密码!作为linux服务器的管理员,我们应该了解哪些IP经常不断地扫描我们的SSH端口以尝试暴力破解,下面我们用一条命令简单列出哪些IP破解你S ...
- http status 源码
private static readonly String[][] s_HTTPStatusDescriptions = new String[][] { null, new String[] { ...
- 今天上传公司服务器出现的.net framework版本错误问题
今天做好一个网站(.net4.0),里面有静态页面也有aspx页面,发布后,满心欢喜的上传到服务器,运行后,静态页没有问题,可是通过导航栏一旦点击进入aspx页面,就会出现错误 ,提示web.conf ...
- 数据库分库分表(sharding)系列(五) 一种支持自由规划无须数据迁移和修改路由代码的Sharding扩容方案
作为一种数据存储层面上的水平伸缩解决方案,数据库Sharding技术由来已久,很多海量数据系统在其发展演进的历程中都曾经历过分库分表的Sharding改造阶段.简单地说,Sharding就是将原来单一 ...
- OpenGL ES 2.0 曲面物体的构建
球体构建的基本原理构建曲面物体最重要的就是找到将曲面恰当拆分成三角形的策略. 最基本的策略是首先按照一定的规则将物体按行和列两个方向进行拆分,这时就可以得到很多的小四边形.然后再将每个小四边形拆分成两 ...
- 医院设置 codevs 2577
Floyd+二叉树 #include<iostream>#include<cstdlib>#include<cstdio>#include<cstring&g ...
- c# 中的线程和同步
一.新建线程的3种方法 a)异步委托:b)Thread类:c)线程池: 二.异步委托 1.简单使用,检查委托是否完成其任务 a) 通过 BeginInvoke() 的返回值IAsyncResult ...
- MFC线程(三):线程同步事件(event)与互斥(mutex)
前面讲了临界区可以用来达到线程同步.而事件(event)与互斥(mutex)也同样可以做到. Win32 API中的线程事件 HANDLE hEvent = NULL; void MainTestFu ...
- js页面加载进度条
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...