输入一个列表到存储过程
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 上的文档。
我从 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 上的文档。