在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;
答案 0 :(得分:2)
对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; /
从双
中选择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"
}
}