存储过程的实例

合集下载

SQL存储过程实例(练习和答案)

SQL存储过程实例(练习和答案)

题目 1
1、学校图书馆借书信息管理系统建立三个表:
学生信息表:student
3)查询借过作者为“安意如”的图书的学生姓名、图书名称、借出日期、归还日期;参考查
询结果如下图所示:
4)查询目前借书但未归还图书的学生名称及未还图书数量;参考查询结果如下图所示:
题目2
程序员工资表:ProWage
创建一个存储过程,对程序员的工资进行分析,月薪1500到10000不等,如果有百分之五十的人薪水不到2000元,给所有人加薪,每次加100,再进行分析,直到有一半以上的人大于2000元为
止,存储过程执行完后,最终加了多少钱?
元之
,3500,
题目3:
1) 查询各个学生语文、数学、英语、历史课程成绩,例如下表:
2)查询四门课中成绩低于70分的学生及相对应课程名和成绩。

3)统计各个学生参加考试课程的平均分,且按平均分数由高到底排序。

4)创建存储过程,分别查询参加1、2、3、4门考试及没有参加考试的学生名单,要求显示姓名、
学号。

mysql存储过程

mysql存储过程

mysql存储过程MySQL存储过程1. 存储过程简介我们常用的操作数据库语言SQL语句在执行的时候需要要先编译,然后执行,而存储过程(StoredProcedure)是一组为了完成特定功能的SQL语句集,经编译后存储在数据库中,用户通过指定存储过程的名字并给定参数(如果该存储过程带有参数)来调用执行它。

一个存储过程是一个可编程的函数,它在数据库中创建并保存。

它可以有SQL 语句和一些特殊的控制结构组成。

当希望在不同的应用程序或平台上执行相同的函数,或者封装特定功能时,存储过程是非常有用的。

数据库中的存储过程可以看做是对编程中面向对象方法的模拟。

它允许控制数据的访问方式。

存储过程通常有以下优点:(1).存储过程增强了SQL语言的功能和灵活性。

存储过程可以用流控制语句编写,有很强的灵活性,可以完成复杂的判断和较复杂的运算。

(2).存储过程允许标准组件是编程。

存储过程被创建后,可以在程序中被多次调用,而不必重新编写该存储过程的SQL语句。

而且数据库专业人员可以随时对存储过程进行修改,对应用程序源代码毫无影响。

(3).存储过程能实现较快的执行速度。

如果某一操作包含大量的Transaction-SQL 代码或分别被多次执行,那么存储过程要比批处理的执行速度快很多。

因为存储过程是预编译的。

在首次运行一个存储过程时查询,优化器对其进行分析优化,并且给出最终被存储在系统表中的执行计划。

而批处理的Transaction-SQL 语句在每次运行时都要进行编译和优化,速度相对要慢一些。

(4).存储过程能过减少网络流量。

针对同一个数据库对象的操作(如查询、修改),如果这一操作所涉及的Transaction-SQL语句被组织程存储过程,那么当在客户计算机上调用该存储过程时,网络中传送的只是该调用语句,从而大大增加了网络流量并降低了网络负载。

(5).存储过程可被作为一种安全机制来充分利用。

系统管理员通过执行某一存储过程的权限进行限制,能够实现对相应的数据的访问权限的限制,避免了非授权用户对数据的访问,保证了数据的安全。

DB2存储过程4类循环简单实例

DB2存储过程4类循环简单实例

DB2存储过程4类循环简单实例SET SCHEMA = 'DB2ADMIN';SET CURRENT PATH = "SYSIBM","SYSFUN","SYSPROC","SYSIBMADM","DB2ADMIN"; CREATE PROCEDURE "DB2ADMIN"."TEST_CIRCULATION" ( )DYNAMIC RESULT SETS 1LANGUAGE SQLNOT DETERMINISTICEXTERNAL ACTIONMODIFIES SQL DATAOLD SAVEPOINT LEVELp1: begindeclare aa varchar(10);declare bb varchar(10);declare a integer DEFAULT 0;-- 定义⼀个全局临时表tmp_hydeclare global temporary table session.tmp_hy(dm varchar(10),mc varchar(10))with replace -- 如果存在此临时表,则替换not logged; -- 不在⽇志⾥纪录-- 给临时表插⼊三条数据insert into session.tmp_hy values('1','01');insert into session.tmp_hy values('2','02');insert into session.tmp_hy values('3','03');--for隐式循环for cur1 as select dm,mc from session.tmp_hydoif cur1.dm='1' or cur1.dm='2' or cur1.dm='3' theninsert into session.tmp_hy values(cur1.mc,'隐式循环');end if;update session.tmp_hy set mc='0'||''||cur1.mc||'' where dm=cur1.dm;end for;p2: begin--简单循环declare cursor2 cursor forselect dm,mc from session.tmp_hy;OPEN cursor2;FETCH_LOOP: LOOPFETCH cursor2 INTO aa,bb;IF a >= 3 THEN -- loop until last row of the cursorLEAVE FETCH_LOOP;END IF;if aa='1' or aa='2' or aa='3' theninsert into session.tmp_hy values(bb,'简单循环');end if;set a=a+1;END LOOP FETCH_LOOP;close cursor2;end p2;set a=0;p3: begin--进⼊前检查条件declare cursor2 cursor forselect dm,mc from session.tmp_hy;OPEN cursor2;FETCH cursor2 INTO aa, bb;while a<3doif aa='1' or aa='2' or aa='3' theninsert into session.tmp_hy values(bb,'while循环');end if;set a=a+1;FETCH cursor2 INTO aa, bb;end while;close cursor2;end p3;set a=0;p4: begin--退出前检查条件declare cursor2 cursor forselect dm,mc from session.tmp_hy;OPEN cursor2;REPEATFETCH cursor2 INTO aa, bb;if aa='1' or aa='2' or aa='3' theninsert into session.tmp_hy values(bb,'REPEAT循环'); end if;set a=a+1;UNTIL a>=3end REPEAT;close cursor2;end p4;p5: begin--声明游标declare cursor1 cursor with return forselect * from session.tmp_hy;--游标对客户机应⽤程序保持打开open cursor1;end p5;end p1;。

存储过程案例

存储过程案例

存储过程案例
存储过程(Stored Procedure)是一种在数据库中存储复杂程序,用户通过调用存储过程来执行这个程序。

以下是一个简单的存储过程案例:
案例:创建存储过程,根据用户输入的姓名查询员工信息
1. 数据库表结构
假设有一个名为`employees`的表,结构如下:
```sql
CREATE TABLE employees (
id INT PRIMARY KEY,
name VARCHAR(50),
age INT,
department VARCHAR(50)
);
```
2. 创建存储过程
```sql
DELIMITER //
CREATE PROCEDURE GetEmployeeInfo(IN empName VARCHAR(50)) BEGIN
SELECT FROM employees WHERE name = empName;
END //
DELIMITER ;
```
3. 调用存储过程
调用上述存储过程,查询名为"John"的员工信息:
```sql
CALL GetEmployeeInfo('John');
```
4. 结果
如果存在名为"John"的员工,则返回该员工的信息;否则返回空结果。

这是一个简单的存储过程示例。

在实际应用中,存储过程可以更复杂,可以包含条件、循环、多个表的联接等操作。

使用存储过程的好处是提高性能、减少网络流量、提高安全性等。

oracle存储过程学习语法实例调用

oracle存储过程学习语法实例调用

Oracle 存储过程学习目录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的区别;function有返回值,并且可以直接在Query中引用function和或者使用function的返回值;本质上没有区别,都是 PL/SQL 程序,都可以有返回值;最根本的区别是:存储过程是命令, 而函数是表达式的一部分;比如:select maxNAME FROM但是不能 exec maxNAME 如果此时max是函数;PACKAGE是function,procedure,variables 和sql 语句的组合;package允许多个procedure使用同一个变量和游标;创建 procedure的语法:Sql 代码:可以使用 create or replace procedure 语句, 这个语句的用处在于,你之前赋予的excute 权限都将被保留;IN, OUT, IN OUT用来修饰参数;IN 表示这个变量必须被调用者赋值然后传入到PROCEDURE进行处理;OUT 表示PRCEDURE 通过这个变量将值传回给调用者;IN OUT 则是这两种的组合;authid代表两种权限:定义者权限difiner right 默认,执行者权限invoker right;定义者权限说明这个procedure中涉及的表,视图等对象所需要的权限只要定义者拥有权限的话就可以访问;执行者权限则需要调用这个 procedure的用户拥有相关表和对象的权限;Oracle存储过程的基本语法1.基本结构2.SELECT INTO STATEMENT将select查询的结果存入到变量中,可以同时将多个列存储多个变量中,必须有一条记录,否则抛出异常如果没有记录抛出NO_DATA_FOUND例子:3.IF 判断4.while 循环5.变量赋值6.用for in 使用cursor7.带参数的cursor8.用pl/sql developer debug连接数据库后建立一个Test WINDOW在窗口输入调用SP的代码,F9开始debug,CTRL+N单步调试9.Pl/Sql中执行存储过程在sqlplus中:/在SQL/PLUS中调用存储过程,显示结果:SQL>set serveoutput on --打开输出SQL>var info1 number; --输出1SQL>var info2 number; --输出2SQL>declarevar1 varchar220; --输入1var2 varchar220; --输入2var3 varchar220; --输入2BEGINprovar1,var2,var3,:info1,:info2;END;/SQL>print info1;SQL>print info2;注:在EXECUTE IMMEDIATE STR语句是SQLPLUS中动态执行语句,它在执行中会自动提交,类似于DP中FORMS_DDL语句,在此语句中str是不能换行的,只能通过连接字符"||",或着在在换行时加上"-"连接字符;关于Oracle存储过程的若干问题备忘1.在Oracle中,数据表别名不能加as;如:selecta.appnamefromappinfoa;-- 正确selecta.appnamefromappinfoasa;-- 错误也许,是怕和Oracle中的存储过程中的关键字as冲突的问题吧2.在存储过程中,select某一字段时,后面必须紧跟into,如果select整个记录,利用游标的话就另当别论了;selectaf.keynodeintoknfromAPPFOUNDATIONafwhereaf.appid=aidandaf.foundationid=fid; --有into,正确编译selectaf.keynodefromAPPFOUNDATIONafwhereaf.appid=aidandaf.foundationid=fid;--没有into,编译报错,提示:CompilationError:PLS-00428:anINTOclauseisexpectedinthisSELECTstatement3.在利用select...into...语法时,必须先确保数据库中有该条记录,否则会报出"no data found"异常;可以在该语法之前,先利用select count from 查看数据库中是否存在该记录,如果存在,再利用select...into...4.在存储过程中,别名不能和字段名称相同,否则虽然编译可以通过,但在运行阶段会报错selectkeynodeintoknfromAPPFOUNDATIONwhereappid=aidandfoundationid=fid;--正确运行selectaf.keynodeintoknfromAPPFOUNDATIONafwhereaf.appid=appidandaf.foundationid= foundationid;--运行阶段报错,提示:ORA-01422:exactfetchreturnsmorethanrequestednumberofrows5.在存储过程中,关于出现null的问题假设有一个表A,定义如下:createtableA idvarchar250primarykeynotnull,vcountnumber8notnull,bidvarchar250notnull--外键;如果在存储过程中,使用如下语句:selectsumvcountintofcountfromAwherebid='xxxxxx';如果A表中不存在bid="xxxxxx"的记录,则fcount=null即使fcount定义时设置了默认值,如:fcount number8:=0依然无效,fcount还是会变成null,这样以后使用fcount时就可能有问题,所以在这里最好先判断一下:iffcountisnullthenfcount:=0;end if;这样就一切ok了;6.Hibernate调用Oracle存储过程this.pnumberManager.getHibernateTemplate.executenew HibernateCallback ...{用Java调用Oracle存储过程总结一、无返回值的存储过程测试表:例: 存储过程为当然了,这就先要求要建张表TESTTB,里面两个字段I_ID,I_NAME;:在Java里调用时就用下面的代码:二、有返回值的存储过程非列表例:存储过程为:在Java里调用时就用下面的代码:注意,这里的proc.getString2中的数值2并非任意的,而是和存储过程中的out列对应的,如果out是在第一个位置,那就是proc.getString1,如果是第三个位置,就是proc.getString3,当然也可以同时有多个返回值,那就是再多加几个out参数了;三、返回列表由于Oracle存储过程没有返回值,它的所有返回值都是通过out参数来替代的,列表同样也不例外,但由于是集合,所以不能用一般的参数,必须要用pagkage了.所以要分两部分,1.建一个程序包;如下:2.建立存储过程,存储过程为:可以看到,它是把游标可以理解为一个指针,作为一个out 参数来返回值的;在Java里调用时就用下面的代码:在这里要注意,在执行前一定要先把Oracle的驱动包放到class路径里,否则会报错的;在存储过程中做简单动态查询在存储过程中做简单动态查询代码 ,例如:一般的PL/SQL程序设计中,在DML和事务控制的语句中可以直接使用SQL,但是DDL语句及系统控制语句却不能在PL/SQL中直接使用,要想实现在PL/SQL中使用DDL语句及系统控制语句,可以通过使用动态SQL来实现;首先我们应该了解什么是动态SQL,在Oracle数据库开发PL/SQL块中我们使用的SQL分为:静态SQL语句和动态SQL语句;所谓静态SQL指在PL/SQL块中使用的SQL语句在编译时是明确的,执行的是确定对象;而动态SQL是指在PL/SQL块编译时SQL语句是不确定的,如根据用户输入的参数的不同而执行不同的操作;编译程序对动态语句部分不进行处理,只是在程序运行时动态地创建语句、对语句进行语法分析并执行该语句;Oracle中动态SQL可以通过本地动态SQL来执行,也可以通过DBMS_SQL包来执行;下面就这两种情况分别进行说明:一、本地动态SQL本地动态SQL是使用EXECUTE IMMEDIATE语句来实现的;1、本地动态SQL执行DDL语句:需求:根据用户输入的表名及字段名等参数动态建表;以上是编译通过的存储过程代码;下面执行存储过程动态建表;到这里,就实现了我们的需求,使用本地动态SQL根据用户输入的表名及字段名、字段类型等参数来实现动态执行DDL语句;2、本地动态SQL执行DML语句;需求:将用户输入的值插入到上例中建好的dinya_test表中;执行存储过程,插入数据到测试表中;在上例中,本地动态SQL执行DML语句时使用了using子句,按顺序将输入的值绑定到变量,如果需要输出参数,可以在执行动态SQL的时候,使用RETURNING INTO 子句,如:二、使用DBMS_SQL包使用DBMS_SQL包实现动态SQL的步骤如下:A、先将要执行的SQL语句或一个语句块放到一个字符串变量中;B、使用DBMS_SQL包的parse过程来分析该字符串;C、使用DBMS_SQL包的bind_variable过程来绑定变量;D、使用DBMS_SQL包的execute函数来执行语句;1、使用DBMS_SQL包执行DDL语句需求:使用DBMS_SQL包根据用户输入的表名、字段名及字段类型建表;以上过程编译通过后,执行过程创建表结构:2、使用DBMS_SQL包执行DML语句需求:使用DBMS_SQL包根据用户输入的值更新表中相对应的记录;查看表中已有记录:建存储过程,并编译通过:执行过程,根据用户输入的参数更新表中的数据:执行过程后将第二条的name字段的数据更新为新值csdn_dinya;这样就完成了使用dbms_sql包来执行DML语句的功能;使用DBMS_SQL中,如果要执行的动态语句不是查询语句,使用DBMS_SQL.Execute或DBMS_SQL.Variable_Value来执行,如果要执行动态语句是查询语句,则要使用DBMS_SQL.define_column定义输出变量,然后使用DBMS_SQL.Execute, DBMS_SQL.Fetch_Rows, DBMS_SQL.Column_Value及DBMS_SQL.Variable_Value来执行查询并得到结果;总结说明:在Oracle开发过程中,我们可以使用动态SQL来执行DDL语句、DML语句、事务控制语句及系统控制语句;但是需要注意的是,PL/SQL块中使用动态SQL执行DDL语句的时候与别的不同,在DDL中使用绑定变量是非法的bind_variablev_cursor,’:p_name’,name,分析后不需要执行DBMS_SQL.Bind_Variable,直接将输入的变量加到字符串中即可;另外,DDL是在调用DBMS_SQL.PARSE时执行的,所以DBMS_SQL.EXECUTE也可以不用,即在上例中的v_row:=dbms_sql.executev_cursor部分可以不要;Oracle存储过程调用Java方法存储过程中调用Java程序段软件环境:1、操作系统:Windows2000Server2、3、数据库:8iR24、8.1.7forNT企业版5、安装路径:C:\ORACLE实现方法:1、创建一个文件为Test.java2、javac Test.java3、java Test4、SQL>connsystem/manager5、SQL>grantcreateanydirectorytoscott;SQL>connscott/tigerSQL>createorreplacedirectorytest_diras'd:\';目录已创建;SQL>createorreplacejavaclassusingbfiletest_dir,'TEST.CLASS'2/Java 已创建;SQL>selectobject_name,object_type,STATUSfromuser_objects;SQL>createorreplaceproceduretest_javaaslanguagejava/过程已创建;SQL>setserveroutputonsize5000SQL>calldbms_java.set_output5000;调用完成;SQL>executetest_java;HELLOTHISiSAJavaPROCEDUREPL/SQL 过程已成功完成;SQL>calltest_java;HELLOTHISiSAJavaPROCEDURE调用完成;Oracle 8I 9I都测试通过; Oracle高效分页存储过程实例。

SQLServer存储过程语法及实例

SQLServer存储过程语法及实例

SQLServer存储过程语法及实例Transact-SQL中的存储过程,⾮常类似于Java语⾔中的⽅法,它可以重复调⽤。

当存储过程执⾏⼀次后,可以将语句缓存中,这样下次执⾏的时候直接使⽤缓存中的语句。

这样就可以提⾼存储过程的性能。

Ø 存储过程的概念存储过程Procedure是⼀组为了完成特定功能的SQL语句集合,经编译后存储在数据库中,⽤户通过指定存储过程的名称并给出参数来执⾏。

存储过程中可以包含逻辑控制语句和数据操纵语句,它可以接受参数、输出参数、返回单个或多个结果集以及返回值。

由于存储过程在创建时即在数据库服务器上进⾏了编译并存储在数据库中,所以存储过程运⾏要⽐单个的SQL语句块要快。

同时由于在调⽤时只需⽤提供存储过程名和必要的参数信息,所以在⼀定程度上也可以减少⽹络流量、简单⽹络负担。

1、存储过程的优点A、存储过程允许标准组件式编程存储过程创建后可以在程序中被多次调⽤执⾏,⽽不必重新编写该存储过程的SQL语句。

⽽且数据库专业⼈员可以随时对存储过程进⾏修改,但对应⽤程序源代码却毫⽆影响,从⽽极⼤的提⾼了程序的可移植性。

B、存储过程能够实现较快的执⾏速度如果某⼀操作包含⼤量的T-SQL语句代码,分别被多次执⾏,那么存储过程要⽐批处理的执⾏速度快得多。

因为存储过程是预编译的,在⾸次运⾏⼀个存储过程时,查询优化器对其进⾏分析、优化,并给出最终被存在系统表中的存储计划。

⽽批处理的T-SQL语句每次运⾏都需要预编译和优化,所以速度就要慢⼀些。

C、存储过程减轻⽹络流量对于同⼀个针对数据库对象的操作,如果这⼀操作所涉及到的T-SQL语句被组织成⼀存储过程,那么当在客户机上调⽤该存储过程时,⽹络中传递的只是该调⽤语句,否则将会是多条SQL语句。

从⽽减轻了⽹络流量,降低了⽹络负载。

D、存储过程可被作为⼀种安全机制来充分利⽤系统管理员可以对执⾏的某⼀个存储过程进⾏权限限制,从⽽能够实现对某些数据访问的限制,避免⾮授权⽤户对数据的访问,保证数据的安全。

复杂的存储过程实例

复杂的存储过程实例

复杂的存储过程实例
嘿,朋友们!今天咱来聊聊复杂的存储过程实例。

这玩意儿啊,就像是一个神秘的魔法盒子,里面装满了各种奇妙的东西。

你想想看,存储过程就像是一个经验丰富的大厨,它能把各种食材(数据)巧妙地组合在一起,做出一道道美味的菜肴(结果)。

而复杂的存储过程呢,那就是大厨中的大厨,能玩出各种高难度的花样。

比如说,有一个存储过程就像是一场精心编排的舞蹈。

它的步骤环环相扣,一个动作接着一个动作,不能有丝毫差错。

如果中间有一个步骤出错了,那整个舞蹈可就乱套啦!这就好比你在煮饺子的时候,水还没烧开就把饺子扔进去了,那能煮出好吃的饺子吗?
还有啊,有些存储过程就像是一个复杂的迷宫。

你得小心翼翼地在里面探索,稍有不慎就会迷失方向。

但一旦你找到了正确的路径,哇塞,那可真是豁然开朗,柳暗花明又一村啊!
咱再打个比方,复杂的存储过程就像是搭积木,一块一块地往上堆,要保证每一块都放得稳稳当当的,不然整个积木塔就可能轰然倒塌。

这可需要极大的耐心和细心呢!
在实际操作中,你可得对这些存储过程宝贝得很呐!要像对待自己最心爱的宝贝一样,精心呵护,仔细研究。

别小看了那些代码,它们可都有着大作用呢!
你说,要是没有这些复杂的存储过程,我们的数据库世界得变得多么无趣啊!它们就像是夜空中最闪亮的星星,给我们的数据库增添了无尽的魅力和神秘感。

所以啊,朋友们,好好去探索那些复杂的存储过程吧!别怕困难,别怕麻烦,当你真正掌握了它们,你就会发现,哇,原来我也可以这么厉害!就像征服了一座高峰一样,那种成就感简直无与伦比。

加油吧,让我们一起在存储过程的世界里畅游!。

存储过程实例精选

存储过程实例精选

存储过程实例精选存储过程是一组在数据库中执行的预编译的SQL语句。

它们是用来执行一系列的数据库操作,可以减少网络通信的次数,提高数据库性能,同时也可以确保数据的一致性和完整性。

在这篇文章中,我们将介绍一些存储过程实例的精选内容。

1.添加新用户存储过程可以用于添加新用户到数据库中。

当有新用户注册时,我们可以使用存储过程来验证用户输入的数据,如用户名和密码是否符合要求,然后将用户信息插入到用户表中。

此外,存储过程还可以对用户信息进行加密,并生成唯一的用户ID。

2.计算订单总额在一个电子商务网站中,有时需要计算订单的总额。

我们可以使用存储过程来计算订单中每个商品的价格,并将这些价格相加得到订单的总额。

通过使用存储过程,我们可以只向数据库发送一条SQL查询,而不是分别查询每个商品的价格,从而提高了查询性能。

3.更新库存存储过程也可以用于更新商品库存。

当用户购买商品时,我们可以使用存储过程来减少商品的库存数量。

在更新库存的过程中,存储过程可以检查商品的库存量是否足够,如果库存不足,则不允许用户购买。

4.备份数据库定期备份数据库是非常重要的,以防止数据丢失。

我们可以创建一个存储过程来自动备份数据库。

这个存储过程可以在指定的时间间隔内运行,并将数据库备份到指定的位置。

通过使用存储过程,我们可以快速方便地完成数据库的备份工作。

5.根据条件检索数据存储过程可以接受参数,并根据这些参数来检索数据。

例如,我们可以创建一个存储过程,接受一个日期作为参数,并返回在该日期之后的所有订单。

这样,我们可以根据需要灵活地检索数据库中的数据。

6.发送电子邮件通知存储过程还可以用于发送电子邮件通知。

例如,当有新订单时,我们可以使用存储过程来生成包含订单信息的电子邮件,并将其发送给相关的人员。

通过使用存储过程,我们可以将发送电子邮件的逻辑和业务逻辑分离,使代码更易于维护。

7.执行复杂的事务存储过程可以执行复杂的事务操作,例如同时更新多个表,保证数据的一致性。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

存储过程如同一门程序设计语言,同样包含了数据类型、流程控制、输入和输出和它自己的函数库。

--------------------基本语法--------------------一.创建存储过程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( );3、在存储过程间传递全局范围的用户变量mysql> CREATE PROCEDURE p1( ) SET @last_procedure='p1'; mysql> CREATE PROCEDURE p2( ) SELECT CONCAT('Last procedure was ',@last_procedure);mysql> CALL p1( );mysql> CALL p2( );三、运算符:1.算术运算符+ 加 SET var1=2+2; 4- 减 SET var2=3-2; 1* 乘 SET var3=3*2; 6/ 除 SET var4=10/3; 3.3333DIV 整除 SET var5=10 DIV 3; 3% 取模 SET var6=10%3 ; 12.比较运算符> 大于 1>2 False< 小于 2<1 False<= 小于等于 2<=2 True>= 大于等于 3>=2 TrueBETWEEN 在两值之间 5 BETWEEN 1 AND 10 TrueNOT BETWEEN 不在两值之间 5 NOT BETWEEN 1 AND 10 FalseIN 在集合中 5 IN (1,2,3,4) FalseNOT IN 不在集合中 5 NOT IN (1,2,3,4) True= 等于 2=3 False<>, != 不等于 2<>3 False<=> 严格比较两个NULL值是否相等 NULL<=>NULL TrueLIKE 简单模式匹配 "Guy Harrison" LIKE "Guy%" TrueREGEXP 正则式匹配 "Guy Harrison" REGEXP "[Gg]reg" FalseIS NULL 为空 0 IS NULL FalseIS NOT NULL 不为空 0 IS NOT NULL True3.逻辑运算符4.位运算符| 或& 与<< 左移位>> 右移位~ 非(单目运算,按位取反)注释:mysql存储过程可使用两种风格的注释双横杠:--该风格一般用于单行注释c风格:/* 注释内容 */ 一般用于多行注释--------------------流程控制--------------------一、顺序结构二、分支结构ifcase三、循环结构for循环while循环loop循环repeat until循环注:区块定义,常用begin......end;也可以给区块起别名,如:lable:begin...........end lable;可以用leave lable;跳出区块,执行区块以后的代码begin和end如同C语言中的{ 和 }。

--------------------输入和输出--------------------mysql存储过程的参数用在存储过程的定义,共有三种参数类型,IN,OUT,INOUT Create procedure|function([[IN |OUT |INOUT ] 参数名数据类形...])IN 输入参数表示该参数的值必须在调用存储过程时指定,在存储过程中修改该参数的值不能被返回,为默认值OUT 输出参数该值可在存储过程内部被改变,并可返回INOUT 输入输出参数调用时指定,并且可被改变和返回IN参数例子:CREATE PROCEDURE sp_demo_in_parameter(IN p_in INT)BEGINSELECT p_in; --查询输入参数SET p_in=2; --修改select p_in;--查看修改后的值END;执行结果:mysql> set @p_in=1mysql> call sp_demo_in_parameter(@p_in)略mysql> select @p_in;略以上可以看出,p_in虽然在存储过程中被修改,但并不影响@p_id的值OUT参数例子创建:mysql> CREATE PROCEDURE sp_demo_out_parameter(OUT p_out INT)BEGINSELECT p_out;/*查看输出参数*/SET p_out=2;/*修改参数值*/SELECT p_out;/*看看有否变化*/END;执行结果:mysql> SET @p_out=1mysql> CALL sp_demo_out_parameter(@p_out)略mysql> SELECT @p_out;略INOUT参数例子:mysql> CREATE PROCEDURE sp_demo_inout_parameter(INOUT p_inout INT) BEGINSELECT p_inout;SET p_inout=2;SELECT p_inout;END;执行结果:set @p_inout=1call sp_demo_inout_parameter(@p_inout) //略select @p_inout;略附:函数库mysql存储过程基本函数包括:字符串类型,数值类型,日期类型一、字符串类CHARSET(str) //返回字串字符集CONCAT (string2 [,… ]) //连接字串INSTR (string ,substring ) //返回substring首次在string中出现的位置,不存在返回0 LCASE (string2 ) //转换成小写LEFT (string2 ,length ) //从string2中的左边起取length个字符LENGTH (string ) //string长度LOAD_FILE (file_name ) //从文件读取内容LOCATE (substring , string [,start_position ] ) 同INSTR,但可指定开始位置LPAD (string2 ,length ,pad ) //重复用pad加在string开头,直到字串长度为length LTRIM (string2 ) //去除前端空格REPEAT (string2 ,count ) //重复count次REPLACE (str ,search_str ,replace_str ) //在str中用replace_str替换search_str RPAD (string2 ,length ,pad) //在str后用pad补充,直到长度为lengthRTRIM (string2 ) //去除后端空格STRCMP (string1 ,string2 ) //逐字符比较两字串大小,SUBSTRING (str , position [,length ]) //从str的position开始,取length个字符, 注:mysql中处理字符串时,默认第一个字符下标为1,即参数position必须大于等于1 mysql> select substr ing(’abcd’,0,2);+———————–+| substring(’abcd’,0,2) |+———————–+| |+———————–+1 row in set (0.00 sec)mysql> select substring(’abcd’,1,2);+———————–+| substring(’abcd’,1,2) |+———————–+| ab |+———————–+1 row in set (0.02 sec)TRIM([[BOTH|LEADING|TRAILING] [padding] FROM]string2) //去除指定位置的指定字符UCASE (string2 ) //转换成大写RIGHT(string2,length) //取string2最后length个字符SPACE(count) //生成count个空格二、数值类型ABS (number2 ) //绝对值BIN (decimal_number ) //十进制转二进制CEILING (number2 ) //向上取整CONV(number2,from_base,to_base) //进制转换FLOOR (number2 ) //向下取整FORMAT (number,decimal_places ) //保留小数位数HEX (DecimalNumber ) //转十六进制注:HEX()中可传入字符串,则返回其ASC-11码,如HEX(’DEF’)返回4142143也可以传入十进制整数,返回其十六进制编码,如HEX(25)返回19LEAST (number , number2 [,..]) //求最小值MOD (numerator ,denominator ) //求余POWER (number ,power ) //求指数RAND([seed]) //随机数ROUND (number [,decimals ]) //四舍五入,decimals为小数位数]注:返回类型并非均为整数,如:(1)默认变为整形值mysql> select round(1.23);+————-+| round(1.23) |+————-+| 1 |+————-+1 row in set (0.00 sec)mysql> select round(1.56);+————-+| round(1.56) |+————-+| 2 |+————-+1 row in set (0.00 sec)(2)可以设定小数位数,返回浮点型数据mysql> select round(1.567,2);+—————-+| round(1.567,2) |+—————-+| 1.57 |+—————-+1 row in set (0.00 sec)SIGN (number2 ) //返回符号,正负或0SQRT(number2) //开平方三、日期类型ADDTIME (date2 ,time_interval ) //将time_interval加到date2CONVERT_TZ (datetime2 ,fromTZ ,toTZ ) //转换时区CURRENT_DATE ( ) //当前日期CURRENT_TIME ( ) //当前时间CURRENT_TIMESTAMP ( ) //当前时间戳DATE (datetime ) //返回datetime的日期部分DATE_ADD (date2 , INTERVAL d_value d_type ) //在date2中加上日期或时间DATE_FORMAT (datetime ,FormatCodes ) //使用formatcodes格式显示datetime DATE_SUB (date2 , INTERVAL d_value d_type ) //在date2上减去一个时间DATEDIFF (date1 ,date2 ) //两个日期差DAY (date ) //返回日期的天DAYNAME (date ) //英文星期DAYOFWEEK (date ) //星期(1-7) ,1为星期天DAYOFYEAR (date ) //一年中的第几天EXTRACT (interval_name FROM date ) //从date中提取日期的指定部分MAKEDATE (year ,day ) //给出年及年中的第几天,生成日期串MAKETIME (hour ,minute ,second ) //生成时间串MONTHNAME (date ) //英文月份名NOW ( ) //当前时间SEC_TO_TIME (seconds ) //秒数转成时间STR_TO_DATE (string ,format ) //字串转成时间,以format格式显示TIMEDIFF (datetime1 ,datetime2 ) //两个时间差TIME_TO_SEC (time ) //时间转秒数]WEEK (date_time [,start_of_week ]) //第几周YEAR (datetime ) //年份DAYOFMONTH(datetime) //月的第几天HOUR(datetime) //小时LAST_DAY(date) //date的月的最后日期MICROSECOND(datetime) //微秒MONTH(datetime) //月MINUTE(datetime) //分注:可用在INTERVAL中的类型:DAY ,DAY_HOUR ,DAY_MINUTE ,DAY_SECOND ,HOUR ,HOUR_MINUTE ,HOUR_SE COND ,MINUTE ,MINUTE_SECOND,MONTH ,SECOND ,YEARDECLARE variable_name [,variable_name...] datatype [DEFAULT value];其中,datatype为mysql的数据类型,如:INT, FLOAT, DATE, VARCHAR(length)例:DECLARE l_int INT unsigned default 4000000;DECLARE l_numeric NUMERIC(8,2) DEFAULT 9.95;DECLARE l_date DATE DEFAULT '1999-12-31';DECLARE l_datetime DATETIME DEFAULT '1999-12-31 23:59:59';DECLARE l_varchar VARCHAR(255) DEFAULT 'This will not be padded';SQL Server版语法为了方便说明,数据库使用SQL Server的示例数据库,Northwind和pubs,如果SQL Server中没有的话,可以按下面的方法安装1,下载SQL2000SampleDb.msi,下载地址是:/downloads/details.aspx?FamilyId=06616212-0356-46A0-8DA2-EEBC53A68034&displaylang=en2,安装后,到默认目录C:\SQL Server 2000 Sample Databases 有instnwnd.sql ,instpubs.sql两个文件3,在sql server中运行这两个sql 就可以创建你Northwind和pubs数据库。

相关文档
最新文档