Oracle 12c - 在 REST 调用中使用动态 SQL

Oracle 12c - Using Dynamic SQL in a REST call

在 Oracle 12c 中,并使用 APEX(但我不知道这是否相关)...我想创建一个通用的 REST 调用,我可以在其中传递 SQL 语句( Select 仅)并通过 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;

关于 SQL 注入潜力的明显巨大警告。即使使用 select 也只能调用函数。

这是我为演示您所谈论的内容所做的工作。

  1. 创建此函数,其中 一吨消毒代码 应该用于防止 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;
/
  1. 在 ORDS/APEX
  2. 中创建此 REST API

select execsql(:sql) mycursor from dual

结果:

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"
    }
}