Thủ tục lưu trữ trong SAP HANA (Hướng dẫn SQL)

⚡ Tóm tắt thông minh

SAP Thủ tục lưu trữ HANA SQL là một khối mã SQL có thể tái sử dụng, được đặt tên, thực hiện một thao tác dữ liệu cụ thể. Nó chấp nhận các tham số IN, OUT và INOUT, có thể được đánh dấu là chỉ đọc bằng READS SQL DATA và được tạo ở cấp độ lược đồ hoặc gói bằng cú pháp CREATE PROCEDURE.

  • 🧱 Chọn nơi để tạo: Xác định các thủ tục ở cấp độ lược đồ (Catalog) hoặc gói (Content) tùy thuộc vào vị trí chúng thuộc về trong hệ thống. SAP Mô hình dữ liệu HANA.
  • 📥 Hãy sử dụng các tham số một cách có chủ đích: IN truyền tín hiệu đầu vào, OUT trả về tín hiệu đầu ra, INOUT thực hiện cả hai – hãy đặt tên chúng sao cho rõ ràng trong mọi chữ ký hàm.
  • 🔐 Hãy lựa chọn SQL SECURITY một cách cẩn thận: DEFINER chạy với quyền của người tạo; INVOKER chạy với quyền của người gọi — lựa chọn dựa trên chính sách truy cập dữ liệu.
  • 📚 Đánh dấu là chỉ đọc khi có thể: Lệnh READS SQL DATA ghi lại ý định, tối ưu hóa việc lập kế hoạch và cho phép hiển thị quy trình thông qua chế độ xem kết quả.
  • 🤖 Sử dụng trí tuệ nhân tạo để soạn thảo quy trình: Các trợ lý AI chuyển đổi logic ngôn ngữ thông thường thành các mẫu CREATE PROCEDURE với các tham số, trình xử lý ngoại lệ và chế độ xem kết quả.

SAP Thủ tục lưu trữ SQL HANA

Thủ tục lưu trữ SQL là gì?

A thủ tục lưu trữ Thủ tục là một đơn vị mã có tên, có thể tái sử dụng, thực hiện một nhiệm vụ cụ thể. Các thủ tục có thể được kết hợp thành các chương trình lớn hơn, đó là nền tảng của... Thiết kế mô đunMột quy trình có thể gọi một quy trình khác — bên gọi được gọi là bên tiếp nhận. chương trình gọi điện.

Thủ tục là các khối xử lý có thể tái sử dụng với một trình tự biến đổi dữ liệu được xác định. Chúng có thể chấp nhận nhiều tham số đầu vào và đầu ra và có thể được khai báo là chỉ đọc hoặc đọc-ghi.

An SQL thủ tục trong SAP HANNA có thể được tạo tại:

  • Cấp độ lược đồ (Nút danh mục) — được quản lý thông qua danh mục và hiển thị cho mọi người dùng có quyền phù hợp.
  • Mức độ gói (Nút nội dung) — được quản lý như một thành phần thiết kế trong gói ứng dụng.

SAP Cú pháp thủ tục lưu trữ HANA

Cú pháp tổng quát để tạo một thủ tục trong SAP HANA được hiển thị bên dưới.

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 Câu lệnh này tạo ra một thủ tục sử dụng ngôn ngữ lập trình được chỉ định bởi <lang>Ngôn ngữ mặc định là SQLScript.

Giải thích các yếu tố cú pháp

Bảng dưới đây mô tả mọi mệnh đề được sử dụng trong cú pháp CREATE PROCEDURE.

Yếu tố Mô tả Chi tiết
<proc_name> Tên của quy trình.
<parameter_clause> Danh sách các tham số, mỗi tham số được đánh dấu IN, OUT hoặc INOUT:
IN — Dữ liệu đầu vào chỉ đọc được truyền cho thủ tục.
OUT — Kết quả trả về từ quy trình.
GIỚI THIỆU — Cả hai phương thức đều truyền một giá trị vào và trả về giá trị đã được sửa đổi.
LANGUAGE <lang> Ngôn ngữ lập trình được sử dụng trong thủ tục. Mặc định: SQLSCRIPT.
SQL SECURITY <mode> Chế độ bảo mật (Mặc định: DEFINER):
ĐỊNH NGHĨA — được thực thi với quyền hạn của người tạo ra quy trình.
NGƯỜI TRIỆU HỒI — được thực thi với quyền hạn của người gọi.
DEFAULT SCHEMA <default_schema_name> Lược đồ được sử dụng để giải quyết các đối tượng không đủ điều kiện trong phần thân thủ tục. Nếu bỏ qua, lược đồ của phiên hiện tại sẽ được sử dụng.
READS SQL DATA Đánh dấu thủ tục là chỉ đọc. Nó không thể sửa đổi dữ liệu hoặc lược đồ, không chứa DDL hoặc DML và chỉ có thể gọi các thủ tục chỉ đọc khác.
WITH RESULT VIEW <view_name> Xác định chế độ xem kết quả được sử dụng làm đầu ra của thủ tục. Khi có chế độ xem kết quả, thủ tục có thể được truy vấn bởi một thủ tục khác. SQL Câu lệnh được trình bày như thể đó là một bảng hoặc một khung nhìn.
SEQUENTIAL EXECUTION Buộc phần thân thủ tục phải thực thi tuần tự mà không có sự song song.
<procedure_body> Phần thân chính của quy trình, được viết bằng ngôn ngữ lập trình đã chọn.
HEADER ONLY Chỉ tạo các thuộc tính của thủ tục với một OID, mà không biên dịch phần thân. Hữu ích cho việc khai báo trước.

Ví dụ: Tạo một thủ tục lưu trữ đơn giản

Ví dụ dưới đây tạo một thủ tục chỉ đọc trả về tổng doanh thu của một khách hàng cụ thể.

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;

Gọi thủ tục bằng lệnh:

CALL GET_CUSTOMER_SALES ('C0001', ?);

SAP HANA Studio (hoặc bất kỳ ứng dụng khách JDBC/ODBC nào) trả về giá trị của ev_total trong tham số đầu ra.

Gọi một thủ tục lưu trữ

Sau khi được tạo, thủ tục lưu trữ sẽ được gọi thông qua... CALL Câu lệnh có thể được thực thi tùy chọn bên trong một thủ tục khác, một hàm SQLScript hoặc một máy khách bên ngoài. Bốn mẫu gọi phổ biến nhất là:

  • Từ SQL: CALL my_proc(p1, p2, ?); — Các phần giữ chỗ trả về giá trị OUT.
  • Từ một quy trình khác: CALL another_proc(:in1, :out1);
  • Từ một ứng dụng: Liên kết các tham số đầu vào và đọc đầu ra thông qua JDBC, ODBC hoặc Cloud SDK.
  • Dưới dạng một chiếc bàn ảo: Khi một view kết quả được khai báo, hãy truy vấn thủ tục bằng câu lệnh SELECT dựa trên tên của view đó.

Các phương pháp thực hành tốt nhất cho thủ tục lưu trữ HANA

Những thói quen dưới đây giúp các thủ tục HANA dễ đọc, hiệu quả và dễ bảo trì:

  • Đặt tên tham số kèm tiền tố: iv_ để nhập liệu, ev_ để xuất khẩu, và iov_ Dùng cho đầu vào/đầu ra.
  • Đánh dấu ý định bằng lệnh READS SQL DATA trong trường hợp quy trình đó thực sự chỉ cho phép đọc mà không cần chỉnh sửa.
  • Sử dụng SQL SECURITY INVOKER Đối với các quy trình được chia sẻ, cần tôn trọng quyền hạn của người gọi.
  • Bọc mỗi khối trong BEGIN/END và giữ cho phần thân hàm ngắn gọn — chia nhỏ các thao tác logic phức tạp thành các thủ tục hỗ trợ.
  • Xử lý ngoại lệ: sử dụng DECLARE EXIT HANDLER Để báo cáo lỗi một cách lịch sự.
  • Tránh sử dụng SELECT * Bên trong các thủ tục — hãy đặt tên cho các cột mà bạn thực sự cần để kế hoạch được ổn định.

Câu Hỏi Thường Gặp

Một thủ tục có thể có nhiều tham số OUT, có thể thực hiện các thao tác DML và được gọi bằng lệnh CALL. Một hàm trả về một giá trị vô hướng hoặc giá trị bảng duy nhất, chạy mà không gây ra tác dụng phụ và được sử dụng bên trong các biểu thức SELECT, WHERE hoặc các biểu thức khác.

Ngôn ngữ mặc định và phổ biến nhất là SQLScript. HANA cũng hỗ trợ R cho các thủ tục cần thư viện thống kê và L cho việc lập trình cấp thấp. SQLScript là lựa chọn phù hợp cho hầu hết mọi quy trình nghiệp vụ.

DEFINER chạy thủ tục với quyền hạn của người dùng đã tạo ra nó — hữu ích khi thủ tục cần truy cập vào các bảng mà người gọi không thể thấy trực tiếp. INVOKER chạy với quyền hạn của người gọi, điều này an toàn hơn đối với các thủ tục tiện ích dùng chung.

Hãy sử dụng READS SQL DATA bất cứ khi nào thủ tục chỉ đọc dữ liệu mà không ghi dữ liệu. Nó ghi lại mục đích, cho phép xem kết quả và giúp trình tối ưu hóa lập kế hoạch thực thi thủ tục hiệu quả hơn.

Sử dụng câu lệnh CALL: CALL proc_name (in_val, out_param);Từ một ứng dụng, liên kết các đầu vào và đầu ra thông qua trình điều khiển JDBC, ODBC hoặc Cloud SDK, hoặc hiển thị quy trình thông qua OData cho các máy khách REST.

Bỏ một quy trình với DROP PROCEDURE proc_name; và tạo lại nó bằng lệnh CREATE OR REPLACE PROCEDURE. SAP HANA không hỗ trợ ALTER PROCEDURE; mẫu chuẩn là CREATE OR REPLACE.

Các trợ lý AI tạo ra các mẫu CREATE PROCEDURE, đề xuất tên tham số, viết trình xử lý ngoại lệ và dịch logic tiếng Anh thông thường thành SQLScript. Chúng cũng chỉ ra các thiếu sót về điều kiện lược đồ và các thao tác DML rủi ro trong ngữ cảnh chỉ đọc.

Đúng vậy. Các công cụ AI chú thích từng dòng mã SQLScript — giải thích chức năng của từng tham số, lý do chọn một phép nối cụ thể và vị trí mà quy trình có thể gặp lỗi với dữ liệu đầu vào không chính xác — giúp việc xem xét mã và hướng dẫn sử dụng nhanh hơn nhiều.

Tóm tắt bài viết này với: