首页 > 解决方案 > 在 SQL 选择中返回 Oracle ORDS REST JSON 结果

问题描述

我想在两个 11g 数据库之间使用 Oracle ORDS REST 接口。根据外部顾问的说法,这比使用数据库链接要快。然后,接收 11g 数据库必须使用 SQL 通过 Oracle Apex 图表显示结果。我还需要加入接收数据库上的表。11g 是否具有转换 ORDS REST JSON 以使用 SQL 显示它的必要功能,为此需要什么代码?

标签: sqljsonoracleoracle-ords

解决方案


Oracle 11g 不支持 JSON。这是在 12c 中首次引入的。但是,有一种解决方法。Oracle Application Express 5.1.4 与 11g 兼容,它有自己的 JSON 生成器 (APEX_JSON)。您需要将它安装在您的数据库中。

考虑 Oracle APEX 和 Oracle 数据库之间的矩阵兼容性:

  • 对于 APEX 5.0,最低数据库版本为 11.1.0.7
  • 对于 APEX 5.1,最低数据库版本为 11.2.0.4
  • 对于 APEX 18.1、18.2、19.1,最低数据库版本为 11.2.0.4

即使在 11g 中,您也可以将 APEX_JSON 的输出检索为 json 格式的 CLOB。

例子

1.此过程使用 APEX_JSON 检索 JSON 格式的信息

CREATE OR REPLACE PROCEDURE get_emp_json (p_empno IN emp.empno%TYPE DEFAULT NULL) AS
  l_cursor SYS_REFCURSOR;
BEGIN
  
  OPEN l_cursor FOR
    SELECT e.empno AS "empno",
           e.ename AS "employee_name",
           e.job AS "job",
           e.mgr AS "mgr",
           TO_CHAR(e.hiredate,'YYYY-MM-DD') AS "hiredate",
           e.sal AS "sal",
           e.comm  AS "comm",
           e.deptno AS "deptno"
    FROM   emp e
    WHERE  e.empno = DECODE(p_empno, NULL, e.empno, p_empno);

  APEX_JSON.open_object;
  APEX_JSON.write('employees', l_cursor);
  APEX_JSON.close_object;
END;
/

2.构建 ORDS REST 模块(在您自己的架构中)

BEGIN
  ORDS.define_module(
    p_module_name    => 'rest-v4',
    p_base_path      => 'rest-v4/',
    p_items_per_page => 0);
  
  ORDS.define_template(
   p_module_name    => 'rest-v4',
   p_pattern        => 'employees/');

  ORDS.define_handler(
    p_module_name    => 'rest-v4',
    p_pattern        => 'employees/',
    p_method         => 'GET',
    p_source_type    => ORDS.source_type_plsql,
    p_source         => 'BEGIN get_emp_json; END;',
    p_items_per_page => 0);
    
  ORDS.define_template(
   p_module_name    => 'rest-v4',
   p_pattern        => 'employees/:empno');

  ORDS.define_handler(
    p_module_name    => 'rest-v4',
    p_pattern        => 'employees/:empno',
    p_method         => 'GET',
    p_source_type    => ORDS.source_type_plsql,
    p_source         => 'BEGIN get_emp_json(:empno); END;',
    p_items_per_page => 0);
    
  COMMIT;
END;
/

3.调用REST WEB SERVICE

http://yourhost:yourport/ords/hr/rest-v4/employees/

过去我使用它,因为 Oracle 11g 不处理 JSON,只能通过复杂的 SQL 机制。通过这种方式,您可以轻松构建用于以 JSON 格式检索数据的 Web 服务。


推荐阅读