同一 URI 参数的多个值
Multiple values for the same URI parameter
我正在通过 APEX 使用 ORDS (v18.3) 创建一个 API,我需要能够为同一参数传递多个值,例如:
https://server-url/resource?id=1&id=2
这是无法更改的第三方要求。
当我尝试像这样使用 URL 时,只传递第一个参数,第二个参数被删除。
是否可以使用 ORDS 来满足我的需求?
据我所知,您可以传递任意数量的值,但所有值都应属于同一参数并以冒号分隔。在你的情况下,那将是
https://server-url/resource?id=1:2
这也意味着您之后必须 "split" 它们,以某种方式获得单独的值。
我在从 Apex 调用报告(由 Oracle Reports 开发)时使用了它。在 After parameter form 触发器中拆分这些值不是问题,但是 - 我不知道你是否可以在你的情况下这样做。
希望有人比我更了解。
我有一个类似的问题,我通过简单地处理查询字符串解决了这个问题。
创建了一个函数:
create or replace function array_from_oldschool(p_query_string in varchar2, p_key in varchar2) return apex_t_varchar2 is
l_ret apex_t_varchar2 := apex_t_varchar2();
l_usenext boolean := false;
l_isval boolean := false;
l_arr apex_t_varchar2;
begin
l_arr := apex_string.split(p_query_string, '\s*[=&]\s*');
for i in 1 .. l_arr.count loop
if l_usenext = true and l_isval = true then
l_ret.extend;
l_ret(l_ret.count) := l_arr(i);
l_usenext := false;
end if;
if l_arr(i) = p_key and l_isval = false then
l_usenext := true;
end if;
l_isval := not (l_isval);
end loop;
return l_ret;
end;
要测试:创建一个 ORDS GET 服务,键入 PL/SQL
declare
l_arr apex_t_varchar2;
begin
l_arr := array_from_oldschool(p_query_string => owa_util.get_cgi_env('QUERY_STRING'), p_key => 'id');
for i in 1 .. l_arr.count loop
htp.prn(l_arr(i) || ' <br>');
end loop;
end;
测试一下:GET testme/old-school?id=1&id=2&id=10&id=100&id=99
输出为:
1
2
10
100
99
您需要更改一些代码,从使用 owa_util.ident_arr 到 TABLE 的 Varchar2,例如 apex_T_varchar2。但它应该是最小的。
问候
奥拉维尔
* 编辑 *
这个函数更好,因为如果查询字符串有空参数(即 val=&val2=&val4=)
,另一个函数就会搞砸
create or replace function query_string_array(p_key in varchar2) return apex_t_varchar2 is
l_query_string apex_t_varchar2;
l_return apex_t_varchar2 := apex_t_varchar2();
begin
l_query_string := apex_string.split(owa_util.get_cgi_env('QUERY_STRING'), '&');
for i in 1 .. l_query_string.count loop
if l_query_string(i) like p_key || '=%' then
if replace(l_query_string(i), p_key || '=', '') is not null then
l_return.extend;
l_return(l_return.count) := replace(l_query_string(i), p_key || '=', '');
end if; --don't add empty/null values
end if;
end loop;
return l_return;
end;
我正在通过 APEX 使用 ORDS (v18.3) 创建一个 API,我需要能够为同一参数传递多个值,例如:
https://server-url/resource?id=1&id=2
这是无法更改的第三方要求。
当我尝试像这样使用 URL 时,只传递第一个参数,第二个参数被删除。
是否可以使用 ORDS 来满足我的需求?
据我所知,您可以传递任意数量的值,但所有值都应属于同一参数并以冒号分隔。在你的情况下,那将是
https://server-url/resource?id=1:2
这也意味着您之后必须 "split" 它们,以某种方式获得单独的值。
我在从 Apex 调用报告(由 Oracle Reports 开发)时使用了它。在 After parameter form 触发器中拆分这些值不是问题,但是 - 我不知道你是否可以在你的情况下这样做。
希望有人比我更了解。
我有一个类似的问题,我通过简单地处理查询字符串解决了这个问题。
创建了一个函数:
create or replace function array_from_oldschool(p_query_string in varchar2, p_key in varchar2) return apex_t_varchar2 is
l_ret apex_t_varchar2 := apex_t_varchar2();
l_usenext boolean := false;
l_isval boolean := false;
l_arr apex_t_varchar2;
begin
l_arr := apex_string.split(p_query_string, '\s*[=&]\s*');
for i in 1 .. l_arr.count loop
if l_usenext = true and l_isval = true then
l_ret.extend;
l_ret(l_ret.count) := l_arr(i);
l_usenext := false;
end if;
if l_arr(i) = p_key and l_isval = false then
l_usenext := true;
end if;
l_isval := not (l_isval);
end loop;
return l_ret;
end;
要测试:创建一个 ORDS GET 服务,键入 PL/SQL
declare
l_arr apex_t_varchar2;
begin
l_arr := array_from_oldschool(p_query_string => owa_util.get_cgi_env('QUERY_STRING'), p_key => 'id');
for i in 1 .. l_arr.count loop
htp.prn(l_arr(i) || ' <br>');
end loop;
end;
测试一下:GET testme/old-school?id=1&id=2&id=10&id=100&id=99
输出为:
1
2
10
100
99
您需要更改一些代码,从使用 owa_util.ident_arr 到 TABLE 的 Varchar2,例如 apex_T_varchar2。但它应该是最小的。
问候 奥拉维尔
* 编辑 * 这个函数更好,因为如果查询字符串有空参数(即 val=&val2=&val4=)
,另一个函数就会搞砸create or replace function query_string_array(p_key in varchar2) return apex_t_varchar2 is
l_query_string apex_t_varchar2;
l_return apex_t_varchar2 := apex_t_varchar2();
begin
l_query_string := apex_string.split(owa_util.get_cgi_env('QUERY_STRING'), '&');
for i in 1 .. l_query_string.count loop
if l_query_string(i) like p_key || '=%' then
if replace(l_query_string(i), p_key || '=', '') is not null then
l_return.extend;
l_return(l_return.count) := replace(l_query_string(i), p_key || '=', '');
end if; --don't add empty/null values
end if;
end loop;
return l_return;
end;