1、12.3.3 执行存储过程当需要执行存储过程时,可使用 EXECUTE 或 EXEC 语句。如果存储过程是批处理中的第一条语句,那么不使用 EXECUTE 或 EXEC 关键字也可以执行该存储过程。如果存储过程编写为可以接受参数值,那么可以提供参数值。任务 12.4 问题描述:执行任务 12.3 创建的存储过程 Insertproduct,向产品表中追加一行。解决方案 1:EXEC Insertproduct 8,Konbu, 2 kg box, 24,6.0000, 5,10,0解决方案 2:EXEC Insertproduct 8,Konbu, 2 kg box, 24,6.0000, 5
2、,10解决方案 3:EXEC Insertproduct default,Konbu, 2 kg box, 24,6.0000, 5,10解决方案 4:EXEC Insertproduct ProductName=Konbu,QuantityPerUnit=2 kg box, UnitsInStock=24,UnitPrice=6.0000,UnitsOnOrder=5,ReorderLevel=10解决方案 5:EXEC Insertproduct ReorderLevel=10, UnitsOnOrder=5, UnitsInStock=24,UnitPrice=6.0000, Quant
3、ityPerUnit=2 kg box,ProductName=Konbu分析与讨论:1.如果存储过程含有参数,则在执行存储过程时,必须为这些参数提供值(具有默认值的参数可以不提供值),而且提供的值必须是确定的值,例如方案 1。并且必须按照 CREATE PROCEDURE 语句中存储过程参数给出的顺序提供参数值,以下语句就会发生错误,因为不是按照顺序提供参数值。EXEC Insertproduct Konbu,8,2 kg box, 24,6.0000, 5,10,02.如果存储过程含有默认值参数,则在执行存储过程时,可省略为默认值参数提供值,但其它参数的值不能够省略,必须为这些参数提供值。
4、例如方案 2,没有为Discontinued参数提供值,则在执行存储过程时该参数的值为其默认值 1. 3.虽然可以省略已提供默认值的参数,但只能截断参数列表。例如,如果一个存储过程有八个参数,可以省略第七个和第八个参数,但不能跳过第七个参数而仍然包含第八个参数,除非以 parameter = value 形式提供参数(参见 4)。例如,方案 2 中,CategoryID 参数尽管是有默认值的参数,但由于它是第一个参数,而存储过程第二个参数必须提供值,因此执行存储过程时要为CategoryID 参数提供值,不能省略。如果要使用默认值作为参数的值,则可以使用 DEFAULT 关键字,例如方案 3。
5、如果在存储过程中定义了参数的默认值,那么下列情况下将使用默认值:1)执行存储过程时未指定参数值。2)将 DEFAULT 关键字指定为参数值。4. 执行存储过程时,既可以通过提供在 CREATE PROCEDURE 语句中给定的参数值(如解决方案 1,解决方案 2),来向存储过程参数传递值。也可以通过显式指定参数名称并分配适当的值(使用 parameter = value 的形式),来给存储过程参数传递值。如果使用 parameter = value 的形式,那么可以按任意顺序提供参数,还可以省略那些已提供默认值的所有参数。注意,如果以 parameter = value 形式提供了一个参数,就
6、必须按此种形式提供后面所有的参数。例如解决方案 4 和解决方案 5,执行存储过程时存储过程ProductName 参数的值为 Konbu,QuantityPerUnit 参数的值为2 kg box, UnitsInStock 参数的值为 24,UnitPrice 参数的值为 6.0000,UnitsOnOrder 参数的值为5,ReorderLevel 参数的值为 10,没有提供CategoryID 和Discontinued 参数的值,它们的值为其默认值。执行存储过程时,如果参数名称和存储过程的参数名称不匹配,则这些参数都不会被接受。例如以下代码参数名称ReorderLevelA 和存储过程
7、的参数名称不匹配,则参数ReorderLevelA 不会被接受。EXEC Insertproduct ReorderLevelA=10, UnitsOnOrder=5, UnitsInStock=24,UnitPrice=6.0000, QuantityPerUnit=2 kg box,ProductName=Konbu执行存储过程时,服务器将拒绝所有未包含在存储过程创建期间的参数列表中的参数。注意,在执行存储过程时指定参数名称允许按任意顺序提供参数值。如果未指定参数名称,则必须按照参数在存储过程中定义时的顺序(从左至右)来提供参数值(按照位置传递参数值),并且,如果给某一参数提供了值,则该参
8、数前面的所有参数必须为它们提供值,即使这些参数有默认值(如方案 2)。12.4.1 使用变量、 IF 语句和 RETURN 语句变量用来存储程序在运行过程中可以使用的值,用户可以定义变量,用户定义的变量称为局部变量。IF 语句根据表达式的值选择要执行的语句。IF 语句的一般表示形式为:IF (表达式) BEGIN语句块;ENDIF 语句的执行方式如下:如果表达式的值为 TRUE,则执行语句块,否则语句块不会被执行。语句块可为一条或多条语句,如果句块可为一条语句,可省略 BEGIN、END 。任务 12.6 问题描述: 创建一个存储过程,用参数指定的产品类别 ID 的值查询该类的所有产品,并测试
9、错误,如果存储过程成功执行,则存储过程返回 0,如果执行存储过程时,执行存储过程中的 SQL 语句发生错误,则存储过程返回返回错误号。并创建代码测试该程序过程。解决方案:1)创建 ProductsByCategory1 存储过程CREATE Procedure ProductsByCategory1(CategoryID int)ASDECLARE ErrorSave int;SET ErrorSave = 0;SELECT * FROM ProductsWHERE CategoryID = CategoryIDORDER BY ProductName;IF (ERROR 0 的值为 FALS
10、E,这时不执行 SET ErrorSave = ERROR 语句。如果ERROR 的值不为 0,则条件表达式ERROR 0 的值 TRUE,这时执行 SET ErrorSave = ERROR 语句。该语句将 ERROR 的值赋给变量ErrorSave。6. 使用 BEGIN.END。BEGIN 和 END 用于定义语句块,它们可以用于定义一系列一起执行的 SQL 语句。BEGIN 和 END 语句必须成对使用,任何一个均不能单独使用。BEGIN 语句单独出现在一行中,后跟 SQL 语句块。最后, END 语句单独出现在一行中,指示语句块的结束。BEGIN 和 END 语句块必须至少包含一条
11、SQL 语句。7. RETURN 语句。RETURN 语句无条件从查询、存储过程或批处理中退出。RETURN 语句后面的语句都不执行。RETURN 语句的一般格式为:RETURN integer_expression 其中 integer_expression 为返回的整数值或整型表达式。当在存储过程中使用 RETURN 语句时,此语句可以指定返回给调用程序、批处理或过程的整数值。如果 RETURN 未指定值,则存储过程返回 0。以上 ProductsByCategory1 存储过程中,当执行 RETURN ErrorSave 语句时,退出存储过程,并将ErrorSave 作为存储过程的值返回。8. SQL 语句中可包含存储过程返回的值,但必须以下列格式输入:EXECUTE return_status = 。例如:EXECUTE ReturnStatus =ProductsByCategory1 1;该语句执行存储过程,并将存储过程的返回值赋给变量ReturnStatus。