Oracle Apex 5.1与Oracle Fusion集成方法求助(无REST数据源菜单)
Oracle Apex 5.1 集成Oracle Fusion数据的替代方案(无需REST Data Sources)
Apex 5.1未提供REST Data Sources功能,可通过以下两种方案实现从Oracle Fusion获取数据并导入Apex表:
方案一:PL/SQL + UTL_HTTP + APEX_JSON 调用Fusion REST API
1. 配置数据库权限
先给Apex解析用户授予必要权限:
GRANT EXECUTE ON UTL_HTTP TO [你的Apex解析用户名]; -- 若访问HTTPS协议的Fusion API,需配置Wallet(生产环境)或临时禁用证书验证(仅测试用) BEGIN -- 生产环境配置Wallet UTL_HTTP.SET_WALLET('file:/path/to/your/wallet', 'wallet_password'); -- 测试环境临时禁用证书检查 -- UTL_HTTP.SET_DESTINATION_CONTROL(NULL, 'SSL_VERIFY_SERVER_CERTIFICATE', 'FALSE'); END; /
2. 编写PL/SQL同步代码
假设Fusion API返回JSON格式报表数据,示例代码如下:
DECLARE l_req UTL_HTTP.REQ; l_res UTL_HTTP.RESP; l_response_clob CLOB; l_buffer VARCHAR2(32767); BEGIN -- 初始化临时CLOB存储响应内容 DBMS_LOB.CREATETEMPORARY(l_response_clob, TRUE); -- 发起HTTP请求,替换为你的Fusion API地址和认证信息 l_req := UTL_HTTP.BEGIN_REQUEST('https://your-fusion-instance.com/api/reports/target-report', 'GET'); -- 配置认证头(示例为Basic Auth,若用OAuth2则替换为Bearer Token) UTL_HTTP.SET_HEADER(l_req, 'Authorization', 'Basic ' || UTL_ENCODE.BASE64_ENCODE(UTL_RAW.CAST_TO_RAW('fusion-username:fusion-password'))); -- 获取API响应 l_res := UTL_HTTP.GET_RESPONSE(l_req); -- 读取响应内容到CLOB LOOP UTL_HTTP.READ_TEXT(l_res, l_buffer, 32767); DBMS_LOB.WRITEAPPEND(l_response_clob, LENGTH(l_buffer), l_buffer); END LOOP; UTL_HTTP.END_RESPONSE(l_res); -- 解析JSON并插入Apex目标表 APEX_JSON.PARSE(l_response_clob); -- 假设JSON结构为 {"data": [{"id":1, "title":"xxx", "amount":100}, ...]} FOR i IN 1..APEX_JSON.GET_COUNT('data') LOOP INSERT INTO your_apex_target_table (id, title, amount) VALUES ( APEX_JSON.GET_NUMBER('data[%d].id', i), APEX_JSON.GET_STRING('data[%d].title', i), APEX_JSON.GET_NUMBER('data[%d].amount', i) ); END LOOP; COMMIT; DBMS_LOB.FREETEMPORARY(l_response_clob); EXCEPTION WHEN UTL_HTTP.END_OF_BODY THEN UTL_HTTP.END_RESPONSE(l_res); DBMS_LOB.FREETEMPORARY(l_response_clob); WHEN OTHERS THEN IF UTL_HTTP.RESPONSE_IS_OPEN(l_res) THEN UTL_HTTP.END_RESPONSE(l_res); END IF; DBMS_LOB.FREETEMPORARY(l_response_clob); RAISE; END; /
3. 在Apex中触发执行
- 将上述代码封装为数据库存储过程,通过Apex页面的按钮点击事件触发执行;
- 若需定期同步,可通过
DBMS_SCHEDULER创建定时作业自动运行。
方案二:数据库链接(DB Link)直接访问Fusion数据库
若Apex数据库具备Fusion数据库的访问权限,可通过DB Link直接查询Fusion报表表并同步数据。
1. 创建数据库链接
CREATE DATABASE LINK fusion_db_link CONNECT TO [fusion数据库用户名] IDENTIFIED BY [fusion数据库密码] USING '(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=fusion-db-host)(PORT=1521))(CONNECT_DATA=(SID=fusion-db-sid)))';
2. 同步数据
直接通过DB Link查询Fusion表并插入Apex目标表:
INSERT INTO your_apex_target_table (id, title, amount) SELECT id, title, amount FROM fusion_report_table@fusion_db_link WHERE report_date = TRUNC(SYSDATE); -- 按需添加数据过滤条件 COMMIT;
关键注意事项
- 认证适配:Fusion REST API若采用OAuth2认证,需额外编写PL/SQL过程获取并缓存Access Token;
- 格式兼容:若Fusion返回XML格式数据,可替换使用
APEX_XML包解析; - 性能优化:大数据量同步时,建议采用分批插入逻辑避免锁表;
- 权限校验:确保Apex数据库用户拥有执行
UTL_HTTP、创建DB Link及操作目标表的完整权限。
内容的提问来源于stack exchange,提问作者Henry Setiawan
相关产品推荐
相关产品推荐

