暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Oracle 如何将参数传递给APEX中的GET处理程序?

ASKTOM 2020-12-14
1076

问题描述

你好,

我创建了一个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正常

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

RESTDEMO1

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

RESTDEMO2

文章转载自ASKTOM,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论