เปิด SQL และ Native SQL ใน SAP ABAP

⚡ สรุปอย่างชาญฉลาด

เปิด SQL และ Native SQL ใน SAP ABAP อธิบายถึงสองวิธีที่โปรแกรม ABAP เข้าถึงฐานข้อมูล Open SQL ทำงานกับตารางพจนานุกรมในลักษณะที่ไม่ขึ้นกับฐานข้อมูล ในขณะที่ Native SQL ส่งผ่านคำสั่งเฉพาะของฐานข้อมูลไปยังแพลตฟอร์มโดยตรง

  • 🧭 ความแตกต่างหลัก: Open SQL ใช้สำหรับจัดการตารางที่ประกาศไว้ใน ABAP Dictionary ในขณะที่ Native SQL ใช้สำหรับจัดการตารางที่ Dictionary ไม่ได้จัดการไว้
  • 🧱 หลักการพกพา: OpenSQL มีไวยากรณ์ ความหมาย และข้อความแสดงข้อผิดพลาดที่เป็นมาตรฐานเดียวกัน ดังนั้นโปรแกรมจึงทำงานได้โดยไม่เปลี่ยนแปลงบนฐานข้อมูลทุกประเภทที่รองรับ SAP.
  • ⌨️ ชุดคำสั่ง: คำสั่ง SELECT, INSERT, UPDATE, MODIFY, DELETE และคำสั่งเคอร์เซอร์ ครอบคลุมการดำเนินการทั้งหมดของ Open SQL บนฐานข้อมูลกลาง
  • 🔢 บริการรถส่ง Codes: SY-SUBRC รายงานความสำเร็จด้วยค่า 0 และ SY-DBCNT รายงานจำนวนบรรทัดฐานข้อมูลที่ประมวลผลแล้ว
  • 🔌 อินเทอร์เฟซ SQL ดั้งเดิม: คำสั่งต่างๆ จะอยู่ระหว่าง EXEC SQL และ ENDEXEC โดยไม่มีจุดปิดท้าย และแลกเปลี่ยนข้อมูลผ่านตัวแปรโฮสต์ที่นำหน้าด้วยเครื่องหมายโคลอน
  • 🚀 วินัยในการปฏิบัติงาน: รักษาชุดผลลัพธ์ให้มีขนาดเล็ก จำกัดจำนวนฟิลด์ หลีกเลี่ยงการใช้ลูป SELECT ซ้อนกัน ใช้ฟิลด์ดัชนี และจัดเก็บระเบียนในตารางภายในแบบแฮช

เปิด SQL และ Native SQL ใน SAP ABAP

OpenSQL และ NativeSQL คืออะไร?

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

ในภาษาโปรแกรม ABAP/4 มีการใช้งาน SQL สองประเภท

  1. SQL ดั้งเดิม
  2. เปิด SQL

Open SQL ช่วยให้คุณเข้าถึงตารางฐานข้อมูลที่ประกาศในพจนานุกรม ABAP โดยไม่คำนึงถึงแพลตฟอร์มฐานข้อมูลที่ระบบ R/3 ใช้อยู่

Native SQL อนุญาตให้คุณใช้คำสั่ง SQL เฉพาะฐานข้อมูลในโปรแกรม ABAP/4 ซึ่งหมายความว่าคุณสามารถใช้ตารางฐานข้อมูลที่ไม่ได้บริหารจัดการโดยพจนานุกรม ABAP ได้ และดังนั้นจึงรวมข้อมูลที่ไม่ได้เป็นส่วนหนึ่งของระบบ R/3 ได้

Open SQL ประกอบด้วยชุดคำสั่ง ABAP ที่ดำเนินการกับฐานข้อมูลส่วนกลางในระบบ R/3 ผลลัพธ์ของการดำเนินการและข้อความแสดงข้อผิดพลาดใดๆ จะไม่ขึ้นอยู่กับระบบฐานข้อมูลที่ใช้งาน ดังนั้น Open SQL จึงให้รูปแบบและความหมายที่เหมือนกันสำหรับระบบฐานข้อมูลทั้งหมดที่รองรับโดย SAPโปรแกรม ABAP ที่ใช้เฉพาะคำสั่ง Open SQL เท่านั้นจะทำงานกับระบบ R/3 ได้ไม่ว่าจะใช้ระบบฐานข้อมูลใดก็ตาม คำสั่ง Open SQL ทำงานได้กับตารางฐานข้อมูลที่สร้างขึ้นในพจนานุกรม ABAP เท่านั้น

OpenSQL เป็นตัวเลือกเริ่มต้นในเกือบทุกโปรแกรม ดังนั้นชุดคำสั่งของ OpenSQL จึงถูกกล่าวถึงเป็นอันดับแรก

คำสั่ง Open SQL พื้นฐาน

  • SELECT
  • INSERT
  • อัพเดท
  • แก้ไข
  • ลบ
  • เปิดเคอร์เซอร์ ดึงข้อมูล ปิดเคอร์เซอร์

ตัวอย่าง

TABLES SBOOK.

DATA C TYPE CURSOR,

WA LIKE SBOOK.

OPEN CURSOR C FOR SELECT * FROM SBOOK WHERE CARRID = 'LH '

AND CONNID = '0400'

AND FLDATE = '19950228'

ORDER BY PRIMARY KEY.

DO.

FETCH NEXT CURSOR C INTO WA.

IF SY-SUBRC <> 0.

CLOSE CURSOR C.

EXIT.

ENDIF.

WRITE: / WA-BOOKID, WA-CUSTOMID, WA-CUSTTYPE,

WA-SMOKER, WA-LUGGWEIGHT, WA-WUNIT,

WA-INVOICE.

ENDDO.

กรอกรายชื่อผู้โดยสารสำหรับเที่ยวบินของ Lufthansa เที่ยวบิน 0400 วันที่ 28-02.1995:

คำสั่งเหล่านี้ทุกคำสั่งจะรายงานผลลัพธ์ผ่านฟิลด์ระบบสองฟิลด์ ซึ่งจะอธิบายต่อไปนี้

เปิด SQL Return Codes

คำสั่ง Open SQL ทั้งหมดจะกรอกฟิลด์ระบบทั้งสองต่อไปนี้ด้วยรหัสส่งกลับ

ฟิลด์ระบบ ความหมาย
SY-SURC หลังจากเปิดคำสั่ง SQL ทุกครั้ง ฟิลด์ระบบ SY-SUBRC จะมีค่า 0 หากการดำเนินการสำเร็จ และจะมีค่าอื่นที่ไม่ใช่ 0 ถ้าไม่สำเร็จ
SY-DBNT หลังจากคำสั่ง Open SQL ฟิลด์ระบบ SY-DBCNT จะมีจำนวนบรรทัดฐานข้อมูลที่ประมวลผล

💡 เคล็ดลับ: ควรตรวจสอบ SY-SUBRC ทันทีหลังจากคำสั่งนั้นเสร็จสิ้น คำสั่ง ABAP ในภายหลังจะเขียนทับค่าในฟิลด์นี้ ทำให้ผลลัพธ์เดิมหายไป

เมื่อตารางอยู่นอกเหนือขอบเขตของ ABAP Dictionary, Open SQL จะไม่สามารถเข้าถึงได้ และ Native SQL จะเข้ามาทำหน้าที่แทน

SQL ดั้งเดิม

ดังที่ได้กล่าวไปแล้ว Native SQL อนุญาตให้คุณใช้คำสั่ง SQL เฉพาะฐานข้อมูลในไฟล์ โปรแกรมเอแบค.

หากต้องการใช้คำสั่ง Native SQL คุณต้องนำหน้าด้วยคำสั่ง EXEC SQL และตามด้วยคำสั่ง ENDEXEC

วากยสัมพันธ์

EXEC SQL [PERFORMING <form>].

  <Native SQL statement>

ENDEXEC.

ไม่มีจุดหลังคำสั่ง Native SQL นอกจากนี้ การใช้เครื่องหมายจุลภาคกลับด้าน (“) หรือเครื่องหมายดอกจัน (*) ที่จุดเริ่มต้นของบรรทัดในคำสั่ง SQL ดั้งเดิมจะไม่ทำให้เกิดความคิดเห็นเหมือนกับที่ใช้ในไวยากรณ์ ABAP ปกติ คุณจำเป็นต้องทราบว่าชื่อตารางและฟิลด์เป็นแบบตรงตามตัวพิมพ์ใหญ่-เล็กที่คุณเลือกหรือไม่ ฐานข้อมูล.

ในคำสั่ง Native SQL ข้อมูลจะถูกส่งระหว่างตารางฐานข้อมูลและโปรแกรม ABAP โดยใช้ตัวแปรโฮสต์ สิ่งเหล่านี้ถูกประกาศในโปรแกรม ABAP และนำหน้าในคำสั่ง Native SQL ด้วยเครื่องหมายทวิภาค (:) คุณสามารถใช้โครงสร้างเบื้องต้นเป็นตัวแปรโฮสต์ได้ โครงสร้างในส่วนคำสั่ง INTO จะได้รับการปฏิบัติเสมือนว่าฟิลด์ทั้งหมดถูกแสดงรายการแยกกัน

เช่นเดียวกับใน Open SQL หลังจากคำสั่ง ENDEXEC SY-DBCNT มีจำนวนบรรทัดที่ประมวลผล ในเกือบทุกกรณี SY-SUBRC มีค่า 0 หลังคำสั่ง ENDEXEC

⚠️คำเตือน: SQL ดั้งเดิมจะข้ามขั้นตอนดังกล่าว SAP บัฟเฟอร์ตารางและการจัดการไคลเอ็นต์อัตโนมัติของ OpenSQL ฟิลด์ไคลเอ็นต์จะต้องระบุโดยโปรแกรม และคำสั่งจะทำงานได้เฉพาะบนแพลตฟอร์มฐานข้อมูลที่เขียนขึ้นมาเท่านั้น

OpenSQL กับ NativeSQL: ความแตกต่างที่สำคัญ

อินเทอร์เฟซทั้งสองเชื่อมต่อกับฐานข้อมูลเดียวกัน แต่มีความแตกต่างกันในด้านความสามารถในการพกพา การบัฟเฟอร์ และวัตถุที่สามารถเข้าถึงได้ ตารางด้านล่างสรุปความแตกต่างในทางปฏิบัติ

หลักเกณฑ์ เปิด SQL SQL ดั้งเดิม
ตารางที่กล่าวถึง เฉพาะตารางที่ประกาศไว้ใน ABAP Dictionary เท่านั้น ตารางใดๆ ในฐานข้อมูล รวมถึงตารางที่อยู่นอกพจนานุกรม
Portability ใช้งานได้กับฐานข้อมูลทุกประเภทที่รองรับโดย SAP ผูกติดอยู่กับไวยากรณ์ของแพลตฟอร์มฐานข้อมูลหนึ่งๆ
วากยสัมพันธ์ คำสั่ง ABAP ที่มีช่วงเวลาปิดบัญชี คำสั่งดั้งเดิมที่อยู่ภายใน EXEC SQL … ENDEXEC โดยไม่มีจุดปิดท้าย
การถ่ายโอนข้อมูล พื้นที่ทำงานและโต๊ะภายในผ่านทาง INTO ตัวแปรโฮสต์ที่นำหน้าด้วยเครื่องหมายโคลอน
การจัดการลูกค้าและการบัฟเฟอร์ การจัดการไคลเอ็นต์อัตโนมัติและการบัฟเฟอร์ตาราง ไม่มีการจัดการไคลเอ็นต์อัตโนมัติ และ SAP บัฟเฟอร์ถูกข้ามไป
การใช้งานทั่วไป การเข้าถึงข้อมูลแอปพลิเคชัน R/3 ในชีวิตประจำวัน การบูรณาการข้อมูลที่ไม่ได้เป็นส่วนหนึ่งของระบบ R/3

ดังนั้น OpenSQL จึงเป็นค่าเริ่มต้น และกฎด้านล่างนี้จะช่วยให้การทำงานรวดเร็ว

เปิด SQL – กฎประสิทธิภาพ

เพื่อปรับปรุงประสิทธิภาพของ SQL และโปรแกรม ABAP ควรดูแลกฎต่อไปนี้

เก็บชุดผลลัพธ์ให้เล็ก

  • การใช้คำสั่ง Where
  • หากต้องการเพียงระเบียนเดียวจากฐานข้อมูล ให้ใช้ SELECT SINGLE ทุกครั้งที่เป็นไปได้

ลดปริมาณการถ่ายโอนข้อมูลให้เหลือน้อยที่สุด

  • จำกัดจำนวนบรรทัด
  • หากตารางต้องการเพียงบางฟิลด์ ให้ใช้ SELECT INTO … คำสั่ง
  • จำกัดจำนวนคอลัมน์
  • ใช้ฟังก์ชันการรวม

ลดจำนวนการถ่ายโอนข้อมูลให้เหลือน้อยที่สุด

  • หลีกเลี่ยงลูปการเลือกที่ซ้อนกัน
  • อีกทางเลือกหนึ่งคือการใช้คำสั่ง SELECT .. FOR ALL ENTRIES คำสั่งนี้มักจะมีประสิทธิภาพมากกว่าการใช้คำสั่ง SELECT หรือ SELECT SINGLE จำนวนมากระหว่าง LOOP ของตารางภายใน
  • ใช้มุมมองพจนานุกรม
  • ใช้การรวมในส่วนคำสั่ง FROM
  • ใช้แบบสอบถามย่อยในส่วนคำสั่งwhere

ลดค่าใช้จ่ายในการค้นหาให้เหลือน้อยที่สุด

  • ใช้เขตข้อมูลดัชนีในส่วนคำสั่งที่
  • เมื่อเข้าถึงฐานข้อมูล ตรวจสอบให้แน่ใจเสมอว่ามีการใช้ดัชนีที่ถูกต้อง

ลดภาระฐานข้อมูล

  • Bufferไอเอ็นจี
  • ฐานข้อมูลเชิงตรรกะ
  • หลีกเลี่ยงการเข้าถึงฐานข้อมูลซ้ำ

การใช้ตารางภายในเพื่อ Buffer ประวัติ

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

คำถามที่พบบ่อย

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

ใช่แล้ว OpenSQL จะเพิ่มไคลเอ็นต์ปัจจุบันลงในเงื่อนไข WHERE ของตารางที่ขึ้นอยู่กับไคลเอ็นต์โดยอัตโนมัติ ในขณะที่ SQL ดั้งเดิมจะไม่ทำเช่นนั้น ดังนั้นโปรแกรมจึงต้องระบุ MANDT เองเพื่อหลีกเลี่ยงการอ่านข้อมูลจากไคลเอ็นต์ภายนอก

ลูปซ้อนกันจะส่งคำขอเรียกฐานข้อมูลหนึ่งครั้งต่อหนึ่งระเบียนของตารางภายนอก ซึ่งจะทำให้จำนวนรอบการรับส่งข้อมูลผ่านเครือข่ายเพิ่มขึ้น ในขณะที่การเชื่อมต่อตาราง (join), มุมมองพจนานุกรม (dictionary view) หรือคำสั่ง SELECT … FOR ALL ENTRIES จะดึงข้อมูลเดียวกันได้ในการเรียกเพียงครั้งเดียว

ใช่แล้ว ผู้ช่วย AI ในเครื่องมือพัฒนา ABAP ตรวจจับลูป SELECT ที่ซ้อนกัน เงื่อนไข WHERE ที่ขาดหายไป และคอลัมน์ที่ไม่ได้ใช้งาน จากนั้นจะเสนอคำสั่งที่เขียนใหม่ อย่างไรก็ตาม ข้อเสนอแนะดังกล่าวยังต้องได้รับการตรวจสอบในขณะรันไทม์ในธุรกรรม ST05 หรือ SAT อีกด้วย

เครื่องสแกน AI จะระบุบล็อก EXEC SQL ทุกบล็อก อธิบายไวยากรณ์เฉพาะแพลตฟอร์มที่อยู่ภายใน และร่างคำสั่ง Open SQL ที่เทียบเท่ากัน นักพัฒนาจะตรวจสอบว่าตารางพจนานุกรมมีอยู่จริงและทดสอบผลลัพธ์ก่อนส่งใช้งาน

สรุปโพสต์นี้ด้วย: