我正在使用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;
有什么想法吗?
答案 0 :(得分:0)
与您之前的示例相比,这只是一个小小的改动。有关详细信息,请参阅this example from the docs。
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
,因为它们都是第一个变量"object is not iterable".
。它会变得更加复杂if you want to repeat variable names ......但我认为这足以回答你的问题。