Oracle Apex中Rest Enabled SQL多数据库动态切换的会话关联方案问询
1. 为Rest Enabled SQL请求注入会话ID请求头
在Apex的Web Source Module配置中,直接在Request Headers区域添加自定义请求头(比如X-Session-ID),将值设为:APP_SESSION——Apex会自动将这个绑定变量替换为当前用户的会话ID,无需额外代码。
如果需要动态生成更复杂的头信息,可在页面的Before Process或Web Source的Pre-Processing阶段执行PL/SQL代码,手动设置请求头:
apex_web_service.set_request_header( p_name => 'X-Session-ID', p_value => :APP_SESSION, p_reset => false );
注意要确保Rest Enabled SQL端点的ACL配置允许接收自定义请求头。
2. 为Rest Enabled SQL数据源定义动态查询参数
在Web Source的Parameters配置区,添加动态参数:
- 参数名自定义(比如
target_db) - 参数类型选择Session State
- 参数值绑定到用户选择数据库的页面项(比如
:P1_SELECTED_DB)
随后在Rest Enabled SQL的查询语句中直接引用该绑定参数,例如:
SELECT * FROM your_table WHERE db_identifier = :target_db
如果是需要根据参数切换数据源端点,可将Web Source的URL设置为动态表达式,比如:
https://&P1_SELECTED_DB_ENDPOINT./ords/rest/sql/
这里P1_SELECTED_DB_ENDPOINT是存储用户选中数据库Rest端点的页面项,Apex会在请求发送前自动替换该变量。
3. 基于会话重写Rest Enabled SQL数据源定义
通过PL/SQL动态修改当前会话的Web Source属性,可在用户切换数据库时(比如页面提交事件的进程中)执行以下代码:
DECLARE l_headers apex_web_service.t_header_list; BEGIN -- 构造自定义请求头(含会话ID) l_headers(1).name := 'X-Session-ID'; l_headers(1).value := :APP_SESSION; -- 更新Web Source的端点URL和请求头 apex_web_source.update_web_source( p_application_id => :APP_ID, p_web_source_name => 'MY_REST_SQL_SOURCE', p_url => 'https://' || :P1_SELECTED_DB_ENDPOINT || '/ords/rest/sql/', p_headers => l_headers ); END;
将这段代码放在Before Header或页面提交后的进程中,确保在页面加载/数据请求前完成数据源定义的更新。另外,也可使用Application Item存储当前数据源的配置信息,在Web Source定义中通过替换字符串引用,避免每次手动调用更新API。
关于初始化代码无效的说明
Rest Enabled SQL定义中的初始化代码是在API请求发送到数据库后执行的,无法影响请求本身的构建(比如请求头、参数),因此必须在请求构建阶段(页面进程、Web Source预处理)完成会话信息的注入或数据源的动态配置。
内容的提问来源于stack exchange,提问作者Greg Reynolds

