【问题标题】:Oracle 12c - Using Dynamic SQL in a REST callOracle 12c - 在 REST 调用中使用动态 SQL
【发布时间】: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;

【问题讨论】:

    标签: json oracle rest dynamic-sql


    【解决方案1】:

    关于 SQL 注入潜力的明显警告。即使只有选择它也可以调用一个函数。

    这是我为演示您所说的内容所做的。

    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 中创建此 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"
        }
    }
    

    【讨论】:

    • 了解安全警告。这只是一个起点。
    猜你喜欢
    • 2014-05-18
    • 1970-01-01
    • 2014-12-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多