存储过程语法及实例

合集下载

sqlite数据库存储过程的写法

sqlite数据库存储过程的写法

SQLite是一种轻量级的数据库管理系统,它可以在各种操作系统上运行,并且可以在嵌入式设备和大型企业服务器上使用。

SQLite的存储过程功能使得用户可以将一系列的SQL语句保存和执行,这为用户提供了更加灵活和高效的数据操作方式。

1. 存储过程的定义SQLite的存储过程是一组为了完成特定任务而保存在数据库中的SQL 语句集合。

存储过程可以接受参数,进行计算,生成结果集等。

存储过程的主要作用是为了提高数据库操作的效率和安全性,并且可以减少客户端和服务器之间的通信次数。

2. 存储过程的语法SQLite的存储过程使用CREATE PROCEDURE语句进行定义,语法格式如下:```sqlCREATE PROCEDURE procedure_name (parameter1, parameter2, ...)ASsql_statement;```其中,procedure_name为存储过程的名称,parameter1, parameter2为存储过程的参数,sql_statement为存储过程的SQL 语句。

3. 存储过程的参数SQLite的存储过程可以接受零个或多个参数,参数可以是输入参数、输出参数或者输入输出参数。

存储过程的参数在定义时需要指定参数的名称和数据类型,以及参数的模式(输入、输出或输入输出)。

```sqlCREATE PROCEDURE procedure_name (IN parameter1data_type, OUT parameter2 data_type, INOUT parameter3 data_type)ASsql_statement;```4. 存储过程的实例下面我们用一个实例来演示SQLite存储过程的写法。

假设我们需要创建一个存储过程,通过传入两个参数计算它们的和并返回结果。

```sqlCREATE PROCEDURE add_two_numbers (IN num1 INTEGER, IN num2 INTEGER, OUT result INTEGER)ASBEGINSET result = num1 + num2;END;```在上面的例子中,我们定义了一个名为add_two_numbers的存储过程,它接受两个输入参数num1和num2,并返回一个输出参数result。

存储过程if else语句用法

存储过程if else语句用法

在存储过程中,可以使用IF-ELSE语句来实现条件判断和逻辑控制。

IF-ELSE语句的基本语法如下:
IF condition THEN
--执行代码块1
ELSE
--执行代码块2
END IF;
其中,condition 是要判断的条件,如果条件为真,就执行代码块1;否则,就执行代码块2。

下面是一个简单的例子,演示如何在存储过程中使用IF-ELSE语句:
CREATE PROCEDURE my_procedure
BEGIN
DECLARE x INT;
SET x = 5;
IF x > 0 THEN
--执行代码块1
SELECT 'x是正数';
ELSE
--执行代码块2
SELECT 'x是负数或0';
END IF;
END;
在这个例子中,我们首先声明一个整数变量x,并将其赋值为5。

然后,我们使用IF-ELSE 语句来判断x 的值。

如果x 大于0,就执行代码块1,输出x是正数;否则,就执行代码块2,输出x是负数或0。

存储过程案例

存储过程案例

存储过程案例
存储过程(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存储过程开发基础语法

1、创建存储过程create or replace procedure test(var_name_1 in type,var_name_2 out type) as--声明变量(变量名变量类型)begin--存储过程的执行体end test;打印出输入的时间信息E.g:create or replace procedure test(workDate in Date) isbegindbms_output.putline('The input date is:'||to_date(workDate,'yyyy-mm-dd'));end test;2、变量赋值变量名 := 值;E.g:create or replace procedure test(workDate in Date) isx number(4,2);beginx := 1;end test;3、判断语句:if 比较式 then begin end; end if;E.gcreate or replace procedure test(x in number) is beginif x >0 thenbeginx := 0 - x;end;end if;if x = 0 then beginx: = 1;end;end if;end test;4、For 循环For ... in ... LOOP--执行语句end LOOP;(1)循环遍历游标create or replace procedure test() asCursor cursor is select name from student; name varchar(20);beginfor name in cursor LOOPbegindbms_output.putline(name);end;end LOOP;end test;(2)循环遍历数组create or replace procedure test(varArray in myPackage.TestArray) as--(输入参数varArray 是自定义的数组类型,定义方式见标题6)i number;begini := 1; --存储过程数组是起始位置是从1开始的,与java、C、C++等语言不同。

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存储过程全面实例讲解

(完整版)SQL存储过程全面实例讲解

SQL实例讲解一、创建存储过程结构CREATE PROCEDURE创建存储过程,存储过程是保存起来的可以接受和返回用户提供的参数的Transact-SQL 语句的集合。

可以创建一个过程供永久使用,或在一个会话中临时使用(局部临时过程),或在所有会话中临时使用(全局临时过程)。

也可以创建在 Microsoft SQL Server启动时自动运行的存储过程。

语法CREATE PROC [ EDURE ] procedure_name [ ; number ][ { @parameter data_type }[ VARYING ] [ = default ] [ OUTPUT ]] [ ,...n ][ WITH{ RECOMPILE | ENCRYPTION | RECOMPILE , ENCRYPTION } ][ FOR REPLICATION ]AS sql_statement [ ...n ]二、存储过程实例讲解1. 使用带有复杂 SELECT 语句的简单过程下面的存储过程从四个表的联接中返回所有作者(提供了姓名)、出版的书籍以及出版社。

该存储过程不使用任何参数。

USE pubsIF EXISTS (SELECT name FROM sysobjectsWHERE name = 'au_info_all' AND type = 'P')DROP PROCEDURE au_info_allGOCREATE PROCEDURE au_info_allASSELECT au_lname, au_fname, title, pub_nameFROM authors a INNER JOIN titleauthor taON a.au_id = ta.au_id INNER JOIN titles tON t.title_id = ta.title_id INNER JOIN publishers pON t.pub_id = p.pub_idGOau_info_all 存储过程可以通过以下方法执行:EXECUTE au_info_all-- OrEXEC au_info_all如果该过程是批处理中的第一条语句,则可使用:au_info_all2. 使用带有参数的简单过程下面的存储过程从四个表的联接中只返回指定的作者(提供了姓名)、出版的书籍以及出版社。

SQLserver存储过程语法及实例

SQLserver存储过程语法及实例

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

--------------------基本语法--------------------一.创建存储过程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 False IN 在集合中 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语言中的{ 和 }。

  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 substring(’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_valued_type ) //在date2中加上日期或时间DATE_FORMAT (datetime ,FormatCodes ) //使用formatcodes格式显示datetime DATE_SUB (date2 , INTERVAL d_valued_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_numericNUMERIC(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-EEBC53 A68034&displaylang=en2,安装后,到默认目录C:\SQL Server 2000 Sample Databases 有instnwnd.sql ,instpubs.sql两个文件3,在sql server中运行这两个sql 就可以创建你Northwind和pubs数据库。

相关文档
最新文档