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

时间:2018-02-21 18:10:46

标签: json oracle rest dynamic-sql

在Oracle 12c中,使用APEX(但我不知道这是否相关)...我想创建一个通用的REST调用,我可以传入SQL语句(仅限选择)和有一个通过JSON返回的数据集。此数据集可能包含一些列或多个....

我正在使用sys_refCursor,并且可以获得静态SQL语句,但我无法使用DYNAMIC SQL语句使其工作。现在,我只是试图将语句放入变量中。一旦这个工作,我将把SQL语句传递给REST调用,而不是将其硬编码到变量中。下面的代码按照书面形式工作,但我想要的是使用2个注释行INSTEAD硬编码' 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 个答案:

答案 0 :(得分:2)

对SQL注入潜力的明显巨大警告。即使只选择它也可以调用函数。

以下是我演示你所说的内容。

  1. 创建此功能,其中 一公吨清理代码 应该用于防止SQL注入。
  2. 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
    2.   

      从双

      中选择execsql(:sql)mycursor

      enter image description here

      结果:

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