如何修改Apex中的PL/SQL代码以支持多角色分配?
解决APEX多角色分配PL/SQL代码问题
问题背景
我有两段用于添加、编辑用户并分配角色的PL/SQL代码,目前仅支持单角色分配:
- 单角色时添加、编辑功能正常
- 尝试分配多角色时,提交报错No data was found.
原添加用户代码
begin APEX_CUSTOM_AUTH.SET_USER(:P7_USER_NAME); APEX_ACL.ADD_USER_ROLE ( p_application_id => 100, p_user_name => :P7_USER_NAME, p_role_static_id => :P7_USER_ROLE ); end;
原编辑用户代码
DECLARE l_as_user_any_role BOOLEAN := false; BEGIN l_as_user_any_role := APEX_ACL.HAS_USER_ANY_ROLES ( p_application_id => 100, p_user_name => :P7_USER_NAME); if l_as_user_any_role then APEX_ACL.REPLACE_USER_ROLES ( p_application_id => 100, p_user_name => :P7_USER_NAME, p_role_static_ids => wwv_flow_t_varchar2( :P7_USER_ROLE) ); end if; end;
问题原因
报错核心是:当:P7_USER_ROLE为多角色(比如逗号分隔的字符串)时,原代码直接将整个字符串作为单个角色ID传入API,导致APEX找不到对应角色,触发**No data was found.**错误。APEX的ACL相关API需要接收wwv_flow_t_varchar2类型的集合参数,而非拼接后的字符串。
修正后的代码
1. 添加用户(支持多角色)
使用APEX_ACL.ADD_USER_ROLES(复数形式),配合apex_string.split将多角色字符串拆分为集合:
begin APEX_CUSTOM_AUTH.SET_USER(:P7_USER_NAME); -- 将逗号分隔的角色字符串拆分为集合,传入多角色添加API APEX_ACL.ADD_USER_ROLES ( p_application_id => 100, p_user_name => :P7_USER_NAME, p_role_static_ids => apex_string.split(:P7_USER_ROLE, ',') -- 按逗号拆分角色,可根据实际分隔符调整 ); end;
2. 编辑用户(支持多角色)
同样需要将角色字符串拆分为集合,同时补充用户原本无角色的处理逻辑:
DECLARE l_as_user_any_role BOOLEAN := false; BEGIN l_as_user_any_role := APEX_ACL.HAS_USER_ANY_ROLES ( p_application_id => 100, p_user_name => :P7_USER_NAME); if l_as_user_any_role then APEX_ACL.REPLACE_USER_ROLES ( p_application_id => 100, p_user_name => :P7_USER_NAME, p_role_static_ids => apex_string.split(:P7_USER_ROLE, ',') -- 拆分多角色为集合 ); else -- 用户原本无角色,直接添加多角色 APEX_ACL.ADD_USER_ROLES ( p_application_id => 100, p_user_name => :P7_USER_NAME, p_role_static_ids => apex_string.split(:P7_USER_ROLE, ',') ); end if; end;
补充说明
- 确保
:P7_USER_ROLE的输入格式为逗号分隔的角色静态ID(比如ROLE_ADMIN,ROLE_EDITOR),如果使用其他分隔符,需调整apex_string.split的第二个参数。 - 编辑代码中补充了无角色用户的处理,避免遗漏新角色分配。
内容的提问来源于stack exchange,提问作者user5543283
相关产品推荐
相关产品推荐

