目前有一套R12的EBS的环境(12.1.3),要同外围系统做REST对接,目前系统是启用了Oracle E-Business Suite Integrated SOA Gateway (ISG) ,但是只支持SOAP风格的webservice,可以理解为基于XML形式来传送,如果要支持REST风格需要做一个较大的版本升级,这个系统是个核心系统,基于成本和稳定性考虑决定不做版本升级,启用ORDS组件来实现发布RESTFUL,ORDS + SQL DEVELOPER也能实现这个服务,但是用 SQL DEVELOPER 开发REST服务界面有点不友好,再加上新版的APEX封装了一些操作JSON的API,对开发者来说甚是方便,因此考虑用APEX来作为开发RESTFUL服务的前端界面,以下是实现过程,本文分两个章节,第一部分是环境搭建篇,第二部分是开发篇。此篇是第二部分。
参考文章:
https://blog.youkuaiyun.com/x6_9x/article/details/104873963
https://docs.oracle.com/en/database/oracle/application-express/20.2/index.html
工作空间配置
安装完成后,需要重置INTERNAL工作空间的密码,如果忘记管理员密码可以sys权限执行apex目录下的apxchwd.sql,来重置密码。
然后新建一个工作空间。
点击【创建工作区】
工作区名称: REST_DEMO
是否重用现有方案: 否
方案名: CUX_APEX
方案密码:REST_DEMO_PASS
点击下一页,输入工空间管理员信息
开发配置
登录刚才创建的工作空间: SQL工作室 RESTful服务
点击 将方案注册到ORDS
Apex中管理ords rest的服务层次是:
模块(modules)>模板(template)》method(PUT GET DELETE 等),如下图
注册ORDS的时候会安装一个实例服务,可以参照下官方的实例服务。
这里以发布一个简单的GET服务为例,向外围的费控系统提供EBS这边一些应付模块的信息。
依次创建:模块》模板》METHOD:
创建模块
创建模板
创建GET方法
使用APEX RESTful API
上面方法对应的PL/SQL匿名块中用到了apex提供的API ,实际业务代码不再粘贴出来,下面列举两个栗子来说明如何用APEX封装的API,用起来还是挺方便了,不用自己苦哈哈的用sys.htp.print()来一点点的拼接json报文了。
实例1-简单:
DECLARE
lv_return_status number;
BEGIN
lv_return_status := 0;
apex_json.open_object;
apex_json.write('status_code',lv_return_status);
apex_json.write('err_msg','null');
apex_json.write('voucher_num',:voucher_num);
apex_json.open_array('data');
apex_json.open_object;
apex_json.write('a',2);
apex_json.write('b',2);
apex_json.close_object;
apex_json.open_object;
apex_json.write('a',21);
apex_json.write('b',22);
apex_json.close_object;
apex_json.write('hello');
apex_json.write('world');
apex_json.close_all;
END;
效果如下:
{
"status_code": 0,
"err_msg": "null",
"voucher_num": "'1234','423432','43243','093423423'",
"data": [
{
"a": 2,
"b": 2
},
{
"a": 21,
"b": 22
},
"hello",
"world"
]
}
实例2:cursor嵌套打印
DECLARE
c sys_refcursor;
BEGIN
open c for select deptno,
dname,
cursor(select empno,
ename
from emp e
where e.deptno=d.deptno) emps
from dept d;
apex_json.open_object;
apex_json. write('departments', c);
apex_json.close_object;
END;
效果如下:
{ "departments":[
{"DEPTNO":10,
"DNAME":"ACCOUNTING",
"EMPS":[{"EMPNO":7839,"ENAME":"KING"}]},
...
,{"DEPTNO":40,"DNAME":"OPERATIONS","EMPS":null}] }