存储过程中 SAP HANA(SQL教程)

⚡ 智能摘要

SAP HANA SQL 存储过程是一个可重用的、命名的 SQLScript 代码块,用于执行特定的数据操作。它接受 IN、OUT 和 INOUT 参数,可以使用 READS SQL DATA 将其标记为只读,并且可以使用 CREATE PROCEDURE 语法在模式或包级别创建。

  • 🧱 选择创建地点: 根据流程在架构(目录)或包(内容)中的位置,定义流程。 SAP HANA 数据模型。
  • 📥 有意使用参数: IN 传递输入,OUT 返回输出,INOUT 同时执行输入和输出——为了清晰起见,请在每个签名中为它们命名。
  • 🔐 谨慎选择 SQL 安全性: DEFINER 以创建者的权限运行;INVOKER 以调用者的权限运行——根据数据访问策略选择。
  • 📚 尽可能标记为只读: 读取 SQL 数据记录意图,优化规划,并允许通过结果视图公开该过程。
  • 🤖 利用人工智能制定流程: AI 助手将简单的英语逻辑转换为带有参数、异常处理程序和结果视图的 CREATE PROCEDURE 模板。

SAP HANA SQL 存储过程

什么是SQL存储过程?

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 语法中使用的每个子句。

元素 描述
<proc_name> 手术名称。
<parameter_clause> 参数列表,每个参数分别标记为 IN、OUT 或 INOUT:
IN — 传递给该过程的只读输入。
OUT — 过程返回的输出。
输入输出 —两者都接受一个输入值,并返回修改后的值。
LANGUAGE <lang> 该过程使用的编程语言。默认值:SQLSCRIPT。
SQL SECURITY <mode> 安全模式(默认:DEFINER):
定义器 — 以程序创建者的权限运行。
祈求者 — 以调用者的权限运行。
DEFAULT SCHEMA <default_schema_name> 用于解析过程体中未限定对象的模式。如果省略,则使用当前会话模式。
READS SQL DATA 将该过程标记为只读。它不能修改数据或模式,不包含 DDL 或 DML,并且只能调用其他只读过程。
WITH RESULT VIEW <view_name> 定义用作过程输出的结果视图。如果存在结果视图,则其他程序可以查询该过程。 SQL 像操作表格或视图一样操作语句。
SEQUENTIAL EXECUTION 强制过程体按顺序执行,不进行并行处理。
<procedure_body> 用选定的编程语言编写的程序主体。
HEADER ONLY 仅创建具有 OID 的过程属性,而不编译过程体。适用于前向声明。

示例:创建一个简单的存储过程

下面的示例创建了一个只读过程,该过程返回给定客户的销售总额。

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 在输出参数中。

调用存储过程

存储过程一旦创建,即可通过以下方式调用: CALL 语句可以选择性地位于另一个过程、SQLScript 函数或外部客户端中。四种最常见的调用模式是:

  • 来自 SQL: CALL my_proc(p1, p2, ?); —占位符返回OUT值。
  • 来自另一个程序: CALL another_proc(:in1, :out1);
  • 来自一份申请表: 通过 JDBC、ODBC 或云 SDK 绑定输入参数并读取输出。
  • 作为虚拟表格: 声明结果视图时,使用 SELECT 语句针对视图名称查询该过程。

HANA存储过程的最佳实践

以下习惯可确保 HANA 程序具有可读性、高性能和易于维护的特点:

  • 参数名称需添加前缀: iv_ 输入, ev_ 用于出口,以及 iov_ 用于输入/输出。
  • 使用 READS SQL 数据标记意图 无论该程序是否真正是只读的。
  • 使用 SQL 安全调用器 对于应尊重调用者权限的共享程序。
  • 将每个代码块用 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,解释每个参数的作用、选择特定连接的原因以及在输入错误时过程可能失败的地方,从而大大加快代码审查和新用户入职速度。

总结一下这篇文章: