Stored Procedure
Stored Procedures A stored procedure is a collection of SQL statements stored in a database and executed by name. Are a Transact-SQL extension Allow many users access to same code Provide a centralized and consistent implementation of integrity logic Are used to implement Frequently used queries Business rules Program routines common to other stored procedures like error handling routines
Benefits of Stored Procedures Run faster than the same commands executed interactively as a batch Reduce network traffic Enforce consistency troughout the database Encourage modular application development Help provide security Reduce operator error
Creating Stored Procedure รูปแบบคำสั่ง create proc procedure_name as SQL_Statements [Return] ตัวอย่าง create proc proc_select_pubs Select * from publishers Retrun
Examining, Renaming and Dropping (using ISQLW) Examining a procedure sp_Help [proc_name] sp_helptext proc_name Rename a procedure sp_rename old_name , new_name Drop a procedure drop proc_name
Using Input Parameters An input parametrs is a variable value supplies from a calling program to the stored procedure The input parameter is defined within the stored procedure in order to execute the stored procedure with the corresponding argument Benefit : Procedure parameters increase a procedure flexibility
Using Input Parameters รูปแบบคำสั่ง create proc procedure_name (@parameters datatype[ , @parameters datatype …]) as SQL_Statements Return ตัวอย่าง procedure รับค่า 1 ค่า create proc proc_author_addr (@lname varchar(40)) as Select au_id, au_fname, au_lanme, phone, address From authors Where au_lname = @lname
Guidline for Using Parameters สามารถรับ parameter ได้ถึง 255 parameters ค่า parameter ที่ส่งมาอาจเป็น wildcard ก็ได้ ถ้า parameter ถูกใช้ใน Like clause เราไม่สามารถใช้ชื่อ object เป็น parameter ได้ ชื่อ ชนิดข้อมูล และ ค่าปริยาย ของ parameters จะถูกกำหนดเมื่อ procedure ถูกสร้าง Data type สามารถเป็นได้ทั้งที่เรากำหนดเองหรือใช้ system datatype ก็ได้
Execute a Stored Procedure With a single parameters exec procedure_name @parameter_name = value by name declare @lastname varchar(40) select @lastname = “Green” exec proc_author_addr @lname=@lastname by position exec proc_author_addr @lastname
Execute a Stored Procedure Using multiple parameters ตัวอย่างการสร้าง Stored Procedureby รับค่าหลายค่า create proc author_addr2 (@lname varchar(40),@state char(2)) as select au_id,au_fname,au_lanme,phone,address,city,state,postalcode from authors where upper(au_lanme) like upper(@lname)+”%” and upper(state)=upper(@state) return
With multiple parameters Execute a Stored Procedure With multiple parameters exec procedure_name @parameter_name = value by name exec author_addr2 @state=“CA”, @lname=“green” by position exec author_addr2 “green” , ”CA”
One or more parameters is missing Common Errors with Input Parameters Passed parameters are not compatible with the datatype of the parameter The way in which parameters are passed is mixed;parameters are passed by name and by position One or more parameters is missing Missing parameters can be overcome by using default values for input parameers Parameters are passed in the wrong order
ต้องใส่ keyword output เพื่อกำหนด return parameter Returning Values from a Procedure ต้องใส่ keyword output เพื่อกำหนด return parameter ในการรับค่าโปรแกรมที่เรียกต้องกำหนด parameter เป็นแบบ output ในคำสั่ง execute
ตัวอย่างการสร้าง stored procedure แบบมีการส่งค่ากลับ Returning Values from a Procedure ตัวอย่างการสร้าง stored procedure แบบมีการส่งค่ากลับ create proc proc_num_sales (@book_id char(6)=null , @tot_sales int output) as select @tot_sales=sum(qty) from sales where title_id = @book_id return
ตัวอย่างโปรแกรมรับค่ากลับ จาก stored procedure Returning Values from a Procedure ตัวอย่างโปรแกรมรับค่ากลับ จาก stored procedure declare @total int, @tid char(6) select @tid = “PS2091” exec proc_num_sales @tid , @total output select “Book ID” = @tid , “Total sales” = @total Book ID Total sales ----------- ----------- PS2091 108
Calling Batch Program Example : Two-Way Parameter Passing declare @qty_ordered int , @actual_qry int , @item_ordered char(10) select @qty_ordered = 50 select @actual_qty = @qty_ordered select @item_ordered = “1095-87654” exec proc_dec_inventory @item_ordered , @actual_qty output -- additional procedure here. Includes error handling, etc. Select “Quantity shipped is “ + convert(char(10), @actual_qty) + “out of” + convert(char(10) , @qty_ordered)
Calling proc_dec_inventory Procedure Example : Two-Way Parameter Passing (cont.1) Calling proc_dec_inventory Procedure create proc proc_dec_inventory (@item_ordered char(10) , @actual_qty int output) as declare @qty_stock int , @back_order int select @back_order = 0 if not exists (select * from inventory where item = @item_ordered) begin raiserror 20010 “Item not listed.” return end
Calling proc_dec_inventory Procedure (ต่อ) Example : Two-Way Parameter Passing (cont.2) Calling proc_dec_inventory Procedure (ต่อ) select @qty_stock = stock from inventory where item=@item_ordered if @qty_stock < @actual_qty select @back_order = @actual_qty - @qty_stock , @actual_qty = @qty_stock update inventory set stock = stock - @actual_qty set backordered_qty = @back_order + backordered_qty where @item_ordered = item return
Returning Procedure Status Every procedure automatically returns a return status Zero is returned for successful completion -1 through -99 are returned for detected errors Use the return statement to specify a return value Examples : return 10 The calling program can test for the return status
Example : Return Status Example of a procedure that returns status : create proc proc_author_addr (@lname varchar(40)) as if not exists (select * from authors where upper(au_lname) like upper (@lname) + “%”) return -900 select au_id , au_fname , au_lname , phone , address , city , state , postalcode from authors where upper(au_lname) like upper(@lname) + “%” return 0
Example : Return Status (cont.) Example of a calling program that checks the return status : declare @ret_status int exec @ret_status = procauthor_addr @lname = “Stringer” if @ret_status != 0 begin Print “Error finding name.” return end else Print “Name was found.”