วิธีแยกความแตกต่างระหว่าง SQL และ PL / SQL


16

ฉันรู้ว่าคำถามอาจฟังดูโง่เกินไป แต่ฉันไม่เคยเข้าใจส่วนนี้

SQL * Plus ทำงานได้กับทั้ง SQL และ PL / SQL ฉันจะรู้ได้อย่างไรว่าบางรหัสเป็น SQL หรือ PL / SQL หากรหัสของฉันมี for for loop จะไม่ใช้ SQL อีกต่อไปหรือไม่

PL / SQL เป็นส่วนเสริมสำหรับ SQL ที่จะมีลูปเงื่อนไข ฯลฯ จากนั้นรหัส SQL ใด ๆ คือรหัส PL / SQL เริ่มต้น? ไม่เป็นอย่างนั้นเหรอ?

มีการแบ่งเขตระหว่าง SQL และ PL / SQL หรือไม่

ตัวอย่างที่สองของการแบ่งแยก b / w SQL และ PL / SQL ที่ทำให้เกิดคำถามนี้:

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

/programming/2267386/oracle-11g-varray-of-objects/2267813#2267813

คำตอบ:


12

เป็นคำถามที่น่าสนใจเพื่อให้แน่ใจ คนส่วนใหญ่ที่คุ้นเคยกับการพัฒนา Oracle จะไม่ให้ความคิด แต่เมื่อคุณลงมาบางครั้งก็สับสนในการกำหนดเขตแดนระหว่าง SQL และ PL / SQL

เมื่อดูที่คำจำกัดความของคำย่อคุณจะเริ่มเข้าใจถึงขอบเขตการทำงานของแต่ละหน้าที่:

SQL - ภาษาของแบบสอบถามที่มีโครงสร้าง

PL / SQL - ภาษาขั้นตอน / ภาษาที่มีโครงสร้าง

ผู้อ่านช่างสังเกตอาจสังเกตเห็นว่า SQL แสดงขึ้นสองครั้ง 8) นั่นเป็นเพราะ SQL มักฝังอยู่ภายใน PL / SQL - PL / SQL เป็นภาษาที่สร้างขึ้นเพื่อให้เป็นภาษารุ่นที่ 4 (4GL)ที่เล่นได้ดีกับวัตถุฐานข้อมูลใน คำพยากรณ์

Wikipedia มีเนื้อหาที่ค่อนข้างดีทั้งในSQLและPL / SQL

ส่วนที่สับสนคือ PL / SQL และ SQL ทับซ้อนกันเล็กน้อย ขอบเขตของ SQL รวมถึงการแทรกข้อมูลแบบสอบถามอัปเดตและลบการดำเนินงานภาษาที่เรียกว่า DML หรือการจัดการข้อมูล แต่ยังรวมถึงการสร้างแก้ไขเปลี่ยนชื่อเปลี่ยนชื่อซึ่งเป็นการดำเนินงานภาษา DDL หรือการกำหนดข้อมูล มันอยู่ที่นี่ที่บางคนอาจสับสน การดำเนินการเพื่อสร้างกระบวนงานที่เก็บไว้สิ่งที่เขียนโดยใช้ PL / SQL เป็น SQL จริง - คุณใช้ SQL เพื่อสร้างวัตถุฐานข้อมูลที่แสดงถึงบล็อกของ PL / SQL

คุณสามารถฝังรหัส SQL ไว้ใน PL / SQL ได้เช่นกัน FOR FOR ใน PL / SQL สามารถเป็นไปตามแบบสอบถาม SQL ตัวอย่างเช่น ระเบิดความคิดของคุณเล็กน้อยใช่มั้ย คุณสร้างขั้นตอนโดยใช้ SQL ที่จริงใช้ SQL เพื่อดำเนินการบางอย่างกับระเบียนจากฐานข้อมูล

สิ่งดีๆถ้าคุณถามฉัน


2
อันที่จริงเส้นนั้นเบลอ คุณสามารถเขียนคำสั่ง SQL เพื่อสร้างโพรซีเดอร์ PL / SQL ที่มีคำสั่ง SQL ที่เรียกใช้ฟังก์ชัน PL / SQL ที่มีคำสั่ง SQL อยู่ในนั้นเป็นต้น
Leigh Riffel

1
@ ลงหลุมกระต่ายที่เราไปกันเลย!
ScottCher

ฉันจะไม่พูดว่าสายเบลอเลย PL / SQL เป็น wrapper ตามขั้นตอนสำหรับ SQL PL / SQL ส่วนใหญ่มีคำสั่ง SQL แม้ว่าจะไม่จำเป็นต้อง คุณสามารถติดตามเคอร์เซอร์ SQL เกิดขึ้นจริงในv$sqlฯลฯ
วิลเลียมโรเบิร์ต

12

ถ้ามันถูกห่อหุ้ม

  • BEGIN ... END
  • DECLARE ... END
  • CREATE OR REPLACE ... END
  • เป็นคำนำหน้าแบบหนึ่งซับ EXECUTE

จากนั้นเป็น PL / SQL สิ่งนี้หมายความว่าภายใต้ประทุน? SQL ได้รับการ "รวบรวม" ไปยังแผนแบบสอบถามและดำเนินการทันทีส่งคืนชุดผลลัพธ์ในเหตุการณ์SELECTหรือจำนวนแถวที่ได้รับผลกระทบในกรณีอื่น ๆ หรือข้อผิดพลาด PL / SQL อย่างไรก็ตามมีส่วนร่วมมากขึ้น วัตถุทุกชิ้นที่อ้างถึงในนั้นจะถูกตรวจสอบว่ามีอยู่จริงและได้รับเงินช่วยเหลือที่จำเป็นจากนั้น PL / SQL จะถูกคอมไพล์ลงไปใกล้กับโค้ดเนทีฟซึ่งประมวลผลด้วยความเร็วเต็ม การอ้างอิงถูกติดตามและหากตารางเปลี่ยนแปลงดังนั้นการอ้างอิง PL / SQL ใด ๆ จำเป็นต้องมีการคอมไพล์ใหม่ เหตุผลของเรื่องนี้คือความเร็ว เนื่องจากทุกอย่างจะทำขึ้นด้านหน้าที่รวบรวมเวลาไม่มีความจำเป็นที่จะต้องมีการตรวจสอบใด ๆ ในรันไทม์ PL / SQL ในขณะที่คำสั่งจะต้องตรวจสอบทุกครั้ง (แม้สรรพสินค้าใหญ่' แบบสอบถามแผนจะถูกเก็บไว้ที่เรียกว่าแยกนุ่มยังคงต้องตรวจสอบสิทธิ์และยังแยกนุ่มนวลมีค่าใช้จ่ายที่เกี่ยวข้อง)

นี่เป็นหนึ่งใน "ข้อดีนักฆ่า" ของขั้นตอนการจัดเก็บตามที่ Oracle ทำ จริง ๆ แล้วการรัน PL / SQL ที่เก็บ proc หรือทริกเกอร์จะทำการคำนวณจำนวนต่ำสุดที่แน่นอนเพื่อให้ได้ผลลัพธ์ รหัสแอปพลิเคชันที่ทำงานนอกเคอร์เนล Oracle ซึ่งไม่น่าเชื่อถือต้องข้ามการวนซ้ำเพิ่มเติมเพื่อรับข้อมูล มันเป็นอาร์กิวเมนต์เดียวกันสำหรับภาษาที่มีการพิมพ์สูงและมีความโปร่งใสอ้างอิงสูงเช่น OCaml หรือ Haskell - ทำงานได้มากขึ้นครั้งเดียวในเวลารวบรวมและเก็บเกี่ยวผลประโยชน์เป็นล้าน ๆ ครั้งของรหัสที่ถูกประมวลผล


2
เพื่อเพิ่มการผสม CALL เป็นคำสั่ง SQL ที่ใช้ในการเรียกใช้หน่วยโปรแกรมที่จัดเก็บและเขียนใหม่ภายใต้ประทุนเป็น BEGIN ... END
Gary

2
EXECUTE เช่นเดียวกับมันคือ syntactic sugar
Gaius

5

มีการแบ่งเขตระหว่าง SQL และ PL / SQL หรือไม่

SQL คือมาตรฐาน *

PL / SQL เป็นส่วนเสริมของผู้ขายตามมาตรฐาน SQL *

* SQL เป็นภาษาที่มีไวยากรณ์อย่างชัดเจนและกฎระเบียบสำหรับวิธีไวยากรณ์ที่ควรจะดำเนินการและมี แต่ไม่ได้ มาตรฐาน ต่อ-SE อย่างไรก็ตามเนื่องจากมีข้อกำหนดภาษาที่ทุกคนสามารถตกลงกันได้ดังนั้นสิ่งใดก็ตามที่เขียนใน SQL จะสามารถพกพาได้หากโปรแกรมนั้นเขียนด้วย SQL เท่านั้น

แต่เนื่องจาก PL / SQL เป็นส่วนขยายผู้ขายจึงมีส่วนภาษาที่ผู้ขายรายอื่นอาจไม่สนับสนุน


3
ฉันจะบอกว่า PL / SQL เป็นมาตรฐาน de facto ขณะ SQL เป็นทางนิตินัยมาตรฐาน :-)
ออกุสตุ

3
@Gaius และจากคำสั่งเพียงอย่างเดียวฉันจะเดาสองสิ่ง: คุณเป็น ORA dev และคุณคิดว่า TSQL ยุ่งเหยิง: p
jcolebrand

@ jcolebrand งาน DBA แรกของฉันคือ Sybase แต่คุณพูดถูกฉันทำงานกับ Oracle เป็นส่วนใหญ่ในปัจจุบัน ฉันยินดีเป็นอย่างยิ่งถ้าคุณสามารถเขียน T-SQL หรือ PL / SQL บนฐานข้อมูลใดก็ได้ แต่ภาษานั้นแสดงถึงแพลตฟอร์มของพวกเขา (เช่น T-SQL เป็นวิธีที่เป็นเพราะเคอร์เซอร์และล็อคมีราคาแพงใน SQL Server และลูกหลานของมัน และ PL / SQL เป็นวิธีที่เป็นเพราะใครบางคนที่ Oracle ทำงานล่าสุดที่ DoD) :-)
Gaius

@Gaius อาใช่ข้อโต้แย้งเก่า ๆ เกี่ยวกับมาตรฐานนั้นดีเพราะมีให้เลือกมากมาย ฉันคิดว่ามันดีที่จะระบุว่า SQL เป็น "มาตรฐาน" และ PL / SQL นั้นเป็นกรรมสิทธิ์ดังนั้น +1 @ jcolebrand
ScottCher

@ScottCher ~ ขอบคุณสำหรับสิ่งนั้น ฉันรู้สึกโง่ที่พูดว่าเป็นมาตรฐานเพราะไม่มีร่างมาตรฐาน (Afaik) ที่ประทับตรามันด้วยตรารับรองและให้ตัวเลข แต่มันถูกกำหนดไว้อย่างดีและตกลงกัน ;)
jcolebrand
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.