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 握手异常

在 Oracle 12c 中插入对象数据

Oracle 12c - 从视图中获取 IMPORT_TABLE_STATS

Oracle 12c 中 varchar2 的扩展长度

如何在 oracle 12c 中使用多个数据更新单个列

在 Oracle 12c 的 JSON_VALUE 中使用特殊字符的问题