如何在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
相关产品推荐
相关产品推荐

