问题描述
你好,
我创建了一个PL/SQL函数,该函数返回未结余额列表作为表结果,其中所有金额都转换为作为输入参数提供的货币:
我创建了一个只有GET处理程序的Oracle REST数据服务:
我通过Advanced REST客户端对其进行了测试,它正在按预期工作,并带有to_currency参数的附加标头。在APEX中,我声明了与上述REST服务相关的REST数据源,然后我制作了一个基于上述REST源的IG区域的APEX页面,并且只要我不尝试提供参数,即直到to_currency为null,它就可以正常工作。当我尝试填充{"to_currency":"USD"}在外部过滤器属性中,这会导致应用程序崩溃。我用谷歌搜索了这个问题,但什么也没找到。
是否有其他标准方法将非列参数传递给APEX中的GET处理程序,或者我应该编写自己的过程来调用REST服务,例如通过使用APEX_EXEC?
谢谢你,致以最诚挚的问候,
亚历克斯
我创建了一个PL/SQL函数,该函数返回未结余额列表作为表结果,其中所有金额都转换为作为输入参数提供的货币:
function my_pkg.my_func (pi_currency in NUMBER default NULL) return amount_tab pipelined;
我创建了一个只有GET处理程序的Oracle REST数据服务:
select * from table(my_pkg.my_func(:to_currency)) ;
我通过Advanced REST客户端对其进行了测试,它正在按预期工作,并带有to_currency参数的附加标头。在APEX中,我声明了与上述REST服务相关的REST数据源,然后我制作了一个基于上述REST源的IG区域的APEX页面,并且只要我不尝试提供参数,即直到to_currency为null,它就可以正常工作。当我尝试填充{"to_currency":"USD"}在外部过滤器属性中,这会导致应用程序崩溃。我用谷歌搜索了这个问题,但什么也没找到。
是否有其他标准方法将非列参数传递给APEX中的GET处理程序,或者我应该编写自己的过程来调用REST服务,例如通过使用APEX_EXEC?
谢谢你,致以最诚挚的问候,
亚历克斯
专家解答
我无法重现你的错误。这是我的步骤 -- 希望它们能帮助你
定义了一个基本服务,以确保ORDS/REST正常
用卷曲测试。然后建立一个带参数的流水线函数
然后添加到模板以允许访问管道功能
并检查了这一点,以确保可以通过curl访问它
然后在APEX中创建了一个Rest数据源,并确保它被定义为一个ORDS一个不是简单的http

然后将其用作带有过滤器的外部源

定义了一个基本服务,以确保ORDS/REST正常
BEGIN
ORDS.enable_schema(
p_enabled => TRUE,
p_schema => 'ASKTOM',
p_url_mapping_type => 'BASE_PATH',
p_url_mapping_pattern => 'asktom',
p_auto_rest_auth => FALSE
);
COMMIT;
END;
/
BEGIN
ORDS.define_service(
p_module_name => 'm1',
p_base_path => 'm1/',
p_pattern => 't/',
p_method => 'GET',
p_source_type => ORDS.source_type_collection_feed,
p_source => 'SELECT * FROM t',
p_items_per_page => 0);
COMMIT;
END;
/
用卷曲测试。然后建立一个带参数的流水线函数
create or replace
type asktom.emp_obj as object (
EMPNO NUMBER(4)
,ENAME VARCHAR2(10)
,JOB VARCHAR2(9)
,MGR NUMBER(4)
,HIREDATE DATE
,SAL NUMBER(7,2)
,COMM NUMBER(7,2)
,DEPTNO NUMBER(2)
)
/
create or replace
type asktom.emp_row_list as table of asktom.emp_obj
/
create or replace
function asktom.pipe_demo(p_empno number) return emp_row_list pipelined is
begin
for i in ( SELECT * FROM t WHERE empno = p_empno or p_empno is null)
loop
pipe row ( emp_obj(
i.EMPNO
,i.ENAME
,i.JOB
,i.MGR
,i.HIREDATE
,i.SAL
,i.COMM
,i.DEPTNO
) );
end loop;
return;
end;
/
select * from asktom.pipe_demo(7369);
然后添加到模板以允许访问管道功能
BEGIN
ORDS.define_template(
p_module_name => 'm1',
p_pattern => 't/:empno');
ORDS.define_handler(
p_module_name => 'm1',
p_pattern => 't/:empno',
p_method => 'GET',
p_source_type => ORDS.source_type_collection_feed,
p_source => 'select * from asktom.pipe_demo( :empno)',
p_items_per_page => 0);
COMMIT;
END;
/
并检查了这一点,以确保可以通过curl访问它
C:\>curl -i -X GET http://localapex:8089/ords/asktom/m1/t/7369
HTTP/1.1 200 OK
Date: Wed, 13 Jan 2021 12:46:15 GMT
Content-Type: application/json
ETag: "bxqrFasTUPeM0bb0JjQaaSBEpTVhlTzO63sUolMoCNM4jM11gAj25djNQpBb9zngULKD1BXy0ltOUDMBdW2fkA=="
Transfer-Encoding: chunked
{"items":[{"empno":7369,"ename":"SMITH","job":"CLERK","mgr":7902,"hiredate":"1980-12-16T16:00:00Z","sal":800,"comm":null,"deptno":20}],"hasMore":false,"limit":0,"offset":0,"cou
nt":1,"links":[{"rel":"self","href":"http://localapex:8089/ords/asktom/m1/t/7369"},{"rel":"describedby","href":"http://localapex:8089/ords/asktom/metadata-catalog/m1/t/item"}]}
然后在APEX中创建了一个Rest数据源,并确保它被定义为一个ORDS一个不是简单的http
然后将其用作带有过滤器的外部源
文章转载自ASKTOM,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




