You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在SAP HANA中用存储过程实现批量插入?可接收XML参数吗?

SAP HANA 批量插入的可复用实现与参数方案

一、XML作为输入参数实现批量插入

完全可以用XML作为输入参数,不管是存储过程还是XSJS脚本都能处理:

1. 存储过程中处理XML参数

HANA支持XML数据类型作为存储过程输入参数,核心是用XMLTABLE函数把XML节点解析成关系型数据集,再批量插入目标表。

示例代码:

-- 定义存储过程
CREATE OR REPLACE PROCEDURE BULK_INSERT_FROM_XML(IN p_input_xml XML)
LANGUAGE SQLSCRIPT
AS
BEGIN
  -- 解析XML到临时结果集
  lv_parsed_data = SELECT 
                     XMLCAST(XMLQUERY('/record/id/text()' PASSING r RETURNING CONTENT) AS INT) AS id,
                     XMLCAST(XMLQUERY('/record/name/text()' PASSING r RETURNING CONTENT) AS VARCHAR(50)) AS name
                   FROM XMLTABLE('/records/record' PASSING p_input_xml) AS r;
  
  -- 批量插入到两个目标表
  INSERT INTO TABLE1 (id, name) SELECT id, name FROM lv_parsed_data;
  INSERT INTO TABLE2 (id, name) SELECT id, name FROM lv_parsed_data;
END;

对应的输入XML结构可以是:

<records>
  <record>
    <id>1</id>
    <name>Test1</name>
  </record>
  <record>
    <id>2</id>
    <name>Test2</name>
  </record>
</records>

2. XSJS脚本中处理XML参数

XSJS可以直接读取请求中的XML内容,用DOM API解析遍历后,要么调用上面的存储过程,要么直接执行批量插入:

示例代码:

// 获取请求中的XML字符串
var xmlStr = $.request.body.asString();
var xmlDoc = new DOMParser().parseFromString(xmlStr, "text/xml");
var records = xmlDoc.getElementsByTagName("record");

// 调用存储过程完成插入
var conn = $.db.getConnection();
var pstmt = conn.prepareCall("CALL BULK_INSERT_FROM_XML(?)");
pstmt.setXML(1, xmlStr);
pstmt.execute();
pstmt.close();
conn.commit();
conn.close();

二、其他批量插入的参数方案

除了XML,还有几种更常用的批量插入实现方式:

1. 表类型(Table Type)参数

这是HANA存储过程批量操作的首选方案,自定义和目标表结构匹配的表类型,直接以表结构传入批量数据:

步骤1:定义表类型

CREATE TYPE TT_BULK_DATA AS TABLE (id INT, name VARCHAR(50));

步骤2:编写存储过程

CREATE OR REPLACE PROCEDURE BULK_INSERT_FROM_TABLE(IN p_input_data TT_BULK_DATA)
LANGUAGE SQLSCRIPT
AS
BEGIN
  INSERT INTO TABLE1 (id, name) SELECT id, name FROM :p_input_data;
  INSERT INTO TABLE2 (id, name) SELECT id, name FROM :p_input_data;
END;

XSJS调用示例:

var tableData = new $.db.Table("TT_BULK_DATA");
tableData.addRow([1, "Test1"]);
tableData.addRow([2, "Test2"]);

var conn = $.db.getConnection();
var pstmt = conn.prepareCall("CALL BULK_INSERT_FROM_TABLE(?)");
pstmt.setTable(1, tableData);
pstmt.execute();
pstmt.close();
conn.commit();
conn.close();

2. JSON参数

和XML逻辑类似,用JSON_TABLE解析JSON数组为关系型数据,适合前后端交互更友好的场景:

存储过程示例:

CREATE OR REPLACE PROCEDURE BULK_INSERT_FROM_JSON(IN p_input_json JSON)
LANGUAGE SQLSCRIPT
AS
BEGIN
  lv_parsed_data = SELECT id, name FROM JSON_TABLE(
                     :p_input_json,
                     '$[*]' COLUMNS(
                       id INT PATH '$.id',
                       name VARCHAR(50) PATH '$.name'
                     )
                   );
  
  INSERT INTO TABLE1 SELECT * FROM lv_parsed_data;
  INSERT INTO TABLE2 SELECT * FROM lv_parsed_data;
END;

3. CSV字符串参数

如果数据结构简单,也可以用CSV格式的字符串作为输入,拆分后转换字段类型再插入:

存储过程示例:

CREATE OR REPLACE PROCEDURE BULK_INSERT_FROM_CSV(IN p_input_csv VARCHAR(1000))
LANGUAGE SQLSCRIPT
AS
BEGIN
  -- 拆分记录
  lv_records = SELECT STRING AS record FROM STRING_SPLIT(:p_input_csv, ';');
  -- 拆分字段并转换类型
  lv_parsed_data = SELECT
                     CAST(SPLIT_PART(record, ',', 1) AS INT) AS id,
                     SPLIT_PART(record, ',', 2) AS name
                   FROM lv_records;
  
  INSERT INTO TABLE1 SELECT * FROM lv_parsed_data;
  INSERT INTO TABLE2 SELECT * FROM lv_parsed_data;
END;

内容的提问来源于stack exchange,提问作者rohithrajan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 09:15:42