You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 07:20:41