我从R获得了一个元素列表,我必须从数据库中获取属于元素列表的记录。
INPUT:
'12345','23456', '34567', '45678'
PROCEDURE:
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;
我如何向程序提供这样的清单?
答案 0 :(得分:1)
将参数列表移交给SQLScript有点棘手,因为没有直接的原生构造。
一种方法是使用APPLY_FILTER
函数并将列表“走私”为字符串参数。
在我的示例中,我从表CUSERS
中读取并为APPLY_FILTER
创建了一个过滤条件,该条件通过USER_ID
子句过滤了列IN ( )
。
从列表中删除单引号(' '
)是为了避免在执行查询时进行隐式类型转换。保留单引号会使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的稍微更舒适的方法可以是使用表类型用户定义函数(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
(或任何其他客户端)中,确保在使用此构造时使用绑定变量。否则处理不同的字符串引用机制会变得很麻烦。
请参阅APPLY_FILTER
here上的文档。
答案 1 :(得分:0)
使用用户定义的数据类型。
首先创建用户定义的数据类型
数据库节点&gt;可编程性&gt;类型&gt;用户定义的表类型
脚本:
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