我正在使用Oracle Rest Data Services来构建应用程序。
我可以轻松地读取和写入类似GET http://example.com/foo/bar
运行查询SELECT * FROM bar
或
POST http://example.com/foo/bar
{
"first": "a'b",
"second": "c,d"
}
运行查询INSERT INTO bar (first, second) VALUES (:first, :second)
从请求正文绑定查询参数的位置。
现在,我想构建一个运行动态查询的路由。
我可以使用一个绑定参数来做到这一点,例如:
POST http://example.com/foo/query
{
"query": "DELETE FROM bar WHERE first = :param",
"param": "a'b"
}
运行查询
BEGIN EXECUTE IMMEDIATE :query USING :param; END;
但是我不知道如何使用多个参数来做到这一点。例如。
POST http://example.com/foo/query
{
"query": "DELETE FROM bar WHERE first = :first AND second = :second",
"bindings": "first,second",
"first": "a'b",
"second": "c,d"
}
查询应类似于
DECLARE
params ...? -- (params variable should set USING list from :bindings request param)
BEGIN
EXECUTE IMMEDIATE :query USING params;
END;
知道吗?
与之前的示例相比,这只是一个小变化。有关详细信息,请参阅文档中的此示例。
BEGIN EXECUTE IMMEDIATE :query USING :first, :second; END;
作为警告,查询中的绑定变量名称不需要与 EXECUTE IMMEDIATE 块中的名称匹配 - 它们按出现的顺序而不是按名称进行评估。所以在这个例子中:
:query := 'DELETE FROM bar WHERE first = :a and second = :b';
execute immediate :query using :my_var1, :my_var2;
pl/sql 变量的值my_var1
分配给 sql 绑定变量a
因为它们都是第一个。如果您想重复变量名称,它可能会变得更加复杂......但我认为这足以回答你的问题。