我正在将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>
我的问题是如何检测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" = '...' 。