使用存储过程:
存储过程可以改变SQL语句的运行性能,提高执行效率;还可以作为一种安全机制,使用户通过它来访问未被授权的表和视图。存储过程包括的创建、执行、查看、修改和删除
概念:存储过程是一组预先编译好的Transact-SQL语句。
存储过程为标准SQL增加了几种功能,这些功能正是SQL语句所缺少的,增加的功能详细说明
如下:
1.条件执行
在存储过程中录入一套Transact-SQL语句后,可以使用Transact-SQL的IF…THEN…ELSE结构根据存储过程中其他语句的执行返回的结果来决定执行过程中的某条语句。
2.循环控制结构
Tracsact-SQL语句中的WHILE语句和FOR语句允许重复执行一系列语句,知道满足某种终止条件
3.命名变量
可以在存储过程中使用命名的内存位置(即变量)来保存通过参数传向过程的值,以及由过程内的查询返回的值或是由某些其他方法计算的值。
4.命名过程
在存储过程中放入一条或多条Transact-SQL语句并添加了条件执行和循环控制结构之后,可以为存储过程起一个名称通过正式的输入和输出参数把数据传入过程或从过程传出来。
并且,一旦定义和编译之后,可以通过名称在触发器中调用,在交互环境中通过SQL Server数据库中的SQL Query Analyzer调用,也可以在应用程序中调用,甚至还可以作为标准SQL语句的子句来使用。
5.语句块
通过调用存储过程可以让DBMS执行一系列SQL语句,就像执行单条语句一样
sql server的存储过程
一、创建存储过程(sql server的存储过程)
利用CREATE PROCEDURE 语句来创建存储过程。
语法如下:
CREATE PROC [EDURE] procedure_name
[ { @parameter data_type}
[ = default] [OUTPUT]]
AS sql_statement [ ...n]
参数 参数说明
procedure_name 新存储过程的名称。过程名必须符合标识符规则,且对于数据库及其所有者必须唯一
@parameter 过程中的参数
data_type 参数的数据类型
default 参数的默认值。默认值必须是常量或NULL。如果定义了默认值,不必指定该参数的值即可执行过程。如果使用LIKE关键字,默认值可以包含通配符%、_、[]和[^]
OUTPUT 表名参数的返回参数,该选项的值可以返回给EXEC[UTE].使用OUTPUT参数可将信息返回给调用过程。text、ntext和image参数可用作OUTPUT关键字。使用OUTPUT关键字的输出参数可以是游标占位符
AS 指定过程要执行的操作
sql_statement 过程中要包含的任意数目和类型的Transact-SQL语句
执行过程:EXEC procedure_name
二、查看存储过程
1.sp_helptext,查看存储过程的文本信息
sp_helptext [@objname = ] 'name'
2.sp_depends,查看存储过程的相关信息
3.sp_help,查看存储过程的一般信息
三、修改存储过程
ALTER PROCEDURE 语句的语法如下:
ALTER PROC [EDURE] procedure_name
[ { @parameter data_type}
[ = default] [OUTPUT]]
AS sql_statement [ ...n]
四、删除存储过程
DROP 语句的语法如下:
DROP PROCEDURE procedure_name
Oracle的存储过程
一、创建存储过程(Oracle的存储过程)
语法如下:
CREATE [OR REPLACE] PROCEDURE<过程名>
(<参数1>,[方式1]<数据类型1>,
<参数1>,[方式1]<数据类型1>
…)
IS|AS
PL/SQL过程体;
存储过程的参数有3中类型,分别如下:
1.IN参数类型
这是一个输入类型的参数,表示这个参数输入给存储过程,供存储过程使用。
2.OUT参数类型
这是个输出类型的参数,表示这个参数在存储过程中被赋值,可以传给过程体以外的部分或环境。
例如:使用IN将in_sex参数值输入给存储过程,
使用OUT将out_num参数值输出给存储过程以外的部分或者环境,
代码如下:
CREATE OR PEPLACE PROCEDURE insert_dept
(num_deptno in number, --定义IN模式的变量num_deptno,用来存储部门编号
var_ename in varchar2, --定义IN模式的变量var_ename,用来存储部门名称
var_loc in varchar2,
var_dname OUT dept.dname%type, --定义OUT模式变量,可以存储部门名称并输出
) IS
3.IN OUT 参数类型
这种类型的参数其实是综合了上述两种参数类型,既向过程体传值,又在过程体中被赋值传向过程体外
例如,使用IN OUT 将in_out_num参数值向过程体传送值,在过程体中也被赋值传向过程体外。
代码如下:
CREATE OR PEPLACE PROCEDURE double
(in_out_num IN OUT number) AS --IN OUT类型参数
BEGIN
in_out_num := in_out_num * 2;
END double;
二、
例:创建一个存储过程pro_square,在其中定义一个IN OUT 参数,该存储过程用来计算这个参数的平方或平方根。
1.输入:
CREATE OR REPLACE PROCEDURE pro_square
(num IN OUT number, --计算它的平方或平方根,这是一个IN OUT 参数
flag IN boolean --计算平方或平方根的标识,这是一个 IN 参数
) IS
BEGIN
IF flag THEN
num := power(num,i); --计算平方
ELSE
num :=sqrt(num); --计算平方根
END IF ;
END ;
2.执行存储过程:
set serveroutput on
DECLARE
var_number number; --存储要进行运算的值和运算后的结果
var_temp number; --存储要进行运算的值
boo_flag boolean; --平方或平方根的逻辑标记
BEGIN
var_temp := 3; --变量赋值
var_number :=var_temp;
boo_flag :=false; --false表示计算平方根;true表示计算平方
pro_square(var_temp,boo_flag); --调用存储过程pro_square
IF boo_flag THEN
dbms_output.put_line(var_temp || '的平方是: ' || var_number) ;--输出计算结果
ELSE
dbms_output.put_line(var_temp || '的平方根是: ' || var_number) ;
END IF;
END;
3.输出结果:
3的平方根是: 1.732050...
三、删除存储过程
DROP PROCEDURE count_num;
重新创建存储过程pro_square,代码如下:
CREATE OR REPLACE PROCEDURE pro_square()
在MYSQL数据库下创建存储过程
一、创建存储过程(mysql的存储过程)
CREATE PROCEDURE procedure_name(in parameter intrger)
BEGIN
DECLARE
variable varchar(20);
IF
parameter =1
THEN
SET variable ='SQL';
ELSE
SET variable ='MYSQL';
END IF;
INSERT INTO tb_table(tb_name) VALUES (variable)
END ;
二、执行
use shop;
CALL proc(@a);