存储过程实例

存储过程实例
存储过程实例

存储过程的优点

2007-11-02 15:21

1.存储过程只在创造时进行编译即可,以后每次执行存储过程都不需再重新编译,而我们通常使用的SQL语句每执行一次就编译一次,所以使用存储过程可提高数据库执行速度。

2.经常会遇到复杂的业务逻辑和对数据库的操作,这个时候就会用SP来封装数据库操作。当对数据库进行复杂操作时(如对多个表进行Update,

Insert,Query,Delete时),可将此复杂操作用存储过程封装起来与数据库提供的事务处理结合一起使用。可以极大的提高数据库的使用效率,减少程序的执行时间,这一点在较大数据量的数据库的操作中是非常重要的。在代码上看,SQL 语句和程序代码语句的分离,可以提高程序代码的可读性。

3.存储过程可以设置参数,可以根据传入参数的不同重复使用同一个存储过程,从而高效的提高代码的优化率和可读性。

4.安全性高,可设定只有某此用户才具有对指定存储过程的使用权存储过程的种类:

(1)系统存储过程:以sp_开头,用来进行系统的各项设定.取得信息.相关管理工作,如 sp_help就是取得指定对象的相关信息。

(2)扩展存储过程以XP_开头,用来调用操作系统提供的功能

exec master..xp_cmdshell 'ping 10.8.16.1'

(3)用户自定义的存储过程,这是我们所指的存储过程常用格式

模版:Create procedure procedue_name [@parameter data_type][output] [with]{recompile|encryption} as sql_statement

解释:output:表示此参数是可传回的

with {recompile|encryption} recompile:表示每次执行此存储过程时都重新编译一次;encryption:所创建的存储过程的内容会被加密。

SQL存储过程实例

2007-11-02 15:24

实例1:只返回单一记录集的存储过程。

表银行存款表(bankMoney)的内容如下

要求1:查询表bankMoney的内容的存储过程

create procedure sp_query_bankMoney

as

select * from bankMoney

go

exec sp_query_bankMoney

注* 在使用过程中只需要把中的SQL语句替换为存储过程名,就可以了很方便吧!

实例2(向存储过程中传递参数):

加入一笔记录到表bankMoney,并查询此表中userID= Zhangsan的所有存款的总金额。

Create proc insert_bank @param1 char(10),@param2 varchar(20),@param3 varchar(20),@param4 int,@param5 int output

with encryption ---------加密

as

insert bankMoney (id,userID,sex,Money)

Values(@param1,@param2,@param3, @param4)

select @param5=sum(Money) from bankMoney where userID='Zhangsan'

go

在SQL Server查询分析器中执行该存储过程的方法是:

declare @total_price int

exec insert_bank '004','Zhangsan','男',100,@total_price output

print '总余额为'+convert(varchar,@total_price)

go

在这里再啰嗦一下存储过程的3种传回值(方便正在看这个例子的朋友不用再去查看语法内容):

1.以Return传回整数

2.以output格式传回参数

3.Recordset

传回值的区别:

output和return都可在批次程式中用变量接收,而recordset则传回到执行批次的客户端中。

实例3:使用带有复杂 SELECT 语句的简单过程

下面的存储过程从四个表的联接中返回所有作者(提供了姓名)、出版的书籍以及出版社。该存储过程不使用任何参数。

USE pubs

IF EXISTS (SELECT name FROM sysobjects

WHERE name = 'au_info_all' AND type = 'P')

DROP PROCEDURE au_info_all

GO

CREATE PROCEDURE au_info_all

AS

SELECT au_lname, au_fname, title, pub_name

FROM authors a INNER JOIN titleauthor ta

ON a.au_id = ta.au_id INNER JOIN titles t

ON t.title_id = ta.title_id INNER JOIN publishers p

ON t.pub_id = p.pub_id

GO

au_info_all 存储过程可以通过以下方法执行:

EXECUTE au_info_all

-- Or

EXEC au_info_all

如果该过程是批处理中的第一条语句,则可使用:

au_info_all

实例4:使用带有参数的简单过程

CREATE PROCEDURE au_info

@lastname varchar(40),

@firstname varchar(20)

AS

SELECT au_lname, au_fname, title, pub_name

FROM authors a INNER JOIN titleauthor ta

ON a.au_id = ta.au_id INNER JOIN titles t

ON t.title_id = ta.title_id INNER JOIN publishers p

ON t.pub_id = p.pub_id

WHERE au_fname = @firstname

AND au_lname = @lastname

GO

au_info 存储过程可以通过以下方法执行:

EXECUTE au_info 'Dull', 'Ann'

EXECUTE au_info @lastname = 'Dull', @firstname = 'Ann'

-- Or

EXECUTE au_info @firstname = 'Ann', @lastname = 'Dull'

-- Or

EXEC au_info 'Dull', 'Ann'

-- Or

EXEC au_info @lastname = 'Dull', @firstname = 'Ann'

-- Or

EXEC au_info @firstname = 'Ann', @lastname = 'Dull'

如果该过程是批处理中的第一条语句,则可使用:

au_info 'Dull', 'Ann'

-- Or

au_info @lastname = 'Dull', @firstname = 'Ann'

-- Or

au_info @firstname = 'Ann', @lastname = 'Dull'

实例5:使用带有通配符参数的简单过程

CREATE PROCEDURE au_info2

@lastname varchar(30) = 'D%',

@firstname varchar(18) = '%'

AS

SELECT au_lname, au_fname, title, pub_name

FROM authors a INNER JOIN titleauthor ta

ON a.au_id = ta.au_id INNER JOIN titles t

ON t.title_id = ta.title_id INNER JOIN publishers p

ON t.pub_id = p.pub_id

WHERE au_fname LIKE @firstname

AND au_lname LIKE @lastname

GO

au_info2 存储过程可以用多种组合执行。下面只列出了部分组合:

EXECUTE au_info2

-- Or

EXECUTE au_info2 'Wh%'

-- Or

EXECUTE au_info2 @firstname = 'A%'

-- Or

EXECUTE au_info2 '[CK]ars[OE]n'

-- Or

EXECUTE au_info2 'Hunter', 'Sheryl'

EXECUTE au_info2 'H%', 'S%' = 'proc2'

存储过程的典型例子

可能有不少朋友使用SQL SERVER做开发也已经有段日子,但还没有或者很少在项目中使用存储过程,或许有些朋友认为根本没有必要使用存储过程等等。其实当你一个项目做完到了维护阶段时,就会发现存储过程给我们带来了好处了,修改方便,不能去改我们的应用程序,只需要改存储过程的内容,而且还可以使我们的程序速度得到提高。 QUOTE: SQL SERVER 联机丛书中的定义: 存储过程是保存起来的可以接受和返回用户提供的参数的 Transact-SQL 语句的集合。 可以创建一个过程供永久使用,或在一个会话中临时使用(局部临时过程),或在所有会话中临时使用(全局临时过程)。 也可以创建在 Microsoft SQL Server 启动时自动运行的存储过程。 要使用存储过程,首先我们必需熟悉一些基本的T-SQL语句,因为存储过程是由于一组T-SQL语句构成的,并且,我们需要了解一些关于函数、过程的概念,因为我们需要在应用程序中调用存储过程,就像我们调用应用程序的函数一样,不过调用的方法有些不同。 下面我们来看一下存储过程的建立和使用方法。 一、创建存储过程 和数据表一样,在使用之前我们需要创建存储过程,它的简明语法是: QUOTE: CREATE PROC 存储过程名称 [参数列表(多个以“,”分隔)] AS SQL 语句 例: QUOTE: CREATE PROC upGetUserName @intUserId INT, @ostrUserName NVARCHAR(20) OUTPUT -- 要输出的参数 AS BEGIN -- 将uName的值赋给 @ostrUserName 变量,即要输出的参数 SELECT @ostrUserName=uName FROM uUser WHERE uId=@intUserId END 其中 CREATE PROC 语句(完整语句为CREATE PROCEDURE)的意思就是告诉SQL SERVER,

C#调用存储过程简单完整例子讲解

C#调用存储过程简单完整例子https://www.360docs.net/doc/6d7285999.html,/itblog/article/details/752869 创建存储过程 Create Proc dbo.存储过程名 存储过程参数 AS 执行语句 RETURN 执行存储过程 GO DECLARE @iRet INT, @PKDisp VARCHAR(20) SET @iRet = '1' Select @iRet = CASE WHEN @PKDisp = '一' THEN 1 WHEN @PKDisp = '二' THEN 2 WHEN @PKDisp = '三' THEN 3 WHEN @PKDisp = '四' THEN 4 WHEN @PKDisp = '五' THEN 5 ELSE 100 END DECLARE @i INT SET @i = 1 WHILE @i<10 BEGIN set @i=@i+1 PRINT @i END DECLARE @d INT set @d = 1 IF @d = 1 BEGIN -- 打印 PRINT '正确' END ELSE BEGIN PRINT '错误' END

CREATE PROC P_TEST @Name VARCHAR(20), @Rowcount INT OUTPUT AS BEGIN SELECT * FROM T_Customer WHERE NAME=@Name SET @Rowcount=@@ROWCOUNT END GO ---------------------------------------------------------------------------------------- --存储过程调用如下: ---------------------------------------------------------------------------------------- DECLARE @i INT EXEC P_TEST 'A',@i OUTPUT SELECT @i --结果 /* Name Address Tel ---------- ---------- -------------------- A Address Telphone (所影响的行数为 1 行) ----------- 1 (所影响的行数为 1 行) */ ---------------------------------------------------------------------------------------- --DotNet 部分(C#) --WebConfig 文件: ---------------------------------------------------------------------------------------- ......

oracle存储过程讲解及实例

存储过程 1 CREATE OR REPLACE PROCEDURE 存储过程名 2 IS 3 BEGIN 4 NULL; 5 END; 行1: CREATE OR REPLACE PROCEDURE 是一个SQL语句通知Oracle数据库去创建一个叫做skeleton存储过程, 如果存在就覆盖它; 行2: IS关键词表明后面将跟随一个PL/SQL体。 行3: BEGIN关键词表明PL/SQL体的开始。 行4: NULL PL/SQL语句表明什么事都不做,这句不能删去,因为PL/SQL体中至少需要有一句; 行5: END关键词表明PL/SQL体的结束

存储过程创建语法: create or replace procedure 存储过程名(param1 in type,param2 out type) as 变量1 类型(值范围); --vs_msg VARCHAR2(4000); 变量2 类型(值范围); Begin Select count(*) into 变量1 from 表A where列名 =param1; If (判断条件) then Select 列名into 变量2 from 表A where列名 =param1; Dbms_output。Put_line(‘打印信息’); Elsif (判断条件) then Dbms_output。Put_line(‘打印信息’); Else Raise 异常名(NO_DATA_FOUND); End if; Exception When others then Rollback;

End; 注意事项: 1,存储过程参数不带取值范围,in表示传入,out表示输出 类型可以使用任意Oracle中的合法类型。 2,变量带取值范围,后面接分号 3,在判断语句前最好先用count(*)函数判断是否存在该条操作记录 4,用select 。。。into。。。给变量赋值 5,在代码中抛异常用 raise+异常名 CREATE OR REPLACE PROCEDURE存储过程名 ( --定义参数 is_ym IN CHAR(6) ,

SQL存储过程实例

题目1 1、学校图书馆借书信息管理系统建立三个表: 学生信息表:student 图书表:book 借书信息表:borrow 请编写SQL语句完成以下的功能: 1)查询“计算机”专业学生在“2007-12-15”至“2008-1-8”时间段内借书的学生编号、 学生名称、图书编号、图书名称、借出日期;参考查询结果如下图所示: 2)查询所有借过图书的学生编号、学生名称、专业;参考查询结果如下图所示:

3)查询借过作者为“安意如”的图书的学生姓名、图书名称、借出日期、归还日期; 参考查询结果如下图所示: 4)查询目前借书但未归还图书的学生名称及未还图书数量;参考查询结果如下图所 示: 附加:建表语句:

标准答案:

题目2 程序员工资表:ProWage 创建一个存储过程,对程序员的工资进行分析,月薪1500到10000不等,如果有百分之五十的人薪水不到2000元,给所有人加薪,每次加100,再进行分析,直到有一半以上的人大于2000元为止,存储过程执行完后,最终加了多少钱? 例如:如果有百分之五十的人薪水不到2000,给所有人加薪,每次加100元,直到有一半以上的人工资大于2000元,调用存储过程后的结果如图:

请编写T-SQL来实现如下功能: 1)创建存储过程,查询是否有一半程序员的工资在2200、3000、3500、4000、5000或6000 元之上,如果不到分别每次给每个程序员加薪100元,至之一半程序员的工资达到2200,3000,3500,4000,5000或6000元。 2)创建存储过程,查询程序员平均工资在4500元,如果不到则每个程序员每次加200元, 至到所有程序员平均工资达到4500元。 建表语句

存储过程书写范例

--存储过程的创建和调用演示 ------------------------------------- --1.不带参数的存过过程的创建 CREATEPROCEDURE PRO_WITH_NO_PARAM AS BEGIN--BEGIN 可省略 SELECT*FROM C; END--END 可省略 --调用 EXEC PRO_WITH_NO_PARAM; ------------------------------------ --2.带参数的存储过程 CREATEPROCEDURE PRO_WHIT_PARAM ( @Sno char(5), @Cno char(1) ) AS BEGIN SELECT*FROM SC WHERE Sno=@Sno AND Cno=@Cno END --调用 EXEC PRO_WHIT_PARAM '09002','3' --------------------------------------- --3.带一个参数的多表查询存储过程 CREATEPROCEDURE PRO_QUERY_DOUBLE_TABLE ( @Sname_IN char(6) ) AS BEGIN SELECT Sname,Ssex,Sage,Sdept,Cno,Grade FROM S STU ,SC SCTU WHERE STU.Sno = SCTU.Sno AND Sname = @Sname_IN END --执行 EXEC PRO_QUERY_DOUBLE_TABLE '姑姑' ----------------------------------------- --4.创建一个插入表的存储过程 CREATEPROCEDURE PRO_INSERT ( @Sno_IN CHAR(5), @Cno_IN CHAR(1), @Grade_IN int )

C#执行存储过程代码实例

C#执行存储过程代码实例,演示如何用C#调用并执行SQLSERVER的存储过程,是一个数据库的高级应用,存储过程相对专业些,但效率更高,而且使SQL的功能发挥的更强大,这仅是一个较简单的存储过程调用例子: 01using System; 02using System.Data; 03using System.Data.SqlClient; 04namespace ExecuteStorageProcess 05{ 06 public class ExecuteStorageProcess 07 { 08 public static void Main() 09 { 10 SqlConnection mySqlConnection = 11 new SqlConnection( 12 "server=localhost;database=Northwind;uid=sa;pwd=sa" 13 ); 14 mySqlConnection.Open(); 15 // 设置CommandText属性为EXECUTE语句 16 SqlCommand mySqlCommand = mySqlConnection.CreateCommand(); 17 https://www.360docs.net/doc/6d7285999.html,mandText = 18 "EXECUTE AddProduct @MyProductID OUTPUT, @MyProductName, " + 19 "@MySupplierID, @MyCategoryID, @MyQuantityPerUnit, " + 20 "@MyUnitPrice, @MyUnitsInStock, @MyUnitsOnOrder, " + 21 "@MyReorderLevel, @MyDiscontinued"; 22 // 添加过程调用所要用到的参数 23 mySqlCommand.Parameters.Add("@MyProductID", SqlDbType.Int); 24 mySqlCommand.Parameters["@MyProductID"].Direction = 25 ParameterDirection.Output; 26 mySqlCommand.Parameters.Add( 27 "@MyProductName", SqlDbType.NVarChar, 40).Value = "Widget"; 28 mySqlCommand.Parameters.Add( 29 "@MySupplierID", SqlDbType.Int).Value = 1; 30 mySqlCommand.Parameters.Add( 31 "@MyCategoryID", SqlDbType.Int).Value = 1; 32 mySqlCommand.Parameters.Add( 33 "@MyQuantityPerUnit", SqlDbType.NVarChar, 20).Value = "1 per box"; 34 mySqlCommand.Parameters.Add( 35 "@MyUnitPrice", SqlDbType.Money).Value = 5.99; 36 mySqlCommand.Parameters.Add( 37 "@MyUnitsInStock", SqlDbType.SmallInt).Value = 10; 38 mySqlCommand.Parameters.Add( 39 "@MyUnitsOnOrder", SqlDbType.SmallInt).Value = 5;

MySQL存储过程实例教程

MySQL存储过程实例教程 MySQL 5.0以后的版本开始支持存储过程,存储过程具有一致性、高效性、安全性和体系结构等特点,本节将通过具体的实例讲解PHP是如何操纵MySQL存储过程的。 实例261:存储过程的创建 这是一个创建存储过程的实例 录像位置:光盘mingrisoft9?lt;/p> 实例说明 为了保证数据的完整性、一致性,提高应用的性能,常采用存储过程技术。MySQL 5.0之前的版本并不支持存储过程,随着MySQL技术的日趋完善,存储过程将在以后的项目中得到广泛的应用。本实例将介绍在MySQL 5.0以后的版本中创建存储过程。 技术要点 一个存储过程包括名字、参数列表,以及可以包括很多SQL语句的SQL语句集。下面为一个存储过程的定义过程: create procedure proc_name (in parameter integer)begindeclare variable varchar(20);if parameter=1 thenset variable='MySQL';elseset variable='PHP';end if;insert into tb (name) values (variable);end; MySQL中存储过程的建立以关键字create procedure开始,后面紧跟存储过程的名称和参数。MySQL的存储过程名称不区分大小写,例如PROCE1()和proce1()代表同一个存储过程名。存储过程名不能与MySQL数据库中的内建函数重名。 存储过程的参数一般由3部分组成。第一部分可以是in、out或inout。in表示向存储过程中传入参数;out表示向外传出参数;inout表示定义的参数可传入存储过程,并可以被存储过程修改后传出存储过程,存储过程默认为传入参数,所以参数in可以省略。第二部分为参数名。第三部分为参数的类型,该类型为MySQL数据库中所有可用的字段类型,如果有多个参数,参数之间可以用逗号进行分割。 MySQL存储过程的语句块以begin开始,以end结束。语句体中可以包含变量的声明、控制语句、SQL查询语句等。由于存储过程内部语句要以分号结束,所以在定义存储过程前应将语句结束标志“;”更改为其他字符,并且该字符在存储过程中出现的几率也应该较低,可以用关键字delimiter更改。例如: mysql>delimiter // 存储过程创建之后,可用如下语句进行删除,参数proc_name指存储过程名。 drop procedure proc_name 实现过程

DB2存储过程简单例子

DB2存储过程简单例子 客户在进行短信服务这个业务申请时,需要填写一些基本信息,然后根据这些信息判断这个用户是否已经存在于业务系统中。因为网上服务和业务系统两个项目物理隔离,而且网上数据库保存的客户信息不全,所以判断需要把数据交换到业务系统,在业务系统中判断。 解决方式是通过存储过程,以前也了解过存储过程,但没使用到项目中。不过经过一番努力最后还是完成了,期间遇到了一些困难,特写此文让对DB2存储过程还不熟悉的童鞋避免一些无谓的错误。 DROP PROCEDURE "PLName" @ CREATE PROCEDURE "PLName"(--存储过程名字 IN IN_ID BIGINT , --以下全是输入参数 IN IN_ENTNAME VARCHAR(200) , IN IN_REGNO VARCHAR(50), IN IN_PASSWORD VARCHAR(20), IN IN_LEREP VARCHAR(300), IN IN_CERTYPE CHARACTER(1), IN IN_CERNO VARCHAR(50), IN IN_LINKMAN VARCHAR(50), IN IN_SEX CHARACTER(1), IN IN_MOBTEL VARCHAR(30), IN IN_REQDATE TIMESTAMP, IN IN_REMITEM VARCHAR(300), IN IN_STATE CHARACTER(1), IN IN_TIMESTAMP TIMESTAMP ) BEGIN declare V_RESULT BIGINT; --声明变量 DELETE FROM TableNameA WHERE ID = IN_ID;

MySQL存储过程简单入门

MySQL存储过程语法 1、概念 存储过程就是能完成一定操作的一组SQL语句。 2、作用 大大提高效率(存储过程本身执行速度非常快,而且,调用存储过程大大减少数据库交互次数);提高重用性。 3、使用方法 1、创建: create procedure sp_name() begin …… end 注意:可能有参数。 2、调用: call sp_name() 注意:括号不能省略。 3、删除: drop procedure sp_name 注意:没有括号,不能在一个存储过程中删除另一个存储过程,只能调用。 4、语句: 条件语句, if 条件then statement else statement end if while循环语句, [label:] while expression do statement end while [label]; loop循环语句, [label:] loop statement end loop [label];

repeat until循环语句, [label] repeat statement until expression end repeat [label]; 5、常用命令: show procedure status:显示数据库所有存储过程基本信息。 show create procedure sp_name:显示一个存储过程详细信息。 关于运算符和基本函数与Java有些区别,用时注意就行。 4、实例 1、创建: create procedure proc_name (in parameter integer) begin declare variable varchar(20); if parameter=1 then set variable='MySQL'; else set variable='PHP'; end if; insert into tb (name) values (variable); end; 注意:代码不区分大小写;存储过程之间以及存储过程与内建函数不能同名; 存储过程参数(in传入,out传出,inout可传入,修改后传出,缺省是in); 由于存储过程内部要以分号结束,需要delimiter进行更改。 2、实现: ⑴、mysql –u用户名–p用户密码 ⑵、delimiter //(将结束符号“;”改成“//”,避免与存储过程冲突) ⑶、use 数据库名 ⑷、……(创建存储过程) ⑸、call proc_name(5)//(调用存储过程) -------------------------------------------- call proc_name(@para)//(对应存储过程定义中out的输出) select @para// ⑹、show procedure status//与show create procedure proc_name// 3、程序代码调用:(out型的部分代码) try{ //调取out型的存储过程P(计算记录总数) stmt = conn.prepareCall("{call p(?)}"); //读取所有OUT型的存储过程的返回参数数据 stmt.registerOutParameter(1, Types.INTEGER); stmt.execute(); int i= stmt.getInt(1);

oracle存储过程学习经典[语法实例调用]

Oracl e 存储过程学习 目录 Oracle 存储过程1 Oracle存储过程基础知识1 Oracle存储过程的基本语法2 关于Oracle存储过程的若干问题备忘4 1.在Oracle中,数据表别名不能加as。5 2.在存储过程中,select某一字段时,后面必须紧跟into,如果select整个记录,利用 游标的话就另当别论了。5 3.在利用select...into...语法时,必须先确保数据库中有该条记录,否则会报出"no data found"异常。5 4.在存储过程中,别名不能和字段名称相同,否则虽然编译可以通过,但在运行阶段 会报错5 5.在存储过程中,关于出现null的问题5 6.Hibernate调用Oracle存储过程6 用Java调用Oracle存储过程总结6 一、无返回值的存储过程6 二、有返回值的存储过程(非列表)8 三、返回列表10 在存储过程中做简单动态查询11 一、本地动态SQL12 二、使用DBMS_SQL包14 Oracle存储过程调用Java方法16 Oracle高效分页存储过程实例17 Oracle存储过程基础知识 商业规则和业务逻辑可以通过程序存储在Oracle中,这个程序就是存储过程。 存储过程是SQL, PL/SQL, Java 语句的组合,它使你能将执行商业规则的代码从你的应用程序中移动到数据库。这样的结果就是,代码存储一次但是能够被多个程序使用。 要创建一个过程对象(procedural object),必须有CREATE PROCEDURE 系统权限。如果这个过程对象需要被其他的用户schema 使用,那么你必须有CREATE ANY PROCEDURE 权限。执行procedure 的时候,可能需要excute权限。或者EXCUTE ANY PROCEDURE 权限。如果单独赋予权限,如下例所示: grant execute on MY_PROCEDURE to Jelly 调用一个存储过程的例子: execute MY_PROCEDURE( 'ONE PARAMETER'); 存储过程(PROCEDURE)和函数(FUNCTION)的区别。

MySQL存储过程实例教程2

MySQL存储过程详解 1.存储过程简介 我们常用的操作数据库语言SQL语句在执行的时候需要要先编译,然后执行,而存储过程(Stored Procedure)是一组为了完成特定功能的SQL语句集,经编译后存储在数据库中,用户通过指定存储过程的名字并给定参数(如果该存储过程带有参数)来调用执行它。 一个存储过程是一个可编程的函数,它在数据库中创建并保存。它可以有SQL语句和一些特殊的控制结构组成。当希望在不同的应用程序或平台上执行相同的函数,或者封装特定功能时,存储过程是非常有用的。数据库中的存储过程可以看做是对编程中面向对象方法的模拟。它允许控制数据的访问方式。 存储过程通常有以下优点: (1).存储过程增强了SQL语言的功能和灵活性。存储过程可以用流控制语句编写,有很强的灵活性,可以完成复杂的判断和较复杂的运算。 (2).存储过程允许标准组件是编程。存储过程被创建后,可以在程序中被多次调用,而不必重新编写该存储过程的SQL语句。而且数据库专业人员可以随时对存储过程进行修改,对应用程序源代码毫无影响。 (3).存储过程能实现较快的执行速度。如果某一操作包含大量的Transaction-SQL代码或分别被多次执行,那么存储过程要比批处理的执行速度快很多。因为存储过程是预编译的。在首次运行一个存储过程时查询,优化器对其进行分析优化,并且给出最终被存储在系统表中的执行计划。而批处理的Transaction-SQL语句在每次运行时都要进行编译和优化,速度相对要慢一些。 (4).存储过程能过减少网络流量。针对同一个数据库对象的操作(如查询、修改),如果这一操作所涉及的Transaction-SQL语句被组织程存储过程,那么当在客户计算机上调用该存储过程时,网络中传送的只是该调用语句,从而大大增加了网络流量并降低了网络负载。 (5).存储过程可被作为一种安全机制来充分利用。系统管理员通过执行某一存储过程的权限进行限制,能够实现对相应的数据的访问权限的限制,避免了非授权用户对数据的访问,保证了数据的安全。 2.关于MySQL的存储过程 存储过程是数据库存储的一个重要的功能,但是MySQL在5.0以前并不支持存储过程,这使得MySQL在应用上大打折扣。好在MySQL 5.0终于开始已经支持存储过程,这样即可以大大提高数据库的处理速度,同时也可以提高数据库编程的灵活性。 3.MySQL存储过程的创建 (1). 格式

实验六 MySql存储过程

实验六MySql存储过程 一、实验目的 1、熟悉MySql的存储过程 二、实验内容 1、建立一张学生表,属性有学号、姓名、年龄三个字段。 2、建立一个存储过程,实现学生的全查询 3、分别用IN 和OUT实现姓名的调用 4、声明一个变量,把变量加1,再把变量加入到学生表的学号字段中。 5、建立一个存储过程,外部调用这个存储过程,当外部传入的值是0时,则在学生表中插入一个学号是17的学生,如果是1时,则在学生表中插入一个学号是18的学生,如果都不是,则在学生表中插入一个学号是19的学生. 6、建立一个存储过程,做一个循环语句,循环插入5个学生。(至少用三种循环的存储过程方法) 三、试验结果截图 1.建立一张学生表,属性有学号、姓名、年龄三个字段。 2.建立一个存储过程,实现学生的全查询

3.分别用IN 和OUT实现姓名的调用 4.声明一个变量,把变量加1,再把变量加入到学生表的学号字段中。

5.建立一个存储过程,外部调用这个存储过程,当外部传入的值是0时,则在学生表中插入一个学号是17的学生,如果是1时,则在学生表中插入一个学号是18的学生,如果都不是,则在学生表中插入一个学号是19的学生.

6建立一个存储过程,做一个循环语句,循环插入5个学生。(至少用三种循环的存储过程方法) 所有代码: 1. create table stu( stuno int, stuna varchar(20), stuage int ); insert into stu values(001,'zhangsan',22);

insert into stu values(002,'lisi',23); insert into stu values(003,'wangwu',23); insert into stu values(004,'maliu',24); insert into stu values(005,'zhaoqi',25); insert into stu values(006,'gaoba',23); insert into stu values(007,'ddddd',22); insert into stu values(008,'ttttt',21); 2. create procedure select_all() select * from stu; 3. delimiter // create procedure searchno( in no int, out na varchar(20), out age int ) begin select stuna from stu where stuno=no into na; select stuage from stu where stuno=no into age; end // delimiter ; call searchno(n,@na,@age); select @na,@age; 4. delimiter // create procedure noupdate( in n int) begin update stu set stuno=stuno+n; end // delimiter ; 5. delimiter // create procedure addstu( in sno int ) begin case sno when 0 then insert into stu values(17,'no17',20); when 1 then insert into stu values(18,'no18',20); else insert into stu values(19,'no19',20); end case; end //

C++调用SQL存储过程实例

c/c++调用mysql存储过程 mysql5.0以后就支持存储过程了,目前mysql的6.0Alpha版也已经推出。6.0不仅支持大型数据库如oracle等的绝大部分功能,如存储过程、视图、触发器、job等等,而且修正了这些功能所存在的bug,其中6.0.1还支持64位windows,以及表空间。 在c/c++中访问mysql,常见的只是一些简单的业务,使用c中嵌入简单的查询、插入、更新等操作即可。随着业务的复杂化,完成一个业务功能需要非常多的sql操作环节,把这些语句都嵌入c代码中会导致c代码越来越繁琐、不清晰,这时候,自然就想到了存储过程来封装所有的数据库逻辑,通过c简单调用mysql存储过程接口即可达到目的,极大地减轻了c程序员的工作量,也便于前端业务处理逻辑与数据库处理逻辑的分离。下面就介绍c 语言调用存储过程的简单的方法。 1、首先创建一张表 用于存放用户信息 Create table student( id int auto_increment, name varchar(20), age tinyint, remark varchar(50), primary key(id) ); 2、插入几条信息 Insert into student values(1,"zhouys",90, ""); commit; 3、查看用户信息 mysql> select * from student;

+------+-----------+------+----------+ | id | name | age | remark | +------+-----------+------+----------+ | 1 | zhouys | 90 | | +------+-----------+------+-----------+ 1 row in set (0.00 sec) mysql> 4、创建存储过程 如下: delimiter // create procedure querystudent( in in_id int , #0-字符id 1-数字id # out out_ret int, #返回结果 out out_name varchar(20), #名字 out out_age int #年龄) label_a:begin declare v_name varchar(20) ; declare v_age tinyint ; #参数判断 if (in_id<=0) then set out_ret=-1; #id error

存储过程实例精选

整理者为我 实例1:只返回单一记录集的存储过程。 银行存款表(bankMoney)的内容如下 要求1:查询表bankMoney的内容的存储过程 create procedure sp_query_bankMoney as select * from bankMoney go exec sp_query_bankMoney 注* 在使用过程中只需要把中的SQL语句替换为存储过程名,就可以了很方便吧! 实例2(向存储过程中传递参数): 加入一笔记录到表bankMoney,并查询此表中userID= Zhangsan的所有存款的总金额。 Create proc insert_bank @param1 char(10),@param2 varchar(20),@param3 varchar(20),@param4 int,@param5 int output with encryption ---------加密 as insert bankMoney (id,userID,sex,Money)

Values(@param1,@param2,@param3, @param4) select @param5=sum(Money) from bankMoney where userID='Zhangsan' go 在SQL Server查询分析器中执行该存储过程的方法是: declare @total_price int exec insert_bank '004','Zhangsan','男',100,@total_price output print '总余额为'+convert(varchar,@total_price) go 在这里再啰嗦一下存储过程的3种传回值(方便正在看这个例子的朋友不用再去查看语法内容): 1.以Return传回整数 2.以output格式传回参数 3.Recordset 传回值的区别: output和return都可在批次程式中用变量接收,而recordset则传回到执行批次的客户端中。 实例3:使用带有复杂 SELECT 语句的简单过程 下面的存储过程从四个表的联接中返回所有作者(提供了姓名)、出版的书籍以及出版社。该存储过程不使用任何参数。 USE pubs IF EXISTS (SELECT name FROM sysobjects WHERE name = 'au_info_all' AND type = 'P') DROP PROCEDURE au_info_all GO

MySQL存储过程练习

存储过程实验 一、实验要求: 1.理解存储过程的概念 2.掌握存储过程的语法格式、使用方法 3.掌握存储过程的创建、执行 二、实验内容: (注意:做一下实验需要首先建立数据及其相应的表,并输入一些记录) 1.实验1:创建一个存储过程,实现查询表student中的记录信息,并执行存储过 程 (1)创建存储过程: begin select * from student end (2)执行存储过程:运行 sp_liststudent (3)执行结果如下:

2.实验2.创建一个存储过程,根据给定的学生学号返回该学生的姓名(1)创建存储过程:

CREATE PROCEDURE test5( IN id int) BEGIN SELECT * from student s WHERE s.id=id; END (2)执行存储过程:CALL test5(2) 执行结果如下: 3.实验3. 创建一个存储过程,根据班级的编号,统计该班人数,并将人数以输出 变量返回给用户。 (1)创建存储过程: CREATE PROCEDURE test00( IN roomidint) BEGIN SELECT COUNT(*) from student s WHERE s.roomid=9; END (2)执行存储过程:CALL test00(2) (3)执行结果如下:

4.实验4:创建一个存储过程查询学号为“020101”的学生的平均分是否超过了85 分,若超过则输出“ X X考出了高分”,否则输出“XX 考的一般”。 (1)创建存储过程: CREATE PROCEDURE test05() BEGIN IF (SELECT score from student WHERE id=1)>85 THEN SELECT '考得好'; ELSE SELECT '考得不好'; END IF; END

存储过程的实例

存储过程如同一门程序设计语言,同样包含了数据类型、流程控制、输入和输出和它自己的函数库。 --------------------基本语法-------------------- 一.创建存储过程 create procedure sp_name() begin ......... end 二.调用存储过程 1.基本语法:call sp_name() 注意:存储过程名称后面必须加括号,哪怕该存储过程没有参数传递 三.删除存储过程 1.基本语法: drop procedure sp_name// 2.注意事项 (1)不能在一个存储过程中删除另一个存储过程,只能调用另一个存储过程 四.其他常用命令 1.show procedure status 显示数据库中所有存储的存储过程基本信息,包括所属数据库,存储过程名称,创建时间等2.show create procedure sp_name 显示某一个mysql存储过程的详细信息 --------------------数据类型及运算符-------------------- 一、基本数据类型: 略 二、变量: 自定义变量:DECLARE a INT ; SET a=100; 可用以下语句代替:DECLARE a INT DEFAULT 100; 变量分为用户变量和系统变量,系统变量又分为会话和全局级变量 用户变量:用户变量名一般以@开头,滥用用户变量会导致程序难以理解及管理 1、在mysql客户端使用用户变量 mysql> SELECT 'Hello World' into @x; mysql> SELECT @x; mysql> SET @y='Goodbye Cruel World'; mysql> select @y; mysql> SET @z=1+2+3; mysql> select @z; 2、在存储过程中使用用户变量 mysql> CREATE PROCEDURE GreetWorld( ) SELECT CONCAT(@greeting,' World'); mysql> SET @greeting='Hello'; mysql> CALL GreetWorld( );

sql存储过程及视图创建实例及语法

SQL Server 存储过程 Transact-SQL中的存储过程,非常类似于Java语言中的方法,它可以重复调用。当存储过程执行一次后,可以将语句缓存中,这样下次执行的时候直接使用缓存中的语句。这样就可以提高存储过程的性能。 ?存储过程的概念 存储过程Procedure是一组为了完成特定功能的SQL语句集合,经编译后存储在数据库中,用户通过指定存储过程的名称并给出参数来执行。 存储过程中可以包含逻辑控制语句和数据操纵语句,它可以接受参数、输出参数、返回单个或多个结果集以及返回值。 由于存储过程在创建时即在数据库服务器上进行了编译并存储在数据库中,所以存储过程运行要比单个的SQL语句块要快。同时由于在调用时只需用提供存储过程名和必要的参数信息,所以在一定程度上也可以减少网络流量、简单网络负担。 1、存储过程的优点 A、存储过程允许标准组件式编程 存储过程创建后可以在程序中被多次调用执行,而不必重新编写该存储过程的SQL语句。而且数据库专业人员可以随时对存储过程进行修改,但对应用程序源代码却毫无影响,从而极大的提高了程序的可移植性。 B、存储过程能够实现较快的执行速度 如果某一操作包含大量的T-SQL语句代码,分别被多次执行,那么存储过程要比批处理的执行速度快得多。因为存储过程是预编译的,在首次运行一个存储过程时,查询优化器对其进行分析、优化,并给出最终被存在系统表中的存储计划。而批处理的T-SQL语句每次运行都需要预编译和优化,所以速度就要慢一些。 C、存储过程减轻网络流量 对于同一个针对数据库对象的操作,如果这一操作所涉及到的T-SQL语句被组织成一存储过程,那么当在客户机上调用该存储过程时,网络中传递的只是该调用语句,否则将会是多条SQL语句。从而减轻了网络流量,降低了网络负载。 D、存储过程可被作为一种安全机制来充分利用 系统管理员可以对执行的某一个存储过程进行权限限制,从而能够实现对某些数据访问的限制,避免非授权用户对数据的访问,保证数据的安全。 ?系统存储过程 系统存储过程是系统创建的存储过程,目的在于能够方便的从系统表中查询信息或完成与更新数据库表相关的管理任务或其他的系统管理任务。系统存储过程主要存储在master数据库中,以“sp”下划线开头的存储过程。尽管这些系统存储过程在master数据库中,但我们在其他数据库还是可以调用系统存储过程。有一些系统存储过程会在创建新的数据库的时候被自动创建在当前数据库中。 常用系统存储过程有: exec sp_databases; --查看数据库 exec sp_tables; --查看表 exec sp_columns student;--查看列

相关文档
最新文档