【开发问题&问题解决&开发小技巧】通用资源管理01

【问题】新增应该输出提示但是出现乱码

【开发问题&问题解决&开发小技巧】通用资源管理01_第1张图片

查看会话发现是会话已结束,好家伙

重新登录会话依旧新增失败,

【开发问题&问题解决&开发小技巧】通用资源管理01_第2张图片

【开发问题&问题解决&开发小技巧】通用资源管理01_第3张图片

原来是提交的项没添加ORZ

【问题】会话保护

【开发问题&问题解决&开发小技巧】通用资源管理01_第4张图片

将会话保护改为“无限制”

【开发问题&问题解决&开发小技巧】通用资源管理01_第5张图片

执行修改提交但是一直在加载中,回滚后执行直接跳出来“未找到驱动程序类 'com.intellij.database.run.ReservedCellValue (no security manager: RMI class loader disabled)'”

【开发问题&问题解决&开发小技巧】通用资源管理01_第6张图片

后来挨个添加又好了,怪了

【开发问题&问题解决&开发小技巧】通用资源管理01_第7张图片

【问题】role_name is not defined   role_name未被定义

【开发问题&问题解决&开发小技巧】通用资源管理01_第8张图片

【问题解决】回到全局变量声明,定义了role_name

【开发问题&问题解决&开发小技巧】通用资源管理01_第9张图片

获取不到对应的项值【开发问题&问题解决&开发小技巧】通用资源管理01_第10张图片

后来换了新增sql语句就好了

提示

  • 【问题】会话状态保护违规: 这可能是因为手动变更了受保护的页项 P3_OPERATION_TYPE。如果您不确定导致此错误的原因, 请与应用程序管理员联系, 以获取帮助。

【开发问题&问题解决&开发小技巧】通用资源管理01_第11张图片

控制台查看元素,发现是正常传参【开发问题&问题解决&开发小技巧】通用资源管理01_第12张图片

获取到对应参数但是无法跳转到修改页面

【开发问题&问题解决&开发小技巧】通用资源管理01_第13张图片

【问题解决】试试看,将'受保护的值'关闭

【开发问题&问题解决&开发小技巧】通用资源管理01_第14张图片

果然可以了【开发问题&问题解决&开发小技巧】通用资源管理01_第15张图片

【问题】权限控制加入后页面菜单展示失效

【问题原因】归根到底是判断函数判断的USER_ID,但是表中存的是USER_GROUP_ID【开发问题&问题解决&开发小技巧】通用资源管理01_第16张图片

好消息,通过改写登陆后存储过程,成功获取到应用程序项内容

【开发问题&问题解决&开发小技巧】通用资源管理01_第17张图片

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 ;
/

坏消息是页面没有按角色权限划分

【开发问题&问题解决&开发小技巧】通用资源管理01_第18张图片

应该是权限判断函数的问题

将SQL单独拿出来运行

【开发问题&问题解决&开发小技巧】通用资源管理01_第19张图片

返回值大于0,上面写错了,是等于1.大于0,返回true

我好像知道是怎么个事儿了【开发问题&问题解决&开发小技巧】通用资源管理01_第20张图片

将参数改正确过来以后就可以展示了

【开发问题&问题解决&开发小技巧】通用资源管理01_第21张图片

【问题】ORA-01789: 查询块具有不正确的结果列数

【开发问题&问题解决&开发小技巧】通用资源管理01_第22张图片

【问题原因】

在将两条查询语句拼接成一条查询语句时需要使用  UNION  函数

然后使用 UNION  是需要注意两条查询语句SELECTFROM之间的字段名称是否数量一致并且顺序相同 

原来是我缺了字段URL

【开发问题&问题解决&开发小技巧】通用资源管理01_第23张图片

更新前【开发问题&问题解决&开发小技巧】通用资源管理01_第24张图片

页项状态:已插入

【开发问题&问题解决&开发小技巧】通用资源管理01_第25张图片

实际上什么也没变,是因为所有页面已经存在了吗?

重新改写了修改PL/SQL语句,可以修改了,点击修改后,用户工号和其他信息修改了,name回显还是原来的

【开发问题&问题解决&开发小技巧】通用资源管理01_第26张图片

2.0 用户组用户新增出错【开发问题&问题解决&开发小技巧】通用资源管理01_第27张图片

-- 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()方法将文本转成字符串类型即可。

修改前:【开发问题&问题解决&开发小技巧】通用资源管理01_第28张图片

修改后:

【开发问题&问题解决&开发小技巧】通用资源管理01_第29张图片

已解决:ORA-00932:数据类型不一致:应为-,但却获得CLOB_oracle_good_good_xiu-华为云开发者联盟 (csdn.net)

【问题】出现修改时回显总是同样的内容且还不是对应的数据内容问题,后来在前辈的帮助下找到原因,该字段源来自SQL查询结果,且不同情况下对应不同选择,如图所示:

【开发问题&问题解决&开发小技巧】通用资源管理01_第30张图片

小结:

  • 当高速缓存清空时使用“仅当会话状态中的当前值为空时”
  • 当高速缓存不清空时使用“始终替换会话状态中的任何现有值”

【问题解决】解决了在用户组新增用户重复新增的问题,直接在新增前筛选用户做用户去重处理即可

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;

设置应用主页的方法

共享组件-用户界面属性-属性-将页码修改为想要设置的主页页码即可

【开发问题&问题解决&开发小技巧】通用资源管理01_第31张图片【开发问题&问题解决&开发小技巧】通用资源管理01_第32张图片

【小疑问】

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与浏览器的不同?)
                  )

好像知道是怎么回事了

【开发问题&问题解决&开发小技巧】通用资源管理01_第33张图片

系统设置

【开发问题&问题解决&开发小技巧】通用资源管理01_第34张图片

权限管理

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;
/

你可能感兴趣的:(PL/SQL,oracle,apex,oracle,数据库,sql,oracle)