通过Teiid视图将OData属性传递到存储过程中。

问题描述 投票:1回答:1

我正在将Salesforce Lightning Connect(OData连接器)连接到Teiid。

在Teiid后面有一个叫做getCustomers的存储过程,它需要3个参数,分别是@field,@operator,@value。@field,@operator,@value。例如,getCustomers('Last_Name', '=', 'Porter')。所有的调用都将是只读的。

Salesforce不能直接调用ActionImports和FunctionImports,我需要它们是EntitySets。Salesforce将在OData中以"$filter=Last_Name+eq+'Porter'"的方式发送详细信息。

我可以使用一个视图来确保EntitySet被暴露,并且视图可以调用存储过程。我的问题是如何检测WHERE子句($filter=Last_Name+eq+'Porter')并将其传递给存储过程?

由于$filter可能是一个项目链,我怀疑我需要在虚拟过程中使用动态SQL,但仍然存在传入打视图的OData属性的问题。

<metadata type="DDL"><![CDATA[
CREATE FOREIGN PROCEDURE getCustomers(field varchar, operator varchar, value varchar)
RETURNS TABLE (Id, integer, First_Name varchar, Last_Name varchar)
OPTIONS (UPDATECOUNT 0);]]>
</metadata>

<metadata type="DDL"><![CDATA[
CREATE VIEW SalesforceGetCustomers (Id PRIMARY KEY, First_Name varchar, Last_Name varchar)
AS SELECT * FROM (CALL getCustomers('?????','?????','?????')) t;]]>
</metadata>
jboss virtualization teiid
1个回答
0
投票

我的问题是如何检测WHERE子句($filter=Last_Name+eq+'Porter')并传递给存储过程?

最简单的方法是使用一个过程化的关系映射,让这种情况隐式发生。http:/teiid.github.ioteiid-documentsmastercontentreferencer_procedural-relational-command.html。

简单地说,你可以像调用一个表一样调用过程。 如果你想添加一个视图,它将看起来像这样。

CREATE VIEW SalesforceGetCustomersAS SELECT Id, First_Name, Last_Name FROM getCustomers;

只要用户提供的输入是谓词,它就会像预期的那样工作。

SELECT * FROM SalesforceGetCustomers WHERE field = '...' and operator = '...' and "value" = '...' 。

© www.soinside.com 2019 - 2024. All rights reserved.