sql - 在 SQL 选择中返回 Oracle ORDS REST JSON 结果
问题描述
我想在两个 11g 数据库之间使用 Oracle ORDS REST 接口。根据外部顾问的说法,这比使用数据库链接要快。然后,接收 11g 数据库必须使用 SQL 通过 Oracle Apex 图表显示结果。我还需要加入接收数据库上的表。11g 是否具有转换 ORDS REST JSON 以使用 SQL 显示它的必要功能,为此需要什么代码?
解决方案
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 服务。
推荐阅读
- python - Loop through url-list in python
- python - Firefox 不保存带有扩展名的文件
- keyboard-events - Interaction with a running process
- c# - GroupPrincipal.FindByIdentity 未获取最新的 AD 组
- node.js - node.js 中间件使代码同步
- odoo - 未捕获的类型错误:无法读取未定义的属性“类型”
- bash - 当使用 SIGINT 杀死父进程时,子进程如何终止?
- swift - How to get the smallest possible Float in Swift
- python - 如何修复 NameError:未定义名称“X_train”?
- ruby-on-rails - 检查复选框是否被选中 rails