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 也只能调用函数。
这是我为演示您所谈论的内容所做的工作。
- 创建此函数,其中 一吨消毒代码 应该用于防止 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
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"
}
}
在 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 也只能调用函数。
这是我为演示您所谈论的内容所做的工作。
- 创建此函数,其中 一吨消毒代码 应该用于防止 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
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"
}
}