【问题】新增应该输出提示但是出现乱码
查看会话发现是会话已结束,好家伙
重新登录会话依旧新增失败,
原来是提交的项没添加ORZ
【问题】会话保护
将会话保护改为“无限制”
执行修改提交但是一直在加载中,回滚后执行直接跳出来“未找到驱动程序类 'com.intellij.database.run.ReservedCellValue (no security manager: RMI class loader disabled)'”
后来挨个添加又好了,怪了
【问题】role_name is not defined role_name未被定义
【问题解决】回到全局变量声明,定义了role_name
获取不到对应的项值
后来换了新增sql语句就好了
提示
-
【问题】会话状态保护违规: 这可能是因为手动变更了受保护的页项 P3_OPERATION_TYPE。如果您不确定导致此错误的原因, 请与应用程序管理员联系, 以获取帮助。
控制台查看元素,发现是正常传参
获取到对应参数但是无法跳转到修改页面
【问题解决】试试看,将'受保护的值'关闭
果然可以了
【问题】权限控制加入后页面菜单展示失效
【问题原因】归根到底是判断函数判断的USER_ID,但是表中存的是USER_GROUP_ID![](https://i-blog.csdnimg.cn/blog_migrate/8331c2be80d5a0f1ed573400cef222b0.png)
好消息,通过改写登陆后存储过程,成功获取到应用程序项内容
create procedure LOGIN_SUCCESS_SAVE_USER_PRO
as
--登录验证后,保存用户基本信息与系统默认信息
v_userid number(20); --用户id(自增得到)
v_ext_userid number(20); --用户id(与中台一致)
v_name varchar2(20);--用户名
v_job_number varchar2(20);
v_mobile varchar2(15);
v_tenant_id varchar2(10);
v_err_msg VARCHAR2(2000);
v_roleid number(20);--角色id
v_rolename VARCHAR2(100);--角色名
v_usergroupid number(20);--用户组id
v_usergroupname VARCHAR2(100);--用户组名
begin
-- 用户基本信息
select USER_ID, --用户id(自增得到)
DING_USER_ID,--用户id(与中台一致)
NAME,
JOB_NUMBER,
MOBILE,
TENANT_ID
into
v_userid,v_ext_userid,v_name,v_job_number,v_mobile,v_tenant_id
from JA_USER
where DEL_FLAG = 0
and JOB_NUMBER = upper(V('USER_NAME'))
and TENANT_ID = 1;
-- 获取当前角色id名称以及用户组id名称
select ROLE_ID, ROLE_NAME, USER_GROUP_ID, NAME
into v_roleid,v_rolename,v_usergroupid,v_usergroupname
from (select r.ROLE_ID, r.ROLE_NAME, ug.USER_GROUP_ID, ug.NAME
from JA_USER_GROUP_ROLE ugr
left join JA_ROLE r on r.ROLE_ID = ugr.ROLE_ID and r.TENANT_ID = ugr.TENANT_ID
and r.DEL_FLAG = 0 and r.IS_ENABLE = 1
left join JA_USER_GROUP ug on ug.USER_GROUP_ID = ugr.USER_GROUP_ID and ug.TENANT_ID = ugr.TENANT_ID
and ug.DEL_FLAG = 0
left join JA_USER_GROUP_DETAILS ugd
on ugd.USER_GROUP_ID = ugr.USER_GROUP_ID and ugd.TENANT_ID = ugr.TENANT_ID
and ugd.DEL_FLAG = 0
where ugr.DEL_FLAG = 0
and ugr.TENANT_ID = v_tenant_id
and ugd.USER_ID = v_userid
and ugr.IS_ENABLE = 1
);
apex_custom_auth.set_user(v_name);
-- USER_PAGE_ID 设置用户登录成功后的主页
apex_util.set_session_state('USER_ID', v_userid);
apex_util.set_session_state('USER_TENANT', v_tenant_id);
apex_util.set_session_state('USER_NAME', v_name);
apex_util.set_session_state('USER_JOB_NUMBER', v_job_number);
apex_util.set_session_state('USER_MOBILE', v_mobile);
apex_util.set_session_state('APP_ENV', 'DEV');
apex_util.set_session_state('ROLE_ID', v_roleid);
apex_util.set_session_state('ROLE_NAME', v_rolename);
apex_util.set_session_state('USER_GROUP_ID', v_usergroupid);
apex_util.set_session_state('USER_GROUP_NAME', v_usergroupname);
apex_util.set_session_state('EXT_USER_ID', v_ext_userid);
exception
when others then
v_err_msg := sqlerrm || chr(13) || dbms_utility.format_error_backtrace;
JA_WRITE_LOG(JA_UTILS_PKG.GET_FN_NAME(), 'error', v_err_msg, -1, -1, V('APP_NAME') || ':' || V('APP_ID'));
end ;
/
坏消息是页面没有按角色权限划分
应该是权限判断函数的问题
将SQL单独拿出来运行
返回值大于0,上面写错了,是等于1.大于0,返回true
我好像知道是怎么个事儿了
将参数改正确过来以后就可以展示了
【问题】ORA-01789: 查询块具有不正确的结果列数
【问题原因】
在将两条查询语句拼接成一条查询语句时需要使用 UNION 函数
然后使用 UNION 是需要注意两条查询语句SELECT与FROM之间的字段名称是否数量一致并且顺序相同
原来是我缺了字段URL
更新前
页项状态:已插入
实际上什么也没变,是因为所有页面已经存在了吗?
重新改写了修改PL/SQL语句,可以修改了,点击修改后,用户工号和其他信息修改了,name回显还是原来的
2.0 用户组用户新增出错
-- p7 用户组新增用户(备份)
DECLARE
V_ERR_MSG NVARCHAR2(2000);
V_NAME_COUNT NUMBER(10) := 0;
V_ROW_COUNT NUMBER(10) := 0;
/**
* CREATE BY: DUL
* CREATE DATE: 2023/12/22 14:58
* MODIFY BY:
* MODIFY DATE:
* DESCRIBE: 新增用户组
*/
BEGIN
-- 验证是否存在重复名称
SELECT COUNT(USER_GROUP_ID)
INTO V_NAME_COUNT
FROM JA_USER_GROUP
WHERE NAME = :P7_NAME
AND DEL_FLAG = 0
AND TENANT_ID = :USER_TENANT;
IF V_NAME_COUNT > 0 THEN
V_ROW_COUNT := -2;
ELSE
-- 新增操作
INSERT INTO JA_USER_GROUP(NAME, REMARK, CREATED_BY,TENANT_ID) VALUES (:P7_NAME, :P7_REMARK, :USER_ID,:USER_TENANT);
V_ROW_COUNT := SQL%ROWCOUNT;
END IF;
APEX_UTIL.SET_SESSION_STATE('P7_ROW_COUNT', V_ROW_COUNT);
EXCEPTION
WHEN OTHERS THEN
ROLLBACK;
V_ERR_MSG := SQLERRM || CHR(13) || DBMS_UTILITY.FORMAT_ERROR_BACKTRACE;
--写入异常日志
JA_WRITE_LOG('P' || :APP_PAGE_ID || '-系统设置-用户组-新增', 'ERROR', V_ERR_MSG, :USER_ID, :USER_TENANT,:APP_NAME || ':' || :APP_ID);
APEX_UTIL.SET_SESSION_STATE('P7_ROW_COUNT', -1);
END ;
DECLARE
V_ERR_MSG NVARCHAR2(2000);
V_NAME_COUNT NUMBER(10) := 0;
V_ROW_COUNT NUMBER(10) := 0;
V_USER_COUNT NUMBER(10) := 0;
/**
* CREATE BY: DUL
* CREATE DATE: 2023/12/22 14:58
* MODIFY BY: wxx
* MODIFY DATE:2024/1/12 15:10
* DESCRIBE:p7 新增用户组管理
*/
BEGIN
-- 验证是否存在重复用户组名称
SELECT COUNT(USER_GROUP_ID)
INTO V_NAME_COUNT
FROM JA_USER_GROUP
WHERE NAME = :P7_NAME
AND DEL_FLAG = 0
AND TENANT_ID = :USER_TENANT;
IF V_NAME_COUNT > 0 THEN --名称已被使用
V_ROW_COUNT := -2;
ELSE --名称未被使用
-- 新增用户组操作
INSERT INTO JA_USER_GROUP(NAME, REMARK, CREATED_BY,TENANT_ID)
VALUES (:P7_NAME, :P7_REMARK, :USER_ID,:USER_TENANT);
V_ROW_COUNT := SQL%ROWCOUNT;
--校验用户是否重复
select count(JOB_NUMBER)
into v_user_count
from JA_USER
where TENANT_ID = :USER_TENANT
and DEL_FLAG = 0
and IS_LEAVE = 0
and EXT_USER_ID = JA_UTILS_PKG.SPLIT_STR(:P7_USER_ID,':');
if v_user_count = 0 then --不重复,执行新增
INSERT INTO JA_USER(NAME,MOBILE,JOB_NUMBER,PASSWORD,EMAIL,EXT_USER_ID,
UNION_ID,IS_LEAVE,REMARK,DEL_FLAG,TENANT_ID,CREATED_BY,CREATED_DATE)
SELECT NAME,MOBILE,JOB_NUMBER,JA_UTILS_PKG.ENCRYPT_ENC_AES256('Ja@123456'),
EMAIL,USER_ID,UNION_ID,IS_LEAVE,'',0, :USER_TENANT,:EXT_USER_ID, sysdate
FROM MPF.SHARE_BASIC_USER_V
where USER_ID = JA_UTILS_PKG.SPLIT_STR(:P7_USER_ID,':');
v_row_count := V_ROW_COUNT + SQL%ROWCOUNT;
else --用户重复
v_row_count := -3;
end if;
END IF;
APEX_UTIL.SET_SESSION_STATE('P7_ROW_COUNT', V_ROW_COUNT);
EXCEPTION
WHEN OTHERS THEN
ROLLBACK;
V_ERR_MSG := SQLERRM || CHR(13) || DBMS_UTILITY.FORMAT_ERROR_BACKTRACE;
--写入异常日志
JA_WRITE_LOG('P' || :APP_PAGE_ID || '-系统设置-用户组-新增', 'ERROR', V_ERR_MSG, :USER_ID, :USER_TENANT,:APP_NAME || ':' || :APP_ID);
APEX_UTIL.SET_SESSION_STATE('P7_ROW_COUNT', -1);
END ;
想展示数据记录内容,写了对应视图想展示,但是报错
【问题】 ORA-00932: 数据类型不一致: 应为 -, 但却获得 CLOB
【问题原因】:Oracle的sql中的使用函数返回的值的字段没有对应的类型,只是一段文本。所以在使用该字段关联的时候就会报错。
【解决办法】使用to_char()方法将文本转成字符串类型即可。
修改前:
修改后:
已解决:ORA-00932:数据类型不一致:应为-,但却获得CLOB_oracle_good_good_xiu-华为云开发者联盟 (csdn.net)
【问题】出现修改时回显总是同样的内容且还不是对应的数据内容问题,后来在前辈的帮助下找到原因,该字段源来自SQL查询结果,且不同情况下对应不同选择,如图所示:
小结:
-
当高速缓存清空时使用“仅当会话状态中的当前值为空时”
- 当高速缓存不清空时使用“始终替换会话状态中的任何现有值”
【问题解决】解决了在用户组新增用户重复新增的问题,直接在新增前筛选用户做用户去重处理即可
select distinct NAME || '-' || JOB_NUMBER, USER_ID
from MPF.SHARE_BASIC_USER_V A
where A.TENANT_ID = :USER_TENANT
and A.IS_LEAVE = 0
and not exists(
-- 去重处理
select 1
from JA_USER U
where U.DEL_FLAG = 0
and U.EXT_USER_ID = A.USER_ID
and U.TENANT_ID = A.TENANT_ID)
UNION ALL
SELECT A.NAME || '-' || A.JOB_NUMBER USER_NAME, A.USER_ID
FROM MPF.SHARE_BASIC_USER_V A
where USER_ID =(select DATA_VAL from JA_UTILS_PKG.SPLIT_STR(:P12_USER_GROUP_ID,','))
;
这样多选下拉列表就不会出现已有用户了。
【问题解决】解决新增时获取主表id 的问题,将新增生成的id存储在变量值中,需要的时候直接添加即可
returning TEMPLATE_ID into V_TEMPLATE_ID;
设置应用主页的方法
共享组件-用户界面属性-属性-将页码修改为想要设置的主页页码即可
【小疑问】
select USER_ID
from MPF.SHARE_BASIC_USER_V
where USER_ID in (
select DATA_VAL
from JA_UTILS_PKG.SPLIT_STR(:P19_EXT_USER_ID, ',')
--选中的是冒号分隔(?APEX与浏览器的不同?)
)
好像知道是怎么回事了
系统设置
权限管理
create function is_have_permission(p_user_id in number, p_page_id in number, p_role_id in number,
p_tenant_id in number, p_type in varchar2)
return boolean
is
v_is_have number(10);
/**
* create by: wxx
* create date:2023/12/29 13:49
* modify by:
* modify date:
* describe:验证是否有页面展示权限
*/
begin
select count(p.PAGE_ID)
into v_is_have
from JA_USER_GROUP_ROLE UR
left join JA_ROLE_PERMISSION RP
on RP.ROLE_ID = UR.ROLE_ID and RP.TENANT_ID = UR.TENANT_ID and
RP.ROLE_ID = p_role_id
left join JA_PERMISSION p
on RP.PERMISSION_ID = P.PERMISSION_ID and p.TENANT_ID = RP.TENANT_ID
and p.DEL_FLAG = 0 and p.PERMISSION_TYPE = p_type
-- and p.TYPE = to_nchar(p_type)
left join JA_USER_GROUP_DETAILS GD
on GD.USER_GROUP_ID = UR.USER_GROUP_ID and GD.TENANT_ID = UR.TENANT_ID
and GD.DEL_FLAG = 0
left join JA_USER U on GD.USER_ID = U.USER_ID and U.TENANT_ID = UR.TENANT_ID
and U.DEL_FLAG = 0
where UR.TENANT_ID = p_tenant_id
and U.EXT_USER_ID = p_user_id
and p.PAGE_ID = p_page_id;
if v_is_have > 0 then
return true;
else
return false;
end if;
exception
when others then
return false;
end;
/