输入一个列表到存储过程

INPUT a List to stored procedure

我从 R 获得了一个元素列表,我必须从数据库中获取属于元素列表的记录。

输入:

'12345','23456', '34567', '45678'

程序:

   CREATE PROCEDURE "SCHEMA"."GET_RECORDS" (IN LIST (Type), OUT RECORDS tt_records)
   LANGUAGE SQLSCRIPT
    SQL SECURITY INVOKER 
READS SQL DATA AS
    BEGIN
    RECORDS = select * from TABLE where ids in :LIST
    END;

如何向程序提供这样的列表?

使用用户定义的数据类型。

首先创建一个用户定义的数据类型

数据库节点 > 可编程性 > 类型 > User-Defined Table 类型

脚本:

CREATE TYPE dbo.MyTableType AS TABLE 
(
    ID INT
)

在您的过程中使用上述类型创建一个参数

CREATE PROCEDURE usp_InsertMessages 
(
    @MyParameter MyTableType READONLY
)
AS
BEGIN

    INSERT INTO MyTable
    (
       id
    )
    SELECT 
       id
       FROM @MyParameter 

END

将参数列表移交给 SQLScript 有点棘手,因为没有 straight-forward 用于此的本机构造。

一种方法是使用 APPLY_FILTER 函数并将列表 "smuggle" 作为字符串参数。

在我的示例中,我从 table CUSERS 中读取并为 APPLY_FILTER 创建了一个过滤条件,通过 IN ( ) 子句过滤列 USER_ID .

从列表中删除单引号 (' ') 是为了避免在执行查询时进行隐式类型转换。保留单引号会使 IN () 子句看起来像这样:
IN ( '<1st value>', '<2nd value>', '<3rd value>', ...)
而不是
IN (<1st value>, <2nd value>, <3rd value>, ...).

CREATE PROCEDURE  "GET_RECORDS" (IN id_list VARCHAR(4000)
                                , OUT RECORDS tt_cusers)
LANGUAGE SQLSCRIPT
SQL SECURITY INVOKER 
    READS SQL DATA AS
BEGIN
declare _filter VARCHAR(4000);

    _users = select * from cusers;

    -- APPLY_FILTER expects a proper WHERE condition, so adding the column to filter
    -- and the IN () expression is necessary.
    -- 
    -- the the id_list comes in with single quotes, let's remove those

    _filter = 'USER_ID in (' || replace (:id_list, '''', '') ||')';
    RECORDS = APPLY_FILTER(:_users, :_filter);    
end;    

call get_records (?, ?)

-- this 'list' is to be used as a single parameter value
-- '131072', '161223', '131074'

将数据从 SAP HANA 导出到 R 中的稍微更舒适的方法table 可以使用 table 类型的 user-defined 函数 (UDF) 代替。这里的主要区别是调用语句是一个简单的 SELECT 而结果只是这个 SELECT.

的结果集
CREATE function  "FGET_RECORDS" (IN id_list VARCHAR(4000))
returns  tt_cusers
LANGUAGE SQLSCRIPT
SQL SECURITY INVOKER 
    READS SQL DATA AS
BEGIN
declare _filter VARCHAR(4000);

    _users = select * from cusers;

    -- APPLY_FILTER expects a proper WHERE condition, so adding the column to filter
    -- and the IN () expression is necessary.
    -- 
    -- the the id_list comes in with single quotes, let's remove those

    _filter = 'USER_ID in (' || replace (:id_list, '''', '') ||')';
    _result = APPLY_FILTER(:_users, :_filter);    
    RETURN :_result;
end;    


select * from fget_records (? );

R(或任何其他客户端)中,确保在使用此构造时使用绑定变量。否则处理不同的字符串 quote-mechanisms 会变得很麻烦。

请参阅 APPLY_FILTER here 上的文档。