Oracle 12c - 在 REST 调用中使用动态 SQL
Posted
技术标签:
【中文标题】Oracle 12c - 在 REST 调用中使用动态 SQL【英文标题】:Oracle 12c - Using Dynamic SQL in a REST call 【发布时间】:2018-02-21 18:10:46 【问题描述】:在 Oracle 12c 中,并使用 APEX(但我不知道这是否相关)...我想创建一个通用 REST 调用,我可以在其中传入 SQL 语句(仅限选择)并有一个通过 JSON 返回的数据集。这个数据集可能有几列或多列......
我正在使用 sys_refCursor,并且可以使静态 SQL 语句工作,但我无法使用 DYNAMIC SQL 语句使其工作。现在,我只是想把语句放入一个变量中。一旦这工作正常,我会将 SQL 语句传递到 REST 调用中,而不是将其硬编码到变量中。下面的代码按照编写的方式工作,但我想要的是使用 2 条注释行代替硬编码“open c for ...”行。我做错了什么?
DECLARE
c sys_refcursor;
sql_stmt VARCHAR2(200);
BEGIN
apex_json.open_object;
open c for select * from tabs where rownum < 5;
--sql_stmt := 'open c for select * from tabs where rownum < 5';
--EXECUTE IMMEDIATE sql_stmt;
apex_json.write('rows', c);
apex_json.close_all;
end;
【问题讨论】:
【参考方案1】:关于 SQL 注入潜力的明显警告。即使只有选择它也可以调用一个函数。
这是我为演示您所说的内容所做的。
-
在大量清理代码应该用来防止 SQL 注入的地方创建此函数。
create or replace function execsql(p_sql varchar2) return SYS_REFCURSOR as TYPE curtype IS REF CURSOR; src_cur curtype; begin open src_cur for p_sql; return src_cur; end; /
-
在 ORDS / APEX 中创建此 REST API
从对偶中选择 execsql(:sql) mycursor
结果:
klrice$ http "xxxxxx/sqlplus/select?select+*+from+dual"
HTTP/1.1 200 OK
Connection: Keep-Alive
Content-Encoding: gzip
Content-Language: en
Content-Type: application/json
"items": [
"mycursor": [
"dummy": "X"
]
],
"next":
"$ref": "xxxxx/sqlplus/select?select+*+from+dual&page=1"
【讨论】:
了解安全警告。这只是一个起点。以上是关于Oracle 12c - 在 REST 调用中使用动态 SQL的主要内容,如果未能解决你的问题,请参考以下文章
使用 HTTPS 调用 REST 服务的 Oracle BPEL (Java 8U92) 会产生 SSL 握手异常