经常有朋友问我这个存储过程怎么写?作为经历过的人,我当初也有这样的苦恼。今天我将告诉你如何创建和使用这个存储过程。什么是存储过程?存储过程是一组可编程函数。它是一组完成特定功能的SQL语句。它被编译并保存在数据库中。用户可以指定存储过程的名称并赋予参数(需要时)调用来执行。关键词:可编程,具体功能,调用和创建存储过程我们以customers表为例,通过customerID的值查询客户的具体信息:tablecustomersexample:CREATEPROCEDUREsp_customers(INcusidINT)BEGINSELECT*FROMcustomersWHERE`customerID`=cusid;END;以上是一个比较简单的存储过程,主要功能是查询客户信息。这里简单说明一下:CREATEPROCEDURE:这是创建存储过程的关键字,是固定的语法。sp_customers:这是存储过程的名称。当我们执行存储过程时,系统中会出现一个这个名字的存储过程,可以自定义。IN:这个是输入参数的意思。当然,还有输出参数的关键字OUT。同时,也可以不定义参数,将参数留空。cusidINT:这个是定义参数名和类型,这里我们定义一个参数名,名字叫cusid,类型是INT。BEGIN...END:这是存储过程体的固定语法,中间写着你需要执行的SQL函数。调用存储过程在上面我们创建了存储过程之后,我们就可以调用它了。调用存储过程的语法很简单:CALLsp_name([parameter])我们调用上面的存储过程sp_customersCALLsp_customers(1);说明:上述代码的意思是将客户ID为1的数据传递给存储过程sp_customers,通过CALL调用存储过程执行。结果是:细心的朋友可能已经发现了。这不就是一个简单的WHERE查询语句吗?是的,当你第一次开始使用存储过程时,你不需要把它弄得神秘莫测。越是觉得神秘,越是难以熟练使用。复杂的东西应该先简单化,然后才能进一步掌握。进程体进程体就是我们调用时必须执行的SQL语句。上面的SELECT查询是一个简单的过程体。过程体包括DML、DDL语句、if-then-else和while-do语句、声明变量的declare语句等。过程体的格式上面也已经演示过了,以BEGIN开始,以END结束(可以是嵌套)。例如:BEGINBEGINBEGIN--SQL代码;ENDENDEND注意:每个嵌套块和其中的每条SQL语句必须以分号(;)结尾。BEGIN-END块(也称为复合语句)表示过程主体的结束,即在END之后,不需要分号。Labels标签通常与BEGIN-END一起使用,以增强代码的可读性。语法为:[label_name:]BEGIN[statement_list]END[label_name]例如:label1:BEGINlabel2:BEGINlabel3:BEGIN--SQL代码;ENDlabel3;ENDlabel2;ENDlabel1这个函数不常用,了解一下就好了。存储过程的参数上面我们大致讲了存储过程参数的定义,接下来我们会详细的告诉大家如何使用参数。参数类型IN输入参数:表示调用者向过程传入一个值(传入的值可以是文字或变量)OUT输出参数:表示过程向调用者发送一个值(可以返回多个值)(传出的值只能是一个变量)INOUT输入输出参数:不仅意味着调用者传入一个值给过程,也意味着过程向调用者发送一个值(该值只能是变量)上面IN入参的例子是一个入参的例子,这里不再赘述。OUT输出参数CREATEPROCEDUREsp_customers_out(OUTcusnameVARCHAR(20))BEGINSELECTcusname;SELECT`name`INTOcusnameFROMcustomersWHERE`customerID`=1;SELECTcusname;END调用上面的存储过程:CALLsp_customers_out(@cusname);结果为:result1result2上面我们定义了一个参数,其输出参数为cusname(这里,如果参数类型有长度,则必须给出长度)。然后在进程体中,我们两次输出参数的结果,结果1为NULL,因为我们的输出参数cusname没有收到任何值,所以为NULL;结果2中包含客户名,因为我们把客户ID为1的客户名传给了输出参数cusname。INOUT输入输出参数不通用,但也有使用,即同一个参数既是输入参数又是输出参数。我们稍微修改一下上面的存储过程就可以看出区别了。CREATEPROCEDUREsp_customers_inout(INOUTcusnameVARCHAR(20))BEGINSELECTcusname;SELECT`Name`INTOcusnameFROMcustomersWHERE`customerID`=2;SELECTcustomers;END在调用上面的存储过程之前,我们先给一个入参:张三SET@cusname='张三';CALLsp_customers_inout(@cusname);结果为:Result1Result2上面我们定义了一个参数,其输入输出参数为cusname。然后在流程体中,我们两次输出参数的结果:第一次我们将定义的“张三”(SET@cusname='张三')传递给参数cusname,现在是一个输入参数。进入流程体后,输出结果1为“张三”,参数cusname为此时的输出参数;然后通过查询再次将客户ID为2的客户名称传给cusname,改变其值,也是此时输出的参数,只是输出发生了变化。以上是三个参数的用法。建议:需要输入值时使用IN参数;需要返回值时使用OUT参数;尽可能少地使用INOUT参数。
