SAP บทช่วยสอนการเขียนสคริปต์ SQL ใน HANA: ไวยากรณ์และตัวอย่าง

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

สคริปต์ SQL ใน SAP HANA ขยายขีดความสามารถของ SQL มาตรฐานด้วยโครงสร้างเชิงฟังก์ชันและเชิงกระบวนการ ช่วยให้สามารถใช้งาน stored procedures และ user defined functions โดยย้ายตรรกะที่เกี่ยวข้องกับข้อมูลจำนวนมากจากเซิร์ฟเวอร์แอปพลิเคชันไปยังฐานข้อมูล

  • 🧩 คำจำกัดความหลัก: ชุดส่วนขยายของ SQL ที่ใช้ภายใน stored procedure แทนคำสั่ง SQL ทั่วไป
  • 📦 ตู้คอนเทนเนอร์สองตู้: ขั้นตอนต่างๆ อธิบายลำดับของการแปลง ในขณะที่ฟังก์ชันที่ผู้ใช้กำหนดเองนั้นมีทั้งแบบค่าคงที่และแบบตาราง
  • 🧠 ตรรกะเชิงประกาศ: กำหนดประเภทตารางโดยไม่ต้องอ้างอิงตารางในฐานข้อมูล และออกคำสั่ง SELECT ทั่วไป
  • 🎼 ตรรกะการประสานงาน: ใช้คำสั่ง DDL, DML และคำสั่งสอบถามข้อมูล รวมถึงลูปและเงื่อนไขในการจัดการการไหลของข้อมูล
  • 🔀 ตรรกศาสตร์เชิงคำสั่ง: คำสั่ง IF, ELSEIF, ELSE, CASE, FOR loops และการจัดการข้อยกเว้น ช่วยแบ่งตรรกะออกเป็นส่วนๆ ตามการไหลของข้อมูล
  • 📤 หลายเอาต์พุต: ขั้นตอนการทำงานของสคริปต์ SQL จะส่งคืนผลลัพธ์หลายรายการผ่านพารามิเตอร์ OUTPUT ซึ่งแตกต่างจากขั้นตอนการทำงานของ SQL ทั่วไป
  • การดำเนินการแบบขนาน: คำสั่งอิสระจะถูกประมวลผลแบบขนานโดยกลไกการคำนวณ

สคริปต์ SQL ใน SAP HANA

สคริปต์ SQL คืออะไร?

SQL Script คือชุดของส่วนขยายของ SQL สามารถใช้ในขั้นตอนการจัดเก็บแทน SQL ธรรมดาได้ จะกำหนดส่วนขยายการทำงานและขั้นตอน

In SQL ผู้ใช้สคริปต์สามารถกำหนดตัวแปรท้องถิ่นสำหรับโครงสร้างและตารางที่ใช้หลักๆ ในการสร้างกระบวนการจัดเก็บ

นอกจากนี้ยังสามารถใช้สคริปต์ SQL ในมุมมองการคำนวณได้อีกด้วย ใน SQL Script มีคอนเทนเนอร์ลอจิกสองแบบที่แตกต่างกัน

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

องค์ประกอบภาษาสคริปต์ SQL มีดังนี้ -

ลอจิกสคริปต์ SQL ที่ประกาศ (ส่วนขยายการทำงาน)

  • อนุญาตให้กำหนดประเภทตารางโดยไม่ต้องอ้างอิงตารางฐานข้อมูล
  • คำสั่งทั่วไปเช่น SELECT
  • ฟังก์ชั่นเครื่องคำนวณ (CE)

⚠️ หมายเหตุเกี่ยวกับเวอร์ชัน: ตัวดำเนินการแผนการคำนวณของเอนจิน ฟังก์ชัน CE_ เช่น CE_COLUMN_TABLE และ CE_JOIN ถูกยกเลิกการใช้งานแล้ว SAPการพัฒนาใหม่ควรใช้คำสั่ง SQL มาตรฐาน ซึ่งตัวปรับแต่งประสิทธิภาพสามารถจัดการได้ดีไม่แพ้กัน โค้ด CE ที่มีอยู่ยังคงทำงานได้ แต่ควรย้ายไปใช้โค้ดใหม่เมื่อมีการเปลี่ยนแปลงขั้นตอนการทำงานครั้งต่อไป

ตรรกะสคริปต์ Orchestration SQL (ส่วนขยายการทำงาน)

ตรรกะการจัดเรียบเรียงใช้เพื่อนำโฟลว์ข้อมูลไปใช้โดยใช้คำสั่ง DDL, DML และ SQL Query และควบคุมตรรกะของโฟลว์โดยใช้โครงสร้างภาษาที่จำเป็น เช่น ลูปและเงื่อนไข

  • คำชี้แจงภาษาคำจำกัดความของข้อมูล เช่น สร้างสคีมา
  • ภาษาการจัดการข้อมูล (เช่นการแทรก)

ลอจิกสคริปต์ SQL ที่จำเป็น (ส่วนขยายขั้นตอน)

ตรรกะที่จำเป็นจะแยกตรรกะระหว่างกระแสข้อมูลต่างๆ เช่น IF, ELSEIF, ELSE, CASE, FOR (Loop) และข้อยกเว้น

ความสำคัญของสคริปต์ SQL

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

ประเด็นสำคัญของสคริปต์ SQL

  • สคริปต์ SQL จะถูกดำเนินการและประมวลผลในกลไกการคำนวณภายในฐานข้อมูล HANA
  • สคริปต์ SQL สามารถทำการคำนวณที่ซับซ้อนได้
  • ใน SQL Script สามารถประกาศตัวแปรโลคัลเพื่อเก็บผลลัพธ์ชั่วคราวได้
  • ขั้นตอนสคริปต์ SQL สามารถส่งคืนผลลัพธ์ได้มากขึ้นโดยใช้ "พารามิเตอร์เอาต์พุต" ในขณะที่ขั้นตอน SQL ปกติสามารถส่งคืนได้เพียงรายการเดียว
  • ใน SQL Script คุณสามารถกำหนดประเภทตารางส่วนกลางหรือตารางท้องถิ่นซึ่งสามารถใช้เป็นพารามิเตอร์ได้

ด้วยการใช้สคริปต์ SQL คุณสามารถบรรลุโหมดการประมวลผลแบบขนานได้

ตัวอย่างขั้นตอนสคริปต์ SQL

โพรซีเดอร์เป็นรูปแบบการประมวลผลที่พบได้บ่อยที่สุด ตัวอย่างด้านล่างนี้จะอ่านข้อมูลพนักงาน กรองข้อมูล และส่งคืนผลลัพธ์ผ่านพารามิเตอร์ตารางเอาต์พุต

CREATE PROCEDURE DHK_SCHEMA.GET_HIGH_EARNERS (
  IN  im_min_salary DECIMAL(15,2),
  OUT ex_employees  TABLE (EMP_NAME NVARCHAR(100), SALARY DECIMAL(15,2)),
  OUT ex_row_count  INTEGER
)
LANGUAGE SQLSCRIPT
READS SQL DATA
AS
BEGIN
  -- Declarative logic: a table variable, not a physical table
  lt_all = SELECT EMP_NAME, SALARY
             FROM DHK_SCHEMA.EMPLOYEE
            WHERE SALARY >= :im_min_salary;

  -- Imperative logic: branch on the result
  SELECT COUNT(*) INTO ex_row_count FROM :lt_all;

  IF :ex_row_count = 0 THEN
    ex_employees = SELECT '' AS EMP_NAME, 0 AS SALARY FROM DUMMY WHERE 1 = 0;
  ELSE
    ex_employees = SELECT * FROM :lt_all ORDER BY SALARY DESC;
  END IF;
END;

มีข้อกำหนดสำคัญสามประการที่ควรทราบ ประการแรก การอ่านค่าตัวแปรทุกครั้งจะต้องใช้เครื่องหมายโคลอนนำหน้า ดังนั้น :lt_all อ่านตัวแปรตารางในขณะที่ lt_all คำสั่ง `on the left` จะกำหนดค่าให้กับมัน คำสั่ง `READS SQL DATA` จะบอกตัวปรับแต่งประสิทธิภาพว่ากระบวนการนี้ไม่มีผลข้างเคียง ซึ่งช่วยให้สามารถใช้การประมวลผลแบบขนานได้อย่างมีประสิทธิภาพมากขึ้น และกระบวนการที่ส่งคืนพารามิเตอร์เอาต์พุตหลายตัวนั้นเป็นความสามารถที่ SQL แบบธรรมดาไม่มี

การเรียกชื่อนั้นง่ายมาก:

CALL DHK_SCHEMA.GET_HIGH_EARNERS (50000, ?, ?);

ฟังก์ชันที่ผู้ใช้กำหนดเองแบบสเกลาร์และแบบตาราง

ในขณะที่ขั้นตอนการทำงานจะทำการกระทำบางอย่าง ฟังก์ชันจะส่งคืนค่าและสามารถนำไปใช้ภายในคำสั่ง SQL ได้ สคริปต์ SQL มีสองรูปแบบและไม่สามารถใช้แทนกันได้

พารามิเตอร์ ฟังก์ชัน UDF แบบสเกลาร์ ตาราง UDF
คืนสินค้า ค่าเดียว ชุดผลลัพธ์
ใช้แล้ว รายการ SELECT, เงื่อนไข WHERE, นิพจน์ ประโยค FROM เปรียบเสมือนตาราง
สามารถแก้ไขข้อมูลได้ ไม่ ไม่
การใช้งานทั่วไป การคำนวณที่สามารถนำกลับมาใช้ใหม่ได้ เช่น อัตราภาษี มุมมองแบบกำหนดพารามิเตอร์ที่ส่งคืนแถวที่กรองแล้ว
-- Scalar function: returns one value
CREATE FUNCTION DHK_SCHEMA.ADD_BONUS (im_salary DECIMAL(15,2))
  RETURNS total DECIMAL(15,2)
  LANGUAGE SQLSCRIPT AS
BEGIN
  total := :im_salary * 1.10;
END;

SELECT EMP_NAME, DHK_SCHEMA.ADD_BONUS(SALARY) AS WITH_BONUS
  FROM DHK_SCHEMA.EMPLOYEE;

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

แนวปฏิบัติที่ดีที่สุดสำหรับการเขียนสคริปต์ SQL

สคริปต์ SQL ทำงานได้ดีเมื่อเขียนให้ระบบประมวลผลแบบขนาน และทำงานได้ไม่ดีเมื่อเขียนเหมือนโค้ดแอปพลิเคชัน หกข้อควรปฏิบัตินี้สร้างความแตกต่าง

  1. ควรเลือกใช้รูปแบบการประกาศมากกว่ารูปแบบคำสั่ง คำสั่งที่ใช้เซตเพียงชุดเดียวมีประสิทธิภาพเหนือกว่าลูปที่ประมวลผลทีละแถวในหลายกรณี โดยมีประสิทธิภาพมากกว่าหลายเท่า ควรใช้ลูป FOR เฉพาะเมื่อตรรกะไม่สามารถแสดงออกมาในรูปของการดำเนินการเซตได้จริงๆ เท่านั้น
  2. หลีกเลี่ยงการใช้เคอร์เซอร์ พวกมันบังคับให้ประมวลผลทีละแถวและทำให้กลไกการคำนวณใช้งานไม่ได้เลย แทบทุกเคอร์เซอร์สามารถเขียนใหม่เป็นคำสั่ง join หรือ aggregation ได้
  3. ควรแยกคำกล่าวออกจากกันอย่างชัดเจน ตัวแปรตารางสองตัวที่ไม่อ้างอิงถึงกันจะถูกคำนวณแบบขนาน การเชื่อมโยงแต่ละขั้นตอนผ่านขั้นตอนก่อนหน้าจะทำให้กระบวนการทั้งหมดทำงานแบบอนุกรม
  4. Declare READS SQL DATA where true. นั่นแสดงว่ากระบวนการนี้ไม่มีผลข้างเคียง ซึ่งช่วยให้สามารถปรับปรุงกระบวนการให้เหมาะสมยิ่งขึ้นได้
  5. ควรทำการกรองตั้งแต่เนิ่นๆ การลดจำนวนแถวในตัวแปรตารางแรกจะช่วยลดขนาดของทุกอย่างในขั้นตอนถัดไป ในขณะที่การกรองข้อมูลในตอนท้ายได้ช่วยลดต้นทุนไปแล้ว
  6. เลิกใช้ฟังก์ชัน CE_ แล้ว คำสั่งเหล่านั้นล้าสมัยแล้ว ไม่สามารถใช้ร่วมกับ SQL ในคำสั่งเดียวได้อย่างอิสระ และตัวเพิ่มประสิทธิภาพของ SQL ในปัจจุบันสามารถจัดการงานเดียวกันได้ดีกว่า

ไวยากรณ์ระดับคำสั่งจะกล่าวถึงใน SAP ฮาน่า SQLฟังก์ชันต่างๆ ที่มีอยู่ในขั้นตอนการทำงาน SAP ฟังก์ชัน HANA SQLและวัตถุการสร้างแบบจำลองที่ใช้กระบวนการเหล่านี้ใน SAP การสร้างแบบจำลอง HANA เกี่ยวกับการสอน

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

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

ไม่ ตัวดำเนินการแผนของ Calculation Engine นั้นเลิกใช้งานแล้ว โค้ดที่มีอยู่ยังคงทำงานได้ แต่การพัฒนาใหม่ควรใช้ SQL มาตรฐาน ซึ่งตัวเพิ่มประสิทธิภาพในปัจจุบันสามารถจัดการได้ดีไม่แพ้กัน

โดยส่วนใหญ่แล้วใช่ ลูป FOR และเคอร์เซอร์จำนวนมากแสดงถึงการเชื่อมต่อหรือการรวมข้อมูลที่เขียนในรูปแบบยาว และ AI สามารถเสนอวิธีการที่เทียบเท่าโดยใช้ชุดข้อมูลได้ ตรวจสอบให้แน่ใจว่าจำนวนแถวตรงกันก่อนนำไปใช้

ใช่ การอ่านแผนงานViz tracเช่น AI จะระบุข้อความที่ใช้เวลานาน และตรวจสอบว่าขั้นตอนต่างๆ ถูกเรียงลำดับโดยการพึ่งพาที่ไม่จำเป็นระหว่างตัวแปรในตารางหรือไม่

ใช่ครับ โดยใช้พารามิเตอร์ในตาราง OUTPUT หลายตัว นี่คือหนึ่งในข้อได้เปรียบหลักของ SQL Script เหนือกว่าขั้นตอน SQL ทั่วไป ซึ่งสามารถส่งคืนผลลัพธ์ได้เพียงรายการเดียว

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