โพรซีเดอร์ที่จัดเก็บไว้ใน SAP HANA (บทเรียน SQL)

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

SAP HANA SQL Stored Procedure คือบล็อก SQLScript ที่สามารถนำกลับมาใช้ซ้ำได้ โดยมีชื่อกำกับ และทำหน้าที่ดำเนินการกับข้อมูลเฉพาะอย่าง มันรับพารามิเตอร์แบบ IN, OUT และ INOUT สามารถกำหนดให้เป็นแบบอ่านอย่างเดียวได้ด้วยคำสั่ง READS SQL DATA และสร้างขึ้นที่ระดับสคีมาหรือแพ็กเกจโดยใช้ไวยากรณ์ CREATE PROCEDURE

  • 🧱 เลือกสถานที่ที่จะสร้าง: กำหนดขั้นตอนการทำงานที่ระดับสคีมา (แคตตาล็อก) หรือระดับแพ็กเกจ (เนื้อหา) ขึ้นอยู่กับว่าขั้นตอนเหล่านั้นควรอยู่ในส่วนใดของโครงสร้างข้อมูล SAP แบบจำลองข้อมูล HANA
  • 📥 ใช้พารามิเตอร์อย่างตั้งใจ: IN รับข้อมูลเข้า, OUT ส่งคืนค่าออก, INOUT ทำได้ทั้งสองอย่าง — ตั้งชื่อให้ชัดเจนในทุกรูปแบบการใช้งาน
  • 🔐 เลือกใช้ SQL SECURITY อย่างระมัดระวัง: DEFINER ทำงานด้วยสิทธิ์ของผู้สร้าง ในขณะที่ INVOKER ทำงานด้วยสิทธิ์ของผู้เรียกใช้ โดยขึ้นอยู่กับนโยบายการเข้าถึงข้อมูลว่าจะเลือกใช้แบบใด
  • 📚 ควรตั้งค่าเป็นแบบอ่านอย่างเดียวเมื่อเป็นไปได้: คำสั่ง READS SQL DATA ช่วยแสดงเจตนา ปรับปรุงการวางแผนให้เหมาะสม และอนุญาตให้แสดงขั้นตอนการทำงานผ่านมุมมองผลลัพธ์
  • 🤖 ใช้ AI ในการร่างขั้นตอนการปฏิบัติงาน: ผู้ช่วย AI จะแปลงตรรกะภาษาอังกฤษธรรมดาให้เป็นเทมเพลตการสร้างขั้นตอนการทำงาน (CREATE PROCEDURE) ที่มีพารามิเตอร์ ตัวจัดการข้อผิดพลาด และมุมมองผลลัพธ์

SAP HANA SQL Stored Procedure

SQL Stored Procedure คืออะไร?

A ขั้นตอนการเก็บ คือหน่วยของโค้ดที่มีชื่อและสามารถนำกลับมาใช้ซ้ำได้ ซึ่งทำหน้าที่เฉพาะอย่างใดอย่างหนึ่ง ขั้นตอนต่างๆ สามารถนำมาประกอบกันเป็นโปรแกรมขนาดใหญ่ ซึ่งเป็นพื้นฐานของ การออกแบบโมดูลาร์กระบวนการหนึ่งสามารถเรียกอีกกระบวนการหนึ่งได้ โดยกระบวนการที่เรียกนั้นเรียกว่า ผู้เรียก โปรแกรมการโทร.

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

An SQL ขั้นตอนใน SAP HANA สามารถสร้างได้ที่:

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

SAP ไวยากรณ์ของโพรซีเดอร์ที่เก็บไว้ใน HANA

ไวยากรณ์ทั่วไปสำหรับการสร้างขั้นตอนใน SAP HANA แสดงอยู่ด้านล่าง

CREATE PROCEDURE <proc_name> [(<parameter_clause>)] [LANGUAGE <lang>]
    [SQL SECURITY <mode>] [DEFAULT SCHEMA <default_schema_name>]
    [READS SQL DATA [WITH RESULT VIEW <view_name>]] AS
    { BEGIN [SEQUENTIAL EXECUTION]
        <procedure_body>
      END
    | HEADER ONLY }

การขอ CREATE PROCEDURE คำสั่งนี้จะสร้างขั้นตอนการทำงานโดยใช้ภาษาโปรแกรมที่ระบุไว้ <lang>ภาษาเริ่มต้นคือ SQLScript

คำอธิบายองค์ประกอบทางไวยากรณ์

ตารางด้านล่างนี้อธิบายรายละเอียดของทุกข้อความที่ใช้ในไวยากรณ์ของคำสั่ง CREATE PROCEDURE

ธาตุ Descriptไอออน
<proc_name> ชื่อของขั้นตอนการรักษา
<parameter_clause> รายการพารามิเตอร์ โดยแต่ละพารามิเตอร์จะมีเครื่องหมาย IN, OUT หรือ INOUT กำกับไว้:
IN — ข้อมูลที่อ่านได้อย่างเดียวถูกส่งไปยังขั้นตอนการทำงาน
OUT — ผลลัพธ์ที่ได้จากกระบวนการ
เข้า — ทั้งสองฟังก์ชันรับค่าเข้าและส่งคืนค่าที่แก้ไขแล้ว
LANGUAGE <lang> ภาษาโปรแกรมที่ใช้ในกระบวนการนี้ ค่าเริ่มต้น: SQLSCRIPT
SQL SECURITY <mode> โหมดความปลอดภัย (ค่าเริ่มต้น: ตัวกำหนด):
ผู้กำหนด — ดำเนินการโดยใช้สิทธิ์ของผู้สร้างกระบวนการนั้น
ผู้เรียก — ดำเนินการโดยมีสิทธิ์การใช้งานตามผู้โทร
DEFAULT SCHEMA <default_schema_name> Schema ที่ใช้ในการแก้ไขวัตถุที่ไม่ระบุคุณสมบัติในส่วนเนื้อหาของขั้นตอน หากละเว้น จะใช้ Schema ของเซสชันปัจจุบัน
READS SQL DATA กำหนดให้ขั้นตอนการทำงานนี้เป็นแบบอ่านอย่างเดียว ไม่สามารถแก้ไขข้อมูลหรือโครงสร้างข้อมูลได้ ไม่มีคำสั่ง DDL หรือ DML และสามารถเรียกใช้ขั้นตอนการทำงานแบบอ่านอย่างเดียวอื่นๆ ได้เท่านั้น
WITH RESULT VIEW <view_name> กำหนดมุมมองผลลัพธ์ที่ใช้เป็นเอาต์พุตของกระบวนการ เมื่อมีมุมมองผลลัพธ์อยู่ กระบวนการอื่นสามารถถูกสอบถามได้ SQL ข้อความนั้นเปรียบเสมือนตารางหรือมุมมองหนึ่ง
SEQUENTIAL EXECUTION บังคับให้ตัวโปรแกรมทำงานตามลำดับโดยไม่มีการทำงานแบบขนาน
<procedure_body> ส่วนหลักของกระบวนการ ซึ่งเขียนด้วยภาษาโปรแกรมที่เลือกไว้
HEADER ONLY สร้างเฉพาะคุณสมบัติของโปรซีเดอร์ด้วย OID โดยไม่คอมไพล์ส่วนเนื้อหา มีประโยชน์สำหรับการประกาศล่วงหน้า

ตัวอย่าง: สร้าง Stored Procedure อย่างง่าย

ตัวอย่างด้านล่างนี้สร้างขั้นตอนการทำงานแบบอ่านอย่างเดียว ซึ่งจะส่งคืนยอดขายรวมสำหรับลูกค้าที่กำหนด

CREATE PROCEDURE GET_CUSTOMER_SALES (
    IN  iv_customer_id NVARCHAR(10),
    OUT ev_total       DECIMAL(15,2)
)
LANGUAGE SQLSCRIPT
SQL SECURITY INVOKER
READS SQL DATA AS
BEGIN
    SELECT SUM(NET_VALUE) INTO ev_total
    FROM   "SALES"."ORDERS"
    WHERE  CUSTOMER_ID = :iv_customer_id;
END;

เรียกใช้ขั้นตอนด้วย:

CALL GET_CUSTOMER_SALES ('C0001', ?);

SAP HANA Studio (หรือไคลเอ็นต์ JDBC/ODBC ใดๆ) จะส่งคืนค่าของ ev_total ในพารามิเตอร์เอาต์พุต

การเรียกใช้โพรซีเดอร์ที่จัดเก็บไว้

เมื่อสร้างเสร็จแล้ว จะมีการเรียกใช้ stored procedure ผ่านทาง CALL คำสั่งนี้สามารถเรียกใช้ได้ภายในขั้นตอนอื่น ฟังก์ชัน SQLScript หรือไคลเอ็นต์ภายนอก รูปแบบการเรียกใช้ที่พบบ่อยที่สุดสี่แบบ ได้แก่:

  • จาก SQL: CALL my_proc(p1, p2, ?); — ตัวแปรแทนที่ส่งค่า OUT กลับมา
  • จากขั้นตอนอื่น: CALL another_proc(:in1, :out1);
  • จากใบสมัคร: ผูกพารามิเตอร์อินพุตและอ่านเอาต์พุตผ่าน JDBC, ODBC หรือ Cloud SDK
  • ในรูปแบบโต๊ะเสมือนจริง: เมื่อมีการประกาศวิวผลลัพธ์ ให้เรียกใช้โปรแกรมย่อยด้วยคำสั่ง SELECT โดยใช้ชื่อวิวเป็นเกณฑ์

แนวทางปฏิบัติที่ดีที่สุดสำหรับ HANA Stored Procedures

แนวทางปฏิบัติเหล่านี้จะช่วยให้ขั้นตอนการทำงานของ HANA อ่านง่าย มีประสิทธิภาพ และบำรุงรักษาได้ง่าย:

  • ตั้งชื่อพารามิเตอร์โดยใช้คำนำหน้า: iv_ สำหรับการป้อนข้อมูล ev_ เพื่อการส่งออก และ iov_ สำหรับอินพุต/เอาต์พุต
  • ระบุเจตนาด้วยคำสั่ง READS SQL DATA ในกรณีที่กระบวนการนั้นเป็นแบบอ่านอย่างเดียวอย่างแท้จริง
  • ใช้ SQL SECURITY INVOKER สำหรับขั้นตอนที่ใช้ร่วมกันซึ่งควรเคารพสิทธิ์ของผู้โทร
  • ห่อบล็อกแต่ละบล็อกด้วย BEGIN/END และควรเขียนเนื้อหาหลักให้กระชับ — แบ่งตรรกะที่ซับซ้อนออกเป็นขั้นตอนย่อยๆ เพื่อช่วยเสริม
  • จัดการกับข้อผิดพลาด: ใช้ DECLARE EXIT HANDLER เพื่อการรายงานข้อผิดพลาดอย่างมีประสิทธิภาพ
  • หลีกเลี่ยงการเลือก * ขั้นตอนภายใน — ตั้งชื่อคอลัมน์ที่คุณต้องการใช้จริง เพื่อให้แผนงานมีความเสถียร

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

ขั้นตอนการทำงานสามารถมีพารามิเตอร์ OUT ได้หลายตัว สามารถออกคำสั่ง DML และเรียกใช้ด้วยคำสั่ง CALL ส่วนฟังก์ชันจะส่งคืนค่าสเกลาร์หรือค่าในตารางเพียงค่าเดียว ทำงานโดยไม่มีผลข้างเคียง และใช้ภายในคำสั่ง SELECT, WHERE หรือนิพจน์อื่นๆ

ภาษาเริ่มต้นและภาษาที่ใช้กันทั่วไปมากที่สุดคือ SQLScript HANA ยังรองรับ R สำหรับขั้นตอนที่ต้องการไลบรารีทางสถิติ และ L สำหรับการเขียนสคริปต์ระดับต่ำ SQLScript เป็นตัวเลือกที่เหมาะสมสำหรับขั้นตอนทางธุรกิจเกือบทุกประเภท

คำสั่ง DEFINER จะเรียกใช้โปรซีเดอร์ด้วยสิทธิ์ของผู้ใช้ที่สร้างโปรซีเดอร์นั้นขึ้นมา ซึ่งมีประโยชน์เมื่อโปรซีเดอร์นั้นจำเป็นต้องเข้าถึงตารางที่ผู้เรียกไม่สามารถมองเห็นได้โดยตรง ส่วนคำสั่ง INVOKER จะเรียกใช้ด้วยสิทธิ์ของผู้เรียก ซึ่งปลอดภัยกว่าสำหรับโปรซีเดอร์ยูทิลิตี้ที่ใช้ร่วมกัน

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

ใช้คำสั่ง CALL: CALL proc_name (in_val, out_param);จากแอปพลิเคชัน ให้ผูกอินพุตและเอาต์พุตผ่านไดรเวอร์ JDBC, ODBC หรือ Cloud SDK หรือเปิดเผยกระบวนการผ่าน OData สำหรับไคลเอ็นต์ REST

ยกเลิกขั้นตอนด้วย DROP PROCEDURE proc_name; และสร้างใหม่โดยใช้คำสั่ง CREATE OR REPLACE PROCEDURE SAP HANA ไม่รองรับคำสั่ง ALTER PROCEDURE รูปแบบมาตรฐานคือ CREATE OR REPLACE

ผู้ช่วย AI สร้างเทมเพลตคำสั่ง CREATE PROCEDURE แนะนำชื่อพารามิเตอร์ เขียนตัวจัดการข้อผิดพลาด และแปลงตรรกะภาษาอังกฤษธรรมดาให้เป็น SQLScript นอกจากนี้ยังชี้ให้เห็นคุณสมบัติของสคีมาที่ขาดหายไปและคำสั่ง DML ที่มีความเสี่ยงภายในบริบทแบบอ่านอย่างเดียวอีกด้วย

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

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