อะไรคือความแตกต่างระหว่าง“ ขั้นตอนการจัดเก็บ” และ“ ฟังก์ชั่นที่จัดเก็บ”?


36

ดังนั้นความคิดเห็นจากคำถามนี้กล่าวว่ามีความแตกต่างกันเล็กน้อยใน "วิธีการจัดเก็บ" และ "จัดเก็บ funtions" ใน PostgreSQL

ความคิดเห็นเชื่อมโยงไปยังบทความวิกิพีเดียแต่บางส่วนดูเหมือนจะไม่นำไปใช้ (เช่นสามารถนำไปใช้ในการSELECTแถลง)

ไวยากรณ์ตัวเองดูเหมือนจะสับสนนิด ๆ หน่อย ๆ :

CREATE FUNCTION emp_stamp() RETURNS trigger AS $emp_stamp$
    BEGIN
       [...]
    END;
$emp_stamp$ LANGUAGE plpgsql;

CREATE TRIGGER emp_stamp BEFORE INSERT OR UPDATE ON emp
    FOR EACH ROW EXECUTE PROCEDURE emp_stamp();

คุณสามารถสร้างแต่หมายถึงว่ามันเป็นFUNCTIONPROCEDURE

ดังนั้นความแตกต่างระหว่างสองสิ่งนี้คืออะไร?

คำตอบ:


43

อย่างเป็นทางการ PostgreSQL มี "ฟังก์ชัน" เท่านั้น ฟังก์ชั่นทริกเกอร์บางครั้งเรียกว่า "โพรซีเดอร์ทริกเกอร์" แต่การใช้งานนั้นไม่มีความหมายที่แตกต่างกัน pg_procภายในฟังก์ชั่นบางครั้งเรียกว่าวิธีการเช่นในแคตตาล็อกระบบ นั่นคือสิ่งที่หลงเหลือจาก PostQUEL ฟีเจอร์ใด ๆ ที่บางคน (อาจมีประสบการณ์ในระบบฐานข้อมูลที่แตกต่างกัน) อาจเชื่อมโยงกับโพรซีเดอร์เช่นความเกี่ยวข้องกับการป้องกัน SQL injections หรือการใช้พารามิเตอร์เอาต์พุตยังใช้กับฟังก์ชันตามที่มีอยู่ใน PostgreSQL

ตอนนี้เมื่อผู้คนในชุมชน PostgreSQL พูดถึง "โพรซีเดอร์ที่เก็บไว้" หรือ "โพรซีเดอร์ที่เก็บจริง" อย่างไรก็ตามพวกเขามักจะหมายถึงคุณสมบัติสมมุติฐานของวัตถุที่มีลักษณะคล้ายฟังก์ชั่นที่สามารถเริ่มและหยุดการทำธุรกรรมในร่างกายได้ ทำ. การใช้คำว่า "กระบวนงานที่เก็บไว้" ในบริบทนี้ดูเหมือนจะคล้ายคลึงกับผลิตภัณฑ์ฐานข้อมูลอื่น ๆ ดูกระทู้รายชื่อผู้รับจดหมายนี้สำหรับแนวคิดที่คลุมเครือ

อย่างไรก็ตามในทางปฏิบัติความแตกต่างของฟังก์ชั่นนี้เมื่อเทียบกับขั้นตอนในแง่ของความสามารถในการควบคุมการทำธุรกรรมของพวกเขาไม่ได้รับการยอมรับในระดับสากลและแน่นอนว่าโปรแกรมเมอร์จำนวนมากที่ไม่มีฐานข้อมูลอคติ (มาตรฐาน SQL ปรากฏว่ามีจุดกึ่งกลางในขั้นตอนโดยค่าเริ่มต้นมีพฤติกรรมการทำธุรกรรมที่แตกต่างจากฟังก์ชั่น แต่สามารถปรับได้ต่อวัตถุ) ในกรณีใด ๆ และโดยเฉพาะอย่างยิ่งเมื่อดูคำถามในการแลกเปลี่ยนกองกับ ผู้ชมที่หลากหลายคุณควรหลีกเลี่ยงการสมมติมากเกินไปและใช้คำศัพท์ที่ชัดเจนขึ้นหรือกำหนดคุณสมบัติที่คุณคาดหวัง


14

ในแง่ของ DDL, Postgres ไม่มีวัตถุขั้นตอนเพียงฟังก์ชั่น ฟังก์ชัน Postgres สามารถส่งคืนค่าหรือเป็นโมฆะเพื่อให้รับหน้าที่ของทั้งฟังก์ชันและโพรซีเดอร์ใน RDBMS อื่น คำว่า 'ขั้นตอน' ในการcreate triggerอ้างอิงถึงฟังก์ชั่น

ในแง่ของเอกสาร Postgres 'โพรซีเดอร์' ยังเป็นคำพ้องสำหรับวัตถุฐานข้อมูลที่เรียกว่าฟังก์ชันเช่น: " โพรซีเดอร์ทริกเกอร์ถูกสร้างขึ้นด้วยคำสั่ง CREATE FUNCTION "

ทริกเกอร์ 'วิธีการ' จะมีกฎระเบียบโดยเฉพาะอย่างยิ่งที่พวกเขาจะต้องได้รับการประกาศให้เป็นฟังก์ชั่นที่มีการขัดแย้งและไม่มีประเภทการกลับมาของทริกเกอร์ ตัวอย่างที่นี่


8

คำว่า "กระบวนงานที่เก็บไว้" และ "ฟังก์ชันที่เก็บไว้" นั้นใช้แทนกันได้ใน PostgreSQL และโดยทั่วไปจะหมายถึงสิ่งเดียวกัน ฐานข้อมูลอื่นอาจแยกความแตกต่างระหว่างโพรซีเดอร์และฟังก์ชัน (คล้ายกับวิธีที่ VB สร้างความแตกต่างระหว่างรูทีนย่อยและฟังก์ชัน)

ตราบใดที่ฟังก์ชันใน PostgreSQL ส่งคืนบางสิ่งที่คล้ายกับตารางคุณสามารถใช้ผลลัพธ์ของฟังก์ชันนั้นราวกับว่าเป็นตารางมาตรฐาน CREATE TRIGGERไวยากรณ์เป็นบิตสับสน แต่ผมสงสัยว่ามันอาจจะเป็นในสถานที่ก่อนมาตรฐาน ANSI สรุป ฉันมีสำเนาของ SQL: 2003 เท่านั้นดังนั้นฉันไม่สามารถทำอะไรได้มากกว่าคาดเดาว่าทำไมระบบการตั้งชื่อแปลก ๆ

TL; DR เวอร์ชั่น: ด้วย PostgreSQL "ขั้นตอน" เทียบเท่ากับ "ฟังก์ชั่น"


6

ใน MSSQL กระบวนงานที่เก็บไว้เป็นชุดคำสั่ง sql ที่รวบรวมไว้ล่วงหน้า
ขั้นตอนการจัดเก็บ:

 - สามารถมีพารามิเตอร์อินพุตและเอาต์พุตจำนวนมาก
 - สามารถใช้เพื่อแก้ไขตาราง / โครงสร้าง / ข้อมูลฐานข้อมูล
 - โดยปกติจะไม่ใช้ภายในคำสั่ง insert / update / delete / select
ฟังก์ชั่นที่ผู้ใช้กำหนดมีหลายรสชาติ ฟังก์ชั่น:
  - สามารถมีพารามิเตอร์อินพุตหลายค่า แต่คืนค่าเดียวเท่านั้น (เช่นการต่อสตริง)
  - สามารถยอมรับชุดเป็นอินพุตคืนค่าเดียว (เช่น dbo.FindLargestPig (ListOfPigs))
  - ส่งคืนตาราง (เช่น select * from dbo.ExplodeString ("นี่คือรายการคำศัพท์")
  - สามารถใช้ในคำสั่ง select / insert / update / delete
  - ไม่สามารถใช้เพื่อแก้ไขตาราง / โครงสร้าง / ข้อมูล


5

คำตอบสั้น ๆ ก็คือฟังก์ชั่นส่งกลับค่า แต่ขั้นตอนไม่ได้

ความแตกต่างนั้นมีอยู่ใน Persistent Stored Modules (SQL / PSM) ซึ่งถูกเสนอสำหรับ SQL 1992 ฉันไม่ทราบว่า SQL / PSM เคยทำให้เป็นมาตรฐานหรือไม่


ภายในปี 2546 ฉันเชื่อว่า
xenoterracide

นั่นฟังดูอย่างน่าทึ่งเช่นไวยากรณ์สำหรับ VB ฟังก์ชั่นส่งกลับค่าและขั้นตอนไม่ได้ (ดังนั้นหากคุณมีค่าส่งคืนในฟังก์ชั่นมันจะระเบิดขึ้นในคอมไพเลอร์)
jcolebrand

@ jcolebrand จริงๆแล้วชื่อมีความชัดเจนมากขึ้นใน Pascal ขั้นตอนไม่ได้กลับส่งผลให้ในขณะที่ฟังก์ชั่นไม่ สำหรับเหตุผลทางประวัติศาสตร์ VBA ใช้ภาษา FORTRAN ซึ่งสาย (เรียกว่า?) พวกเขาsubroutineและฟังก์ชั่น ภาษา C-type ที่ทันสมัยมีเพียงฟังก์ชั่น แต่ภาษาที่พิมพ์มีตัวเลือกของฟังก์ชั่นโมฆะซึ่งเป็นขั้นตอนโดยใช้ชื่ออื่น แนวโน้มความนิยมคือการใช้ฟังก์ชั่นปกติสำหรับทุกสิ่งและคืนสิ่งที่สามารถละเว้นได้หากคุณต้องการ
Manngo

2

เมื่อเปรียบเทียบคำตอบที่ยอมรับจากระดับแนวคิดเชิงนามธรรมฉันเข้าใจถึงความแตกต่างจากฟังก์ชันการทำงานและมุมมองอินพุต / เอาต์พุต ด้านล่างฉันใช้ sp และ f เพื่อแทนโพรซีเดอร์และฟังก์ชันที่เก็บไว้ตามลำดับ

  1. ใช้ในการแสดงออก: sp ไม่สามารถใช้ในการแสดงออกในขณะที่ฟังก์ชั่นสามารถซึ่งหมายความว่าคุณสามารถใช้ค่าที่ส่งคืนจาก af ภายในงบอื่น ๆ เช่น

    select * 
    from table 
    where col_a < (select col_A from f())
  2. กลับค่า: SP ไม่ได้โดยอัตโนมัติกลับค่าเว้นแต่คุณจะระบุrefcursorชนิดกลับเปิดและกลับเคอร์เซอร์; f ส่งคืนผลลัพธ์ในคำสั่งสุดท้ายที่ประโยค 'return' ถูกฝังเช่นเดียวกับส่วนคำสั่งที่เลือก

  3. ส่งคืนชุดผลลัพธ์เดี่ยว / หลายชุด: ที่นี่ชุดผลลัพธ์อ้างถึงรายการผลลัพธ์ที่อาจแตกต่างกันในรูปแบบเช่นชุดจำนวนเต็มเดี่ยวอาร์เรย์ข้อความและสองตาราง sp สามารถคืนค่าได้หลายชุดตราบใดที่คุณระบุประเภทการคืนค่า refcursor เปิดและส่งคืนเคอร์เซอร์ อย่างไรก็ตาม f สามารถส่งคืนชุดหนึ่งประเภทเท่านั้น

โดยปกติแล้วกระบวนงานที่เก็บไว้จะใช้ในการปรับเปลี่ยนข้อมูลฐานข้อมูลหรือโครงสร้างที่ไม่ต้องการคืนค่าเช่นลบอัปเดตวางฯลฯ หรือสถานการณ์ที่จำเป็นต้องมีชุดผลลัพธ์หลายชุด ในทางกลับกันฟังก์ชั่นส่วนใหญ่จะถูกเลือกสำหรับการสืบค้นธรรมดา

สำหรับรายละเอียดเพิ่มเติมเกี่ยวกับคำอธิบายของฉันโปรดดูที่ลิงค์นี้: ขั้นตอนและฟังก์ชันที่เก็บไว้ใน PostgreSQL

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.