กระบวนการที่เก็บไว้คือคำสั่ง SQL หนึ่งคำสั่งขึ้นไปที่จัดเก็บไว้ในฐานข้อมูลเป็นอ็อบเจ็กต์ที่ปฏิบัติการได้
คำจำกัดความนั้นเป็นนามธรรมเสมอ กระบวนการที่เก็บไว้จริงๆ แล้วคือชุดของคำสั่ง SQL ที่สามารถดำเนินการบางอย่างให้เสร็จสิ้นได้ แต่ชุดคำสั่งนี้จะถูกวางไว้ในฐานข้อมูล (ในที่นี้เราจะพูดถึงเฉพาะ SQL SERVER เท่านั้น) หากเราสร้างกระบวนการที่เก็บไว้และเรียกใช้กระบวนการที่เก็บไว้ใน ASP เราสามารถหลีกเลี่ยงการผสมคำสั่ง SQL กับโค้ด ASP ได้ มีประโยชน์อย่างน้อยสามประการในการทำเช่นนี้:
ประการแรก ปรับปรุงประสิทธิภาพอย่างมาก ความเร็วการดำเนินการของกระบวนการที่เก็บไว้นั้นเร็วมาก และการเรียกกระบวนการที่เก็บไว้สามารถลดจำนวนการโต้ตอบกับฐานข้อมูลได้อย่างมาก
ประการที่สอง ปรับปรุงความปลอดภัย หากคุณผสมคำสั่ง SQL ในโค้ด ASP เมื่อโค้ดถูกโจมตี นั่นหมายความว่าโครงสร้างไลบรารีถูกโจมตีด้วย
ประการที่สาม เอื้อต่อการนำคำสั่ง SQL มาใช้ซ้ำ
ใน ASP โดยทั่วไปกระบวนการที่เก็บไว้จะถูกเรียกผ่านวัตถุคำสั่ง ทั้งนี้ขึ้นอยู่กับสถานการณ์ บทความนี้ยังแนะนำวิธีการเรียกอื่นๆ เพื่อความสะดวกในการอธิบาย การจำแนกประเภทง่ายๆ ต่อไปนี้จัดทำขึ้นตามอินพุตและเอาต์พุตของกระบวนการที่เก็บไว้:
1. กระบวนการจัดเก็บที่ส่งคืนชุดระเบียนเดียวเท่านั้น
สมมติว่ามีกระบวนการที่เก็บไว้ดังต่อไปนี้ (วัตถุประสงค์ของบทความนี้ไม่ได้เพื่ออธิบายไวยากรณ์ T-SQL ดังนั้นกระบวนการที่เก็บไว้จะให้โค้ดโดยไม่มีคำอธิบายเท่านั้น):
/*SP1*/
สร้างขั้นตอน DBO.GETUSERLIST
เช่น
ตั้งหมายเลขเป็น
เริ่ม
เลือก * จาก DBO[USERINFO]
จบ
ไป
กระบวนการที่เก็บไว้ข้างต้นจะรับบันทึกทั้งหมดในตาราง USERINFO และส่งคืนชุดบันทึก รหัส ASP สำหรับการเรียกกระบวนการที่เก็บไว้ผ่านวัตถุ COMMAND เป็นดังนี้:
'** เรียกกระบวนการที่เก็บไว้ผ่านวัตถุ COMMAND **
ติ่ม มายคอมม์, MYRST
SET MYCOMM = SERVER.CREATEOBJECT(ADODB.COMMAND)
MYCOMM.ACTIVECONNECTION = MYCONSTR 'MYCONSTR คือสตริงการเชื่อมต่อฐานข้อมูล
MYCOMM.COMMANDTEXT = GETUSERLIST 'ระบุชื่อกระบวนการที่เก็บไว้
MYCOMM.COMMANDTYPE = 4 'แสดงว่านี่เป็นกระบวนการที่เก็บไว้
MYCOMM.PREPARED = TRUE 'จำเป็นต้องคอมไพล์คำสั่ง SQL ก่อน
ตั้งค่า MYRST = MYCOMM.EXECUTE
ตั้งค่า MYCOMM = ไม่มีอะไร
ชุดบันทึกที่ได้รับจากกระบวนการจัดเก็บข้อมูลถูกกำหนดให้กับ MYRST จากนั้น MYRST ก็สามารถดำเนินการได้
ในโค้ดข้างต้น แอตทริบิวต์ COMANDTYPE ระบุประเภทของคำขอ ค่าและคำอธิบายมีดังนี้:
-1 บ่งชี้ว่าไม่สามารถกำหนดประเภทของพารามิเตอร์ COMMANDTEXT ได้
1 ระบุว่า COMMANDTEXT เป็นประเภทคำสั่งทั่วไป
2 ระบุว่าพารามิเตอร์ COMMANDTEXT เป็นชื่อตารางด้วย
4 บ่งชี้ว่าพารามิเตอร์ COMMANDTEXT เป็นชื่อของกระบวนการที่เก็บไว้
คุณยังสามารถเรียกกระบวนการที่เก็บไว้ผ่านทางวัตถุ CONNECTION หรือวัตถุ RECORDSET ได้ วิธีการดังต่อไปนี้:
'**การเรียกกระบวนการที่เก็บไว้ผ่านวัตถุ CONNECTION**
ดิมมีคอนน์, มายอาร์สท์
SET MYCONN = SERVER.CREATEOBJECT(ADODB.CONNECTION)
MYCONN.OPEN MYCONSTR 'MYCONSTR คือสตริงการเชื่อมต่อฐานข้อมูล
SET MYRST = MYCONN.EXECUTE(GETUSERLIST,0,4) 'พารามิเตอร์สุดท้ายมีความหมายเหมือนกับ COMMANDTYPE
ตั้งค่า MYCONN = ไม่มีอะไร
'**การเรียกกระบวนการที่เก็บไว้ผ่านวัตถุ RECORDSET**
ดิมมีร์สท์
SET MYRST = SERVER.CREATEOBJECT(ADODB.RECORDSET)
MYRST เปิด GETUSERLIST, MYCONSTR, 0,1,4
'MYCONSTR คือสตริงการเชื่อมต่อฐานข้อมูล พารามิเตอร์สุดท้ายมีความหมายเหมือนกับ COMANDTYPE
2. กระบวนการจัดเก็บโดยไม่มีอินพุตและเอาต์พุต
ดูขั้นตอนการจัดเก็บต่อไปนี้:
/*SP2*/
สร้างขั้นตอน DBO.DELUSERALL
เช่น
ตั้งหมายเลขเป็น
เริ่ม
ลบออกจาก DBO[USERINFO]
จบ
ไป
กระบวนการที่เก็บไว้นี้จะลบบันทึกทั้งหมดในตาราง USERINFO โดยไม่มีอินพุตหรือเอาต์พุตใดๆ โดยพื้นฐานแล้ววิธีการเรียกจะเหมือนกับที่กล่าวไว้ข้างต้น ยกเว้นว่าไม่จำเป็นต้องได้รับชุดบันทึก:
'** เรียกกระบวนการที่เก็บไว้ผ่านวัตถุ COMMAND **
ดิมมี่คอมม์
SET MYCOMM = SERVER.CREATEOBJECT(ADODB.COMMAND)
MYCOMM.ACTIVECONNECTION = MYCONSTR 'MYCONSTR คือสตริงการเชื่อมต่อฐานข้อมูล
MYCOMM.COMMANDTEXT = DELUSERALL 'ระบุชื่อกระบวนการที่เก็บไว้
MYCOMM.COMMANDTYPE = 4 'แสดงว่านี่เป็นกระบวนการที่เก็บไว้
MYCOMM.PREPARED = TRUE 'จำเป็นต้องคอมไพล์คำสั่ง SQL ก่อน
MYCOMM.EXECUTE 'ไม่จำเป็นต้องได้รับชุดบันทึกที่นี่
ตั้งค่า MYCOMM = ไม่มีอะไร
แน่นอนว่ากระบวนการที่จัดเก็บประเภทนี้สามารถเรียกผ่านวัตถุ CONNECTION หรือวัตถุ RECORDSET ได้ อย่างไรก็ตาม วัตถุ RECORDSET จะถูกสร้างขึ้นเพื่อรับชุดระเบียน หากชุดระเบียนไม่ถูกส่งคืน ให้ใช้วัตถุ COMMAND
3. ขั้นตอนการจัดเก็บพร้อมค่าส่งคืน
เมื่อดำเนินการเหมือน SP2 คุณควรใช้ความสามารถในการประมวลผลธุรกรรมอันทรงพลังของ SQL SERVER อย่างเต็มที่เพื่อรักษาความสอดคล้องของข้อมูล นอกจากนี้ เราอาจจำเป็นต้องจัดเก็บสถานะการดำเนินการที่ส่งคืนโดยกระบวนการ ด้วยเหตุนี้ ให้แก้ไข SP2 ดังนี้:
/*SP3*/
สร้างขั้นตอน DBO.DELUSERALL
เช่น
ตั้งหมายเลขเป็น
เริ่ม
เริ่มต้นการทำธุรกรรม
ลบออกจาก DBO[USERINFO]
หาก @@ERROR=0
เริ่ม
กระทำธุรกรรม
กลับ 1
จบ
อื่น
เริ่ม
ธุรกรรมย้อนกลับ
กลับ 0
จบ
กลับ
จบ
ไป
กระบวนการที่เก็บไว้ข้างต้นส่งคืน 1 เมื่อดำเนินการ DELETE สำเร็จ มิฉะนั้นจะคืนค่า 0 และดำเนินการย้อนกลับ เพื่อให้ได้ค่าที่ส่งคืนใน ASP คุณต้องใช้คอลเลกชัน PARAMETERS เพื่อประกาศพารามิเตอร์:
'**เรียกกระบวนการที่เก็บไว้ด้วยค่าที่ส่งคืนและรับค่าที่ส่งคืน**
ติ่ม มายคอมม์ มายปารา
SET MYCOMM = SERVER.CREATEOBJECT(ADODB.COMMAND)
MYCOMM.ACTIVECONNECTION = MYCONSTR 'MYCONSTR คือสตริงการเชื่อมต่อฐานข้อมูล
MYCOMM.COMMANDTEXT = DELUSERALL 'ระบุชื่อกระบวนการที่เก็บไว้
MYCOMM.COMMANDTYPE = 4 'แสดงว่านี่เป็นกระบวนการที่เก็บไว้
MYCOMM.PREPARED = TRUE 'จำเป็นต้องคอมไพล์คำสั่ง SQL ก่อน
'ประกาศค่าส่งคืน
SET MYPARA = MYCOMM.CREATEPARAMETER(ผลตอบแทน,2,4)
MYCOMM.PARAMETERS.APPEND MYPARA
MYCOMM.ดำเนินการ
'รับค่าส่งคืน
ผลตอบแทนที่สลัว
RETVALUE = MYCOMM(0) 'หรือ RETVALUE = MYCOMM.PARAMETERS(0)
ตั้งค่า MYCOMM = ไม่มีอะไร
ใน MYCOMM.CREATEPARAMETER(RETURN,2,4) ความหมายของแต่ละพารามิเตอร์จะเป็นดังนี้:
พารามิเตอร์แรก (RETURE) คือชื่อพารามิเตอร์ ชื่อพารามิเตอร์สามารถตั้งค่าได้ตามใจชอบ แต่โดยทั่วไปควรเหมือนกับชื่อพารามิเตอร์ที่ประกาศในกระบวนการที่จัดเก็บ นี่คือค่าที่ส่งคืน ฉันมักจะตั้งค่าเป็น RETURE
พารามิเตอร์ตัวที่สอง (2) ระบุประเภทข้อมูลของพารามิเตอร์ โปรดดูรหัสประเภททั่วไปตามการอ้างอิง ADO:
ที่อยู่: 20;
ฐานข้อมูลเสริม: 128;
อดบูลีน: 11;
ADCHAR: 129;
เพิ่มเวลาประทับ: 135;
ความสม่ำเสมอ: 0;
ผู้ลงโฆษณา: 3;
แอดสมอลลินท์: 2;
แอดตินยิน: 16;
แอดวาร์ชาร์: 200;
สำหรับค่าตอบแทนสามารถรับได้เฉพาะค่าจำนวนเต็มและ -1 ถึง -99 เป็นค่าที่สงวนไว้
พารามิเตอร์ตัวที่สาม (4) ระบุถึงลักษณะของพารามิเตอร์ โดยที่ 4 ระบุว่านี่คือค่าที่ส่งคืน คำอธิบายของค่าของพารามิเตอร์นี้มีดังนี้:
0: ไม่สามารถกำหนดประเภทได้ 1: พารามิเตอร์อินพุต 2: พารามิเตอร์อินพุตหรือเอาท์พุต;
รหัส ASP ที่ให้ไว้ข้างต้นควรจะกล่าวว่าเป็นรหัสที่สมบูรณ์นั่นคือรหัสที่ซับซ้อนที่สุด
SET MYPARA = MYCOMM.CREATEPARAMETER(ผลตอบแทน,2,4)
MYCOMM.PARAMETERS.APPEND MYPARA
สามารถทำให้ง่ายขึ้น
MYCOMM.PARAMETERS.APPEND MYCOMM.CREATEPARAMETER(RETURN,2,4)
มันยังสามารถทำให้ง่ายขึ้นได้อีก ดังที่จะอธิบายในภายหลัง
สำหรับกระบวนงานที่เก็บไว้พร้อมพารามิเตอร์สามารถเรียกได้โดยใช้วัตถุ COMMAND เท่านั้น (ยังมีข้อมูลที่สามารถเรียกผ่านวัตถุ CONNECTION หรือวัตถุ RECORDSET ได้ แต่ฉันไม่ได้ลอง)
4. กระบวนการจัดเก็บพร้อมพารามิเตอร์อินพุตและพารามิเตอร์เอาต์พุต
ค่าที่ส่งคืนคือพารามิเตอร์เอาต์พุตพิเศษจริงๆ ในกรณีส่วนใหญ่ เราใช้กระบวนการจัดเก็บที่มีทั้งพารามิเตอร์อินพุตและเอาต์พุต ตัวอย่างเช่น เราต้องการรับชื่อผู้ใช้ที่มี ID ที่แน่นอนในตารางข้อมูลผู้ใช้ ในขณะนี้ มีพารามิเตอร์อินพุต ---- ID ผู้ใช้ และพารามิเตอร์เอาต์พุต ---- ชื่อผู้ใช้ กระบวนการจัดเก็บที่ใช้ฟังก์ชันนี้มีดังนี้:
/*SP4*/
สร้างขั้นตอน DBO.GETUSERNAME
@USERIDINT,
@USERNAME วาร์ชาร์ (40) เอาท์พุต
เช่น
ตั้งหมายเลขเป็น
เริ่ม
หาก @USERID คืนค่าเป็นโมฆะ
เลือก @USERNAME=ชื่อผู้ใช้
จาก DBO[USERINFO]
โดยที่ USERID=@USERID
กลับ
จบ
ไป
รหัส ASP ที่เรียกกระบวนการที่เก็บไว้จะเป็นดังนี้:
'**เรียกกระบวนการที่เก็บไว้ด้วยพารามิเตอร์อินพุตและเอาต์พุต**
ติ่ม MYCOMM, ชื่อผู้ใช้, ชื่อผู้ใช้
รหัสผู้ใช้=1
SET MYCOMM = SERVER.CREATEOBJECT(ADODB.COMMAND)
MYCOMM.ACTIVECONNECTION = MYCONSTR 'MYCONSTR คือสตริงการเชื่อมต่อฐานข้อมูล
MYCOMM.COMMANDTEXT = GETUSERNAME 'ระบุชื่อกระบวนการที่เก็บไว้
MYCOMM.COMMANDTYPE = 4 'แสดงว่านี่เป็นกระบวนการที่เก็บไว้
MYCOMM.PREPARED = TRUE 'จำเป็นต้องคอมไพล์คำสั่ง SQL ก่อน
'ประกาศพารามิเตอร์'
MYCOMM.PARAMETERS.APPEND MYCOMM.CREATEPARAMETER(@USERID,3,1,4,USERID)
MYCOMM.PARAMETERS.APPEND MYCOMM.CREATEPARAMETER(@USERNAME,200,2,40)
MYCOMM.ดำเนินการ
'รับพารามิเตอร์'
ชื่อผู้ใช้ = MYCOMM(1)
ตั้งค่า MYCOMM = ไม่มีอะไร
ในโค้ดด้านบน คุณจะเห็นว่าต่างจากการประกาศค่าส่งคืน โดยต้องใช้พารามิเตอร์ 5 ตัวเมื่อประกาศพารามิเตอร์อินพุต และต้องใช้พารามิเตอร์ 4 ตัวเมื่อประกาศพารามิเตอร์เอาต์พุต เมื่อประกาศพารามิเตอร์อินพุต พารามิเตอร์ทั้งห้าได้แก่ ชื่อพารามิเตอร์ ประเภทข้อมูลพารามิเตอร์ ประเภทพารามิเตอร์ ความยาวข้อมูล และค่าพารามิเตอร์ เมื่อประกาศพารามิเตอร์เอาต์พุต จะไม่มีพารามิเตอร์สุดท้าย: ค่าพารามิเตอร์
ควรให้ความสนใจเป็นพิเศษ: เมื่อประกาศพารามิเตอร์ ลำดับจะต้องเหมือนกับที่กำหนดไว้ในกระบวนการจัดเก็บข้อมูล และประเภทข้อมูลและความยาวของแต่ละพารามิเตอร์จะต้องเหมือนกันกับที่กำหนดไว้ในกระบวนการจัดเก็บข้อมูลด้วย
หากกระบวนการที่เก็บไว้มีหลายพารามิเตอร์ โค้ด ASP จะดูยุ่งยาก คุณสามารถใช้คำสั่ง WITH เพื่อทำให้โค้ดง่ายขึ้น:
'**เรียกกระบวนการที่เก็บไว้ด้วยพารามิเตอร์อินพุตและเอาต์พุต (โค้ดแบบง่าย)**
ติ่ม MYCOMM, ชื่อผู้ใช้, ชื่อผู้ใช้
รหัสผู้ใช้=1
SET MYCOMM = SERVER.CREATEOBJECT(ADODB.COMMAND)
ด้วย มายคอมม์
.ACTIVECONNECTION = MYCONSTR 'MYCONSTR คือสตริงการเชื่อมต่อฐานข้อมูล
.COMMANDTEXT = GETUSERNAME 'ระบุชื่อกระบวนการที่เก็บไว้
.COMMANDTYPE = 4 'บ่งชี้ว่านี่เป็นกระบวนการที่เก็บไว้
.PREPARED = TRUE 'ต้องคอมไพล์คำสั่ง SQL ก่อน
.PARAMETERS.APPEND .CREATEPARAMETER(@USERID,3,1,4,USERID)
.PARAMETERS.APPEND .CREATEPARAMETER(@USERNAME,200,2,40)
.ดำเนินการ
ลงท้ายด้วย
ชื่อผู้ใช้ = MYCOMM(1)
ตั้งค่า MYCOMM = ไม่มีอะไร
หากเราต้องการรับชื่อผู้ใช้ 10 ผู้ใช้ที่มี ID 1 ถึง 10 เราจำเป็นต้องสร้างวัตถุ COMMAND 10 ครั้งหรือไม่ เลขที่ หากคุณต้องการเรียกใช้กระบวนการที่เก็บไว้เดียวกันหลายครั้ง เพียงเปลี่ยนพารามิเตอร์อินพุตแล้วคุณจะได้ผลลัพธ์ที่แตกต่างกัน:
'**การเรียกหลายครั้งไปยังกระบวนการที่เก็บไว้เดียวกัน**
ติ่ม MYCOMM, ชื่อผู้ใช้, ชื่อผู้ใช้
ชื่อผู้ใช้=
SET MYCOMM = SERVER.CREATEOBJECT(ADODB.COMMAND)
สำหรับรหัสผู้ใช้ = 1 ถึง 10
ด้วย มายคอมม์
.ACTIVECONNECTION = MYCONSTR 'MYCONSTR คือสตริงการเชื่อมต่อฐานข้อมูล
.COMMANDTEXT = GETUSERNAME 'ระบุชื่อกระบวนการที่เก็บไว้
.COMMANDTYPE = 4 'บ่งชี้ว่านี่เป็นกระบวนการที่เก็บไว้
.PREPARED = TRUE 'ต้องคอมไพล์คำสั่ง SQL ก่อน
ถ้า USERID = 1 แล้ว
.PARAMETERS.APPEND .CREATEPARAMETER(@USERID,3,1,4,USERID)
.PARAMETERS.APPEND .CREATEPARAMETER(@USERNAME,200,2,40)
.ดำเนินการ
อื่น
'กำหนดค่าให้กับพารามิเตอร์อินพุตใหม่ (พารามิเตอร์อินพุตและพารามิเตอร์เอาต์พุตซึ่งค่าพารามิเตอร์ไม่เปลี่ยนแปลงในขณะนี้ไม่จำเป็นต้องประกาศอีกครั้ง)
.พารามิเตอร์(@USERID) = ผู้ใช้
.ดำเนินการ
สิ้นสุด ถ้า
ลงท้ายด้วย
USERNAME = USERNAME + MYCOMM(1) + , 'บางทีคุณอาจต้องการใช้ที่เก็บข้อมูลอาร์เรย์
ต่อไป
ตั้งค่า MYCOMM = ไม่มีอะไร
ดังที่เห็นได้จากโค้ดด้านบน: เมื่อเรียกกระบวนการที่เก็บไว้เดียวกันซ้ำ ๆ คุณจะต้องกำหนดพารามิเตอร์อินพุตใหม่โดยมีค่าที่เปลี่ยนแปลงไป วิธีนี้มีพารามิเตอร์อินพุตและเอาต์พุตหลายตัวและเรียกค่าพารามิเตอร์อินพุตเพียงค่าเดียวเท่านั้น เมื่อมีการเปลี่ยนแปลงเกิดขึ้น จำนวนโค้ดจะลดลงอย่างมาก
5. กระบวนการจัดเก็บพร้อมค่าส่งคืน พารามิเตอร์อินพุต และพารามิเตอร์เอาต์พุตในเวลาเดียวกัน
ตามที่กล่าวไว้ก่อนหน้านี้ เมื่อเรียกใช้กระบวนการที่เก็บไว้ ลำดับในการประกาศพารามิเตอร์จะต้องเหมือนกับลำดับที่กำหนดไว้ในกระบวนการที่เก็บไว้ อีกประเด็นที่ควรให้ความสนใจเป็นพิเศษ: หากกระบวนการที่เก็บไว้มีทั้งค่าที่ส่งคืนและพารามิเตอร์อินพุตและเอาต์พุต จะต้องประกาศค่าที่ส่งคืนก่อน
เพื่อสาธิตวิธีการเรียกในกรณีนี้ เรามาปรับปรุงตัวอย่างข้างต้นกัน ยังคงได้รับชื่อผู้ใช้ของผู้ใช้ที่มี ID 1 แต่เป็นไปได้ว่าผู้ใช้ไม่มี (ผู้ใช้ถูกลบไปแล้ว และ USERID เป็นฟิลด์ที่เพิ่มมากขึ้นเอง) กระบวนการที่เก็บไว้จะส่งกลับค่าที่แตกต่างกันขึ้นอยู่กับว่าผู้ใช้มีหรือไม่ ณ จุดนี้ กระบวนการที่เก็บไว้และโค้ด ASP จะเป็นดังนี้:
/*SP5*/
สร้างขั้นตอน DBO.GETUSERNAME
--เพื่อเพิ่มความประทับใจให้กับคำสั่งซื้อ ให้กลับลำดับคำจำกัดความของพารามิเตอร์สองตัวต่อไปนี้
@USERNAME VARCHAR (40) เอาต์พุต
@USERIDINT
เช่น
ตั้งหมายเลขเป็น
เริ่ม
หาก @USERID คืนค่าเป็นโมฆะ
เลือก @USERNAME=ชื่อผู้ใช้
จาก DBO[USERINFO]
โดยที่ USERID=@USERID
ถ้า @@ROWCOUNT>0
กลับ 1
อื่น
กลับ 0
กลับ
จบ
ไป
'**เรียกกระบวนการที่เก็บไว้ด้วยค่าส่งคืน พารามิเตอร์อินพุต และพารามิเตอร์เอาต์พุต**
ติ่ม MYCOMM, ชื่อผู้ใช้, ชื่อผู้ใช้
รหัสผู้ใช้=1
SET MYCOMM = SERVER.CREATEOBJECT(ADODB.COMMAND)
ด้วย มายคอมม์
.ACTIVECONNECTION = MYCONSTR 'MYCONSTR คือสตริงการเชื่อมต่อฐานข้อมูล
.COMMANDTEXT = GETUSERNAME 'ระบุชื่อกระบวนการที่เก็บไว้
.COMMANDTYPE = 4 'บ่งชี้ว่านี่เป็นกระบวนการที่เก็บไว้
.PREPARED = TRUE 'ต้องคอมไพล์คำสั่ง SQL ก่อน
'ต้องประกาศค่าที่ส่งคืนก่อน
.PARAMETERS.APPEND .CREATEPARAMETER(RETURN,2,4)
'ลำดับการประกาศของพารามิเตอร์สองตัวต่อไปนี้จะกลับรายการตามลำดับเช่นกัน
.PARAMETERS.APPEND .CREATEPARAMETER(@USERNAME,200,2,40)
.PARAMETERS.APPEND .CREATEPARAMETER(@USERID,3,1,4,USERID)
.ดำเนินการ
ลงท้ายด้วย
ถ้า MYCOMM(0) = 1 แล้ว
ชื่อผู้ใช้ = MYCOMM(1)
อื่น
USERNAME = ผู้ใช้รายนี้ไม่มี
สิ้นสุด ถ้า
ตั้งค่า MYCOMM = ไม่มีอะไร
6. กระบวนการจัดเก็บที่ส่งคืนพารามิเตอร์และชุดระเบียนในเวลาเดียวกัน
บางครั้ง เราจำเป็นต้องมีกระบวนการจัดเก็บเพื่อส่งคืนพารามิเตอร์และชุดบันทึกในเวลาเดียวกัน ตัวอย่างเช่น เมื่อใช้กระบวนการจัดเก็บสำหรับเพจ เราจำเป็นต้องส่งคืนพารามิเตอร์ เช่น ชุดบันทึกและปริมาณข้อมูลทั้งหมดในเวลาเดียวกัน ต่อไปนี้เป็นกระบวนการที่เก็บไว้สำหรับเพจ:
/*SP6*/
สร้างขั้นตอน DBO.GETUSERLIST
@IPAGECOUNT INT OUTPUT, --จำนวนหน้าทั้งหมด
@IPAGE INT, --หมายเลขหน้าปัจจุบัน
@IPAGESIZE INT --จำนวนบันทึกต่อหน้า
เช่น
ตั้งหมายเลขเป็น
เริ่ม
--สร้างตารางชั่วคราว
สร้างตาราง #T (ID INT IDENTITY, --ฟิลด์เพิ่มอัตโนมัติ
ผู้ใช้ ID INT
ชื่อผู้ใช้ วาร์ชาร์(40))
--เขียนข้อมูลลงในตารางชั่วคราว
ใส่ลงใน #T
เลือก USERID, ชื่อผู้ใช้จาก DBO [USERINFO]
สั่งซื้อตามรหัสผู้ใช้
--รับจำนวนบันทึกทั้งหมด
ประกาศ @IRECORDCOUNT INT
SET @IRECORDCOUNT = @@ROWCOUNT
--กำหนดจำนวนหน้าทั้งหมด
ถ้า @IRECORDCOUNT%@IPAGESIZE=0
SET @IPAGECOUNT=เพดาน(@IRECORDCOUNT/@IPAGESIZE)
อื่น
SET @IPAGECOUNT=CEILING(@IRECORDCOUNT/@IPAGESIZE)+1
--หากหมายเลขหน้าที่ร้องขอมากกว่าจำนวนหน้าทั้งหมด หน้าสุดท้ายจะปรากฏขึ้น
ถ้า @IPAGE > @IPAGECOUNT
เลือก @IPAGE = @IPAGECOUNT
--กำหนดบันทึกจุดเริ่มต้นและจุดสิ้นสุดของหน้าปัจจุบัน
ประกาศ @ISTART INT -- เริ่มบันทึก
ประกาศ @IEND INT --END บันทึก
เลือก @ISTART = (@IPAGE - 1) * @IPAGESIZE
เลือก @IEND = @ISTART + @IPAGESIZE + 1
--Get บันทึกหน้าปัจจุบัน
SELECT * จาก #T โดยที่ ID>@ISTART และ ID<@IEND
--ลบตารางชั่วคราว
วางตาราง #T
--ส่งคืนจำนวนระเบียนทั้งหมด
ส่งคืน @IRECORDCOUNT
จบ
ไป
ในกระบวนการจัดเก็บข้างต้น ให้ป้อนหมายเลขหน้าปัจจุบันและจำนวนบันทึกต่อหน้า จากนั้นส่งคืนชุดบันทึกของหน้าปัจจุบัน จำนวนหน้าทั้งหมด และจำนวนบันทึกทั้งหมด เพื่อให้เป็นแบบทั่วไปมากขึ้น จำนวนระเบียนทั้งหมดจะถูกส่งกลับเป็นค่าที่ส่งคืน ต่อไปนี้คือรหัส ASP ที่เรียกกระบวนการที่เก็บไว้ (การดำเนินการเพจเฉพาะจะถูกละเว้น):
'**กระบวนการจัดเก็บเพจการโทร**
DIM PAGENOW, ขนาดหน้า, จำนวนหน้า, จำนวนบันทึก
ติ่ม มายคอมม์, MYRST
PAGENOW = คำขอ (PN)
'ฟังก์ชันแบบกำหนดเองที่ใช้ในการตรวจสอบจำนวนธรรมชาติ
หากตรวจสอบ (PAGENOW) = FALSE แล้ว PAGENOW = 1
ขนาดหน้า = 20
SET MYCOMM = SERVER.CREATEOBJECT(ADODB.COMMAND)
ด้วย มายคอมม์
.ACTIVECONNECTION = MYCONSTR 'MYCONSTR คือสตริงการเชื่อมต่อฐานข้อมูล
.COMMANDTEXT = GETUSERLIST 'ระบุชื่อกระบวนการที่เก็บไว้
.COMMANDTYPE = 4 'บ่งชี้ว่านี่เป็นกระบวนการที่เก็บไว้
.PREPARED = TRUE 'ต้องคอมไพล์คำสั่ง SQL ก่อน
'มูลค่าที่ส่งคืน (จำนวนบันทึกทั้งหมด)
.PARAMETERS.APPEND .CREATEPARAMETER(RETURN,2,4)
'พารามิเตอร์เอาต์พุต (จำนวนหน้าทั้งหมด)
.PARAMETERS.APPEND .CREATEPARAMETER(@IPAGECOUNT,3,2)
'พารามิเตอร์อินพุต (หมายเลขหน้าปัจจุบัน)
.PARAMETERS.APPEND .CREATEPARAMETER(@IPAGE,3,1,4,PAGENOW)
'พารามิเตอร์อินพุต (จำนวนบันทึกต่อหน้า)
.PARAMETERS.APPEND .CREATEPARAMETER(@IPAGESIZE,3,1,4,PAGESIZE)
ตั้งค่า MYRST = .ดำเนินการ
ลงท้ายด้วย
หาก MYRST.STATE = 0 แล้ว 'ไม่ได้รับข้อมูล MYRST จะถูกปิด
จำนวนบันทึก = -1
อื่น
MYRST.CLOSE 'หมายเหตุ: หากต้องการรับค่าพารามิเตอร์ คุณต้องปิดวัตถุชุดระเบียนก่อน
จำนวนบันทึก = MYCOMM(0)
จำนวนหน้า = MYCOMM(1)
ถ้า CINT(PAGENOW)>=CINT(PAGECOUNT) จากนั้น PAGENOW=PAGECOUNT
สิ้นสุด ถ้า
ตั้งค่า MYCOMM = ไม่มีอะไร
'แสดงบันทึกด้านล่าง
ถ้า RECORDCOUNT = 0 แล้ว
RESPONSE.WRITE ไม่มีบันทึก
ELSEIF บันทึก > 0 แล้ว
MYRST เปิด
ทำจนกว่าจะถึง MYRST.EOF
-
วนซ้ำ
'ต่อไปนี้จะแสดงข้อมูลการแบ่งหน้า
-
มิฉะนั้น 'บันทึกนับ=-1
ข้อผิดพลาดของพารามิเตอร์ RESPONSE.WRITE
สิ้นสุด ถ้า
สำหรับโค้ดข้างต้น มีเพียงจุดเดียวที่ต้องอธิบาย: เมื่อส่งคืนชุดระเบียนและพารามิเตอร์พร้อมกัน หากคุณต้องการรับพารามิเตอร์ คุณต้องปิดชุดระเบียนก่อน จากนั้นจึงเปิดขึ้นเมื่อใช้ ชุดระเบียน
7. กระบวนการจัดเก็บที่ส่งคืนชุดระเบียนหลายชุด
บทความนี้จะแนะนำกระบวนการจัดเก็บที่ส่งคืนชุดระเบียนก่อน บางครั้งกระบวนการที่เก็บไว้จำเป็นต้องส่งคืนชุดระเบียนหลายชุด ใน ASP จะรับชุดระเบียนเหล่านี้พร้อมกันได้อย่างไร เพื่อที่จะอธิบายปัญหานี้ ให้เพิ่มสองฟิลด์ลงในตาราง USERINFO: USERTEL และ USERMAIL และตั้งค่าให้เฉพาะผู้ใช้ที่เข้าสู่ระบบเท่านั้นที่สามารถดูเนื้อหาทั้งสองนี้ได้
/*SP7*/
สร้างขั้นตอน DBO.GETUSERINFO
@USERIDINT,
@เช็คอินบิต
เช่น
ตั้งหมายเลขเป็น
เริ่ม
หาก @USERID เป็นโมฆะหรือ @CHECKLOGIN เป็นโมฆะส่งคืน
เลือกชื่อผู้ใช้
จากดีบีโอ[USRINFO]
โดยที่ USERID=@USERID
--หากคุณเป็นผู้ใช้ที่เข้าสู่ระบบ ให้ใช้ USERTEL และ USERMAIL
ถ้า @CHECKLOGIN=1
เลือก USERTEL,USERMAIL
จาก DBO[USERINFO]
โดยที่ USERID=@USERID
กลับ
จบ
ไป
ต่อไปนี้เป็นรหัส ASP:
'** เรียกกระบวนการที่เก็บไว้ซึ่งส่งคืนชุดระเบียนหลายชุด **
DIM CHECKLG, USERID, ชื่อผู้ใช้, USERTEL, USERMAIL
ติ่ม มายคอมม์, MYRST
รหัสผู้ใช้=1
'CHECKLOGIN() เป็นฟังก์ชันที่กำหนดเองเพื่อตรวจสอบว่าผู้เยี่ยมชมเข้าสู่ระบบหรือไม่
CHECKLG = เช็คอิน()
SET MYCOMM = SERVER.CREATEOBJECT(ADODB.COMMAND)
ด้วย มายคอมม์
.ACTIVECONNECTION = MYCONSTR 'MYCONSTR คือสตริงการเชื่อมต่อฐานข้อมูล
.COMMANDTEXT = GETUSERINFO 'ระบุชื่อกระบวนการที่เก็บไว้
.COMMANDTYPE = 4 'บ่งชี้ว่านี่เป็นกระบวนการที่เก็บไว้
.PREPARED = TRUE 'ต้องคอมไพล์คำสั่ง SQL ก่อน
.PARAMETERS.APPEND .CREATEPARAMETER(@USERID,3,1,4,USERID)
.PARAMETERS.APPEND .CREATEPARAMETER(@CHECKLOGIN,11,1,1,CHECKLG)
ตั้งค่า MYRST = .ดำเนินการ
ลงท้ายด้วย
ตั้งค่า MYCOMM = ไม่มีอะไร
'รับค่าจากชุดระเบียนแรก
ชื่อผู้ใช้ = MYRST(0)
'รับค่าจากชุดระเบียนที่สอง
ถ้าไม่ใช่ MYRST ก็ไม่มีอะไรแล้ว
SET MYRST = MYRST.NEXTRECORDSET()
USERTEL = MYRST(0)
USERMAIL = MYRST(1)
สิ้นสุด ถ้า
ตั้งค่า MYRST = ไม่มีอะไร
ในโค้ดข้างต้น วิธี NEXTRECORDSET ของวัตถุ RECORDSET ถูกใช้เพื่อรับชุดระเบียนหลายชุดที่ส่งคืนโดยกระบวนการจัดเก็บข้อมูล
จนถึงตอนนี้ บทความนี้ได้ให้คำอธิบายที่ค่อนข้างครอบคลุมเกี่ยวกับสถานการณ์ต่างๆ ที่ ASP เรียกกระบวนการที่เก็บไว้ สุดท้ายนี้ เรามาพูดถึงวิธีการต่างๆ ในการเรียกกระบวนการต่างๆ ที่เก็บไว้ในโปรแกรม ASP
ในโปรแกรม ASP อย่างน้อยสามวิธีต่อไปนี้เป็นไปได้ที่จะเรียกกระบวนการที่เก็บไว้หลายกระบวนการ:
1. สร้างวัตถุ COMMAND หลายรายการ
ดิมมี่คอมม์
SET MYCOMM = SERVER.CREATEOBJECT(ADODB.COMMAND)
'เรียกกระบวนการที่เก็บไว้หนึ่ง
-
ตั้งค่า MYCOMM = ไม่มีอะไร
SET MYCOMM = SERVER.CREATOBJECT(ADODB.COMMAND)
'เรียกกระบวนการที่เก็บไว้ที่สอง
-
ตั้งค่า MYCOMM = ไม่มีอะไร
-
2. สร้างวัตถุ COMMAND เพียงอันเดียวและล้างพารามิเตอร์เมื่อวางสาย
ดิมมี่คอมม์
SET MYCOMM = SERVER.CREATOBJECT(ADODB.COMMAND)
'เรียกกระบวนการที่เก็บไว้หนึ่ง
-
'ล้างพารามิเตอร์ (สมมติว่ามีสามพารามิเตอร์)
MYCOMM.PARAMETERS.DELETE 2
MYCOMM.PARAMETERS.DELETE 1
MYCOMM.PARAMETERS.DELETE 0
'เรียกกระบวนการที่เก็บไว้สองและพารามิเตอร์ที่ชัดเจน
-
ตั้งค่า MYCOMM = ไม่มีอะไร
โปรดทราบว่าในเวลานี้: ลำดับการล้างพารามิเตอร์อยู่ตรงข้ามกับลำดับการประกาศพารามิเตอร์ ฉันไม่ทราบสาเหตุ
3. ใช้เมธอด REFRESH ของการรวบรวมข้อมูล PARAMETERS เพื่อรีเซ็ตอ็อบเจ็กต์ PARAMETER
ดิมมี่คอมม์
SET MYCOMM = SERVER.CREATEOBJECT(ADODB.COMMAND)
'เรียกกระบวนการที่เก็บไว้หนึ่ง
-
'รีเซ็ตออบเจ็กต์ PARAMETER ทั้งหมดที่มีอยู่ในการรวบรวมข้อมูล PARAMETERS
MYCOMM.PARAMETERS.รีเฟรช
'เรียกกระบวนการที่เก็บไว้ที่สอง
-
ตั้งค่า MYCOMM = ไม่มีอะไร
โดยทั่วไปเชื่อกันว่าการสร้างวัตถุซ้ำๆ เป็นวิธีที่มีประสิทธิภาพน้อยกว่า แต่หลังจากการทดสอบ (เครื่องมือทดสอบคือ MICROSOFT APPLICATION CENTER TEST) ผลลัพธ์ที่ไม่คาดคิด:
วิธีที่ 2 >= วิธีที่ 1 >> วิธีที่ 3
ความเร็วการทำงานของวิธีที่ 2 มากกว่าหรือเท่ากับวิธีที่ 1 (สูงกว่าประมาณ 4%) ความเร็วการทำงานของทั้งสองวิธีนี้เร็วกว่าวิธีที่ 3 มาก (มากถึง 130%) ดังนั้นจึงแนะนำให้ใช้ วิธีที่ 1 เมื่อมีพารามิเตอร์หลายตัว หากไม่มี ให้ใช้วิธีที่ 2
ฉันใช้เวลาหนึ่งวันในการเขียนประสบการณ์ผิวเผินบางส่วนของฉันในการเรียกกระบวนงานที่เก็บไว้ใน ASP ในที่สุด ในหมู่พวกเขาบางคนฉันรู้แค่ผลแต่ไม่รู้สาเหตุและบางคนอาจผิด แต่ทั้งหมดนี้เป็นผลมาจากการปฏิบัติส่วนตัวของฉัน โปรดยอมรับมันอย่างมีวิจารณญาณผู้อ่าน ท่านใดมีความเห็นแตกต่าง กรุณาแจ้งให้ทราบล่วงหน้าครับ.