apex和pl/sql学习记录2

这篇具有很好参考价值的文章主要介绍了apex和pl/sql学习记录2。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

验证后过程函数代码插眼儿

--     登录后验证过程3
create or replace PROCEDURE TEST_USER_WXX3_PRO AS
    V_USER_ID    NUMBER(20);
    V_ROLE_ID    NUMBER(20);
    V_PERM_ID    NUMBER(20);
    V_DEPT_ID    NUMBER(20);
    V_USER_NAME     	NVARCHAR2(64);
    V_JOB_NUMBER 	NVARCHAR2(32);
    V_MOBILE    NVARCHAR2(32);
    V_EMAIL     NVARCHAR2(32);
    V_COUNT     NUMBER(10);
    V_ID        NUMBER(10);
    V_DEPT_NAME NVARCHAR2(64);
    V_PAGE_ID NUMBER(20);

begin
    -- 获取用户基础信息
      SELECT DEPT_ID,
             ROLE_ID,
             PERM_ID,
             USER_ID,
             USER_NAME,
             JOB_NUMBER,
             MOBILE,
             EMAIL
    INTO V_DEPT_ID,V_ROLE_ID,V_PERM_ID,V_USER_ID, V_USER_NAME, V_JOB_NUMBER, V_MOBILE, V_EMAIL
    FROM  TEST_USER_WXX_V
  where USER_NAME = upper(V('P9999_USERNAME'));

     -- 获取用户角色权限
SELECT COUNT(1)
    INTO V_COUNT
    FROM TEST_USER_WXX_V A
             LEFT JOIN TEST_ROLE_PERM_WXX_V B
                       ON A.ROLE_ID = B.ROLE_ID
    WHERE A.USER_ID = V_USER_ID;


    SELECT nvl(max(ROLE_ID), 0), nvl(max(PERM_ID), 0)
    INTO V_ID, V_PAGE_ID
    FROM TEST_ROLE_PERM_WXX_V
    WHERE IS_ENABLE = 1;

    IF V_COUNT > 0 THEN
        SELECT A.ROLE_ID, B.PERM_ID
        INTO V_ID, V_PAGE_ID
        FROM ROLE_USER_TEST_WXX A
                 LEFT JOIN TEST_ROLE_PERM_WXX_V B
                           ON A.ROLE_ID = B.ROLE_ID
        WHERE A.USER_ID = V_USER_ID
          AND ROWNUM = 1;
    ELSE
        INSERT INTO ROLE_USER_TEST_WXX (USER_ID, ROLE_ID) VALUES (V_USER_ID, V_ID);
        COMMIT;
    END IF;
 -- 设置USER
    APEX_CUSTOM_AUTH.SET_USER(V_USER_NAME);

 -- 将用户登入录信息注入session state
    APEX_UTIL.SET_SESSION_STATE('ROLE_ID', V_ID);
    APEX_UTIL.SET_SESSION_STATE('DEPT_ID', V_DEPT_ID);
    APEX_UTIL.SET_SESSION_STATE('USER_NAME', V_USER_NAME);
    APEX_UTIL.SET_SESSION_STATE('JOB_NUMBER', V_JOB_NUMBER);
    APEX_UTIL.SET_SESSION_STATE('MOBILE', V_MOBILE);
    APEX_UTIL.SET_SESSION_STATE('MAIL', V_EMAIL);
    APEX_UTIL.SET_SESSION_STATE('USER_ID', V_USER_ID);
    APEX_UTIL.SET_SESSION_STATE('DEPT_NAME', V_DEPT_NAME);
--     APEX_UTIL.SET_SESSION_STATE('USERID', V_USERID);
END;
/

到角色范例去看

发现里边的列(创建/更新者、创建/更新时间)的默认值都是从数据库pl/sql表达式获取

apex和pl/sql学习记录2,oracle apex,PL/SQL,错误记录,sql,oracle,apex,pl/sql

apex和pl/sql学习记录2,oracle apex,PL/SQL,错误记录,sql,oracle,apex,pl/sql

 或许是该重新建一个新的了

【小改进】

将之前更新日期从可见变成不可见,方法如下所示↓

改之前 

apex和pl/sql学习记录2,oracle apex,PL/SQL,错误记录,sql,oracle,apex,pl/sql

改之后

默认值由“-选择-”变成“表达式”,语言  pl/sql,表达式 sysdate,重复复制现有值 打开

apex和pl/sql学习记录2,oracle apex,PL/SQL,错误记录,sql,oracle,apex,pl/sql

隐藏 之前

apex和pl/sql学习记录2,oracle apex,PL/SQL,错误记录,sql,oracle,apex,pl/sql

隐藏之后

apex和pl/sql学习记录2,oracle apex,PL/SQL,错误记录,sql,oracle,apex,pl/sql

 参考学习:

09技术太卷我学APEX-定制页面及导航菜单权限_白龙马5217的博客-CSDN博客https://blog.csdn.net/html5builder/article/details/128816236?spm=1001.2014.3001.5501

全新的开始

1.数据库表设计

需要创建4个系统表,保存用户、角色及页面之间的关系。

  • 角色表(角色ID,角色名称)
  • 角色页面表(角色ID,页面ID)
  • 用户表(用户ID,用户姓名,密码)
  • 用户角色表(用户ID,角色ID)
-- 全新的数据表 新的开始
--角色表
CREATE TABLE  "SYS_ROLE_WXX"
   (	"P_ID" NUMBER(18,0) NOT NULL ENABLE,
	"ROLE_NAME" VARCHAR2(18) NOT NULL ENABLE,
	"S_NOTE" VARCHAR2(64),
	 CONSTRAINT "SYS_ROLE_PK" PRIMARY KEY ("P_ID")
  USING INDEX  ENABLE,
	 CONSTRAINT "SYS_ROLE_NAME" UNIQUE ("ROLE_NAME")
  USING INDEX  ENABLE
   );

drop table SYS_ROLE_WXX;
select * from SYS_ROLE_WXX;

--角色页面表
CREATE TABLE  "SYS_ROLE_PAGE_WXX"
   (	"P_ID" NUMBER(18,0) NOT NULL ENABLE,
	"ROLE_NAME" VARCHAR2(18) NOT NULL ENABLE,
	"PAGE_ID" NUMBER(18,0) NOT NULL ENABLE,
	"S_NOTE" VARCHAR2(64),
	 CONSTRAINT "SYS_ROLE_PAGE_PK" PRIMARY KEY ("P_ID")
  USING INDEX  ENABLE,
	 CONSTRAINT "SYS_ROLE_PAGE_UK1" UNIQUE ("ROLE_NAME", "PAGE_ID")
  USING INDEX  ENABLE
   );

--用户表
CREATE TABLE  "SYS_USER_WXX"
   (	"P_ID" NUMBER(18,0) NOT NULL ENABLE,
	"USER_NAME" VARCHAR2(18) NOT NULL ENABLE,
	"PASS_WORD" VARCHAR2(18) NOT NULL ENABLE,
	"DEPT_NAME" VARCHAR2(18),
	"S_MOBILE" VARCHAR2(18),
	"S_EMAIL" NVARCHAR2(64),
	"NICK_NAME" VARCHAR2(18),
	 CONSTRAINT "SYS_USER_PK" PRIMARY KEY ("P_ID")
  USING INDEX  ENABLE,
	 CONSTRAINT "SYS_USER_UK1_USER_NAME" UNIQUE ("USER_NAME")
  USING INDEX  ENABLE,
	 CONSTRAINT "SYS_USER_UK2_S_MOBILE" UNIQUE ("S_MOBILE")
  USING INDEX  ENABLE,
	 CONSTRAINT "SYS_USER_UK3_S_EMAIL" UNIQUE ("S_EMAIL")
  USING INDEX  ENABLE
   );

--用户角色表
CREATE TABLE  "SYS_USER_ROLE_WXX"
   (	"P_ID" NUMBER(17,0) NOT NULL ENABLE,
	"USER_NAME" VARCHAR2(17) NOT NULL ENABLE,
	"ROLE_NAME" VARCHAR2(17) NOT NULL ENABLE,
	"S_NOTE" VARCHAR2(52),
	 CONSTRAINT "SYS_USER_ROLE_PK" PRIMARY KEY ("P_ID")
  USING INDEX  ENABLE,
	 CONSTRAINT "SYS_USER_ROLE_UK1" UNIQUE ("USER_NAME", "ROLE_NAME")
  USING INDEX  ENABLE
   );

2.创建五个管理页面

2.1 角色role

交互网格带编辑

apex和pl/sql学习记录2,oracle apex,PL/SQL,错误记录,sql,oracle,apex,pl/sql

2.2角色页面管理

2.2.1交互网格带编辑,同上
2.2.2创建角色值列表

select role_name from sys_role_wxx

apex和pl/sql学习记录2,oracle apex,PL/SQL,错误记录,sql,oracle,apex,pl/sql

2.2.3 创建页面值列表 ​​​​apex和pl/sql学习记录2,oracle apex,PL/SQL,错误记录,sql,oracle,apex,pl/sql

 这里用到了APEX的视图APEX_APPLICATION_PAGES

select t.page_alias,t.page_id,t.page_name,t.page_title,t.page_mode,t.page_function
from APEX_APPLICATION_PAGES t 
where application_id = :APP_ID

apex和pl/sql学习记录2,oracle apex,PL/SQL,错误记录,sql,oracle,apex,pl/sql

两个值列表(角色、页面)配置到角色和页面ID列。

2.3 用户user管理

交互式网格+表单(这里我一起创建,事实证明是错的,后来删了重新创建,p44)

apex和pl/sql学习记录2,oracle apex,PL/SQL,错误记录,sql,oracle,apex,pl/sql

 apex和pl/sql学习记录2,oracle apex,PL/SQL,错误记录,sql,oracle,apex,pl/sql

 apex和pl/sql学习记录2,oracle apex,PL/SQL,错误记录,sql,oracle,apex,pl/sql

2.4 用户角色管理

2.4.1交互式网格加编辑apex和pl/sql学习记录2,oracle apex,PL/SQL,错误记录,sql,oracle,apex,pl/sql
2.4.2创建用户值列表

select user_name from sys_user_wxx apex和pl/sql学习记录2,oracle apex,PL/SQL,错误记录,sql,oracle,apex,pl/sql

用户和角色值列表配置到用户和角色。

apex和pl/sql学习记录2,oracle apex,PL/SQL,错误记录,sql,oracle,apex,pl/sql

2.5 系统管理

apex和pl/sql学习记录2,oracle apex,PL/SQL,错误记录,sql,oracle,apex,pl/sql

以上4个页面做一个系统管理导航卡列表 系统管理_导航Card

创建导航卡 “系统管理_导航卡_Demo”_王小小鸭的博客-CSDN博客https://blog.csdn.net/clover_oreo/article/details/132473008?spm=1001.2014.3001.5502apex和pl/sql学习记录2,oracle apex,PL/SQL,错误记录,sql,oracle,apex,pl/sql

 apex和pl/sql学习记录2,oracle apex,PL/SQL,错误记录,sql,oracle,apex,pl/sql

 apex和pl/sql学习记录2,oracle apex,PL/SQL,错误记录,sql,oracle,apex,pl/sql

3 创建授权方案

3.1 创建一个授权控制函数F_CONTROL2

apex和pl/sql学习记录2,oracle apex,PL/SQL,错误记录,sql,oracle,apex,pl/sql

 3.1.1先建视图 :用户/页面/角色视图 sys_user_role_page_wxx_v
-- 用户 页面 角色视图 sys_user_role_page_wxx_v
create view SYS_USER_ROLE_PAGE_WXX_V as
select distinct UR.P_ID AS USER_ROLE_ID,
                UR.USER_NAME AS USER_NAME,
                UR.ROLE_NAME AS ROLE_NAME,
                UR.S_NOTE AS USER_ROLE_NOTE,
                U.P_ID AS USER_ID,
                PASS_WORD,
                DEPT_NAME,
                S_MOBILE,
                S_EMAIL,
                NICK_NAME,
                R.P_ID AS ROLE_ID,
                R.S_NOTE AS ROLE_NOTE,
                RP.P_ID AS ROLE_PAGE_ID,
                PAGE_ID,
                RP.S_NOTE AS ROLE_PAGE_NOTE
from SYS_USER_ROLE_WXX UR
    LEFT JOIN SYS_USER_WXX U on U.USER_NAME = UR.USER_NAME
    LEFT JOIN SYS_ROLE_WXX R on R.ROLE_NAME = UR.ROLE_NAME
    LEFT JOIN SYS_ROLE_PAGE_WXX RP on RP.ROLE_NAME = UR.ROLE_NAME;
3.3.2然后是授权控制函数 F_CONTROL2
create or replace function "F_CONTROL2"
(p_username in VARCHAR2,
 p_pageid in number)
return boolean
is
    b_ret boolean :=false;
    c_1 number;
begin
    select count(1) into c_1 from sys_user_role_page_wxx_v
        where user_name = p_username and page_id = p_pageid;
    if (c_1 >= 1) then 
        b_ret := true;
    else
        b_ret := false;
    end if;   
    return b_ret;
   
    exception when others then
        return false; 
end;

apex和pl/sql学习记录2,oracle apex,PL/SQL,错误记录,sql,oracle,apex,pl/sql

 3.2 创建授权方案 用户角色页面

apex和pl/sql学习记录2,oracle apex,PL/SQL,错误记录,sql,oracle,apex,pl/sql

名称:随便自己输入
方案类型:返回布尔值的PL/SQL函数
PL/SQL函数体:传入当前登录用户和当前页面
求值点:每次页访问一次

4 页面授权控制

设置需求授权的页面设置安全性如下图:

apex和pl/sql学习记录2,oracle apex,PL/SQL,错误记录,sql,oracle,apex,pl/sql

 这样设置后,就是直接在IP地址栏输入页面也需求授权许可。

需要授权的都设置上授权方案:
选中页→安全性→授权方案 “用户角色页面”

其他页面都是上述操作

apex和pl/sql学习记录2,oracle apex,PL/SQL,错误记录,sql,oracle,apex,pl/sql

5 导航授权控制

设计是这样没有,根据登录帐户,没有授权的页面链接就不在导航菜单上显示了。目前为静态导航菜单,需要引用静态导航菜单的数据创建一个动态的导航菜单。

5.1 创建静态导航菜单的视图

创建失败apex和pl/sql学习记录2,oracle apex,PL/SQL,错误记录,sql,oracle,apex,pl/sql

 在DataGrip上创建成功,查询结果如下

apex和pl/sql学习记录2,oracle apex,PL/SQL,错误记录,sql,oracle,apex,pl/sql

 这里用到APEX的系统视图,代码如下:

CREATE OR REPLACE FORCE EDITIONABLE VIEW "MENU_WXX_V" ("PARENT_ENTRY_TEXT", "DISPLAY_SEQUENCE", "ENTRY_TEXT", "PAGE_ID", "ENTRY_TARGET") AS 
  select parent_entry_text,display_sequence,entry_text,regexp_replace(entry_target,'[^0-9]') as page_id,entry_target
    --这里用到Oracle的正则表达式替换函数提取出目标的页面id:regexp_replace(entry_target,‘[^0-9]’) as page_id
from apex_application_list_entries t
where application_id = 273
--and list_id = 38247996304963868908
order by t.display_sequence
/

终于可以了apex和pl/sql学习记录2,oracle apex,PL/SQL,错误记录,sql,oracle,apex,pl/sql

 5.2 创建动态导航菜单视图

-- 创建动态导航菜单的视图
CREATE OR REPLACE FORCE EDITIONABLE VIEW "CK_MENU_V" ("LEVEL_VALUE", "LABEL_VALUE", "TARGET_VALUE", "IS_CURRENT", "IMAGE_VALUE", "IMAGE_ATTR_VALUE", "IMAGE_ALT_VALUE", "DISPLAY_ORDER", "PAGE_ID") AS
  select 1 as LEVEL_VALUE,entry_text as LABEL_VALUE,entry_target as TARGET_VALUE, '' as IS_CURRENT,
	ENTRY_IMAGE as IMAGE_VALUE,'' as IMAGE_ATTR_VALUE,'' as IMAGE_ALT_VALUE, display_sequence as DISPLAY_ORDER,
	regexp_replace(entry_target,'[^0-9]') as page_id
from apex_application_list_entries
where application_id = 273  and parent_entry_text is null
union all
select 2 as LEVEL_VALUE,entry_text as LABEL_VALUE,entry_target as TARGET_VALUE, '' as IS_CURRENT,
	ENTRY_IMAGE as IMAGE_VALUE,'' as IMAGE_ATTR_VALUE,'' as IMAGE_ALT_VALUE, display_sequence as DISPLAY_ORDER,
	regexp_replace(entry_target,'[^0-9]') as page_id
from apex_application_list_entries
where application_id = 273 and parent_entry_text is not null
order by DISPLAY_ORDER;

数据如下:

apex和pl/sql学习记录2,oracle apex,PL/SQL,错误记录,sql,oracle,apex,pl/sql

5.3 创建一个动态列表并设置为导航菜单

创建动态列表:CKU_MENU_WXX

apex和pl/sql学习记录2,oracle apex,PL/SQL,错误记录,sql,oracle,apex,pl/sql

 动态列表sql代码

select * from ck_menu_v 
where page_id in (
	select distinct page_id from SYS_USER_ROLE_PAGE_WXX_V where user_name = :APP_USER
)

设置以上动态列表为导航菜单:

更改前apex和pl/sql学习记录2,oracle apex,PL/SQL,错误记录,sql,oracle,apex,pl/sql

 更改后

apex和pl/sql学习记录2,oracle apex,PL/SQL,错误记录,sql,oracle,apex,pl/sql

应用和问题

【错误记录】ORA-00054: 资源正忙, 但指定以 NOWAIT 方式获取资源, 或者超时失效

 当我试图运行程序的时候发现用户、角色、页面表都没有数据,以运行就报没有授权的错,好家伙,紧急还原,发现主键无法自增,想重新删表然后建表使主键自增,结果就报错

[61000][54] ORA-00054: 资源正忙, 但指定以 NOWAIT 方式获取资源, 或者超时失效 Position: 11apex和pl/sql学习记录2,oracle apex,PL/SQL,错误记录,sql,oracle,apex,pl/sql

 找到的解决方案,试试

ORA-00054 资源正忙, 但指定以 NOWAIT 方式获取资源, 或者超时失效_ora00054 资源正忙要求指定nowait_1silence的博客-CSDN博客https://blog.csdn.net/GeorgeChan_/article/details/126056063 过程: -- 估计是锁表,找出哪个会话锁住了哪张表: session_id 为会话 ID。object_name 表名。

-- 删表失败 报错[61000][54] ORA-00054: 资源正忙, 但指定以 NOWAIT 方式获取资源, 或者超时失效 Position: 11
-- 估计是锁表,找出哪个会话锁住了哪张表:  session_id 为会话 ID。object_name 表名。
select l.SESSION_ID,o.owner,o.object_name
from v$locked_object l,dba_objects o
where l.object_id=o.object_id;apex和pl/sql学习记录2,oracle apex,PL/SQL,错误记录,sql,oracle,apex,pl/sql

可以看到会话92锁住了表SYS_ROLE_WXX

select s.username,s.sid,s.serial#,s.logon_time
from  v$locked_object l,v$session s
where l.session_id=s.sid 
order by s.logon_time;
其中的 serial# 是我们需要用到的会话序列号

apex和pl/sql学习记录2,oracle apex,PL/SQL,错误记录,sql,oracle,apex,pl/sql

 sid为92,serial#为11376

杀掉会话
命令格式为:alter system kill session 'sid,serial#'

执行命令为:alter system kill session '92,11376';

apex和pl/sql学习记录2,oracle apex,PL/SQL,错误记录,sql,oracle,apex,pl/sql

然后就可以删表了

--删除表
drop table SYS_ROLE_WXX;

删表之后再建表就可以了,但是因为限制了主键,所以还是没有用。

登录不上去才发现登录验证用的还是老版的,改成新的就好了

apex和pl/sql学习记录2,oracle apex,PL/SQL,错误记录,sql,oracle,apex,pl/sql

 新的验证函数F_LOGIN2
--新的验证函数sys_user_wxx 
create or replace function "F_LOGIN2"
(p_username in VARCHAR2,
 p_password in VARCHAR2)
return boolean
is
    b_ret boolean :=false;
    c_1 number;
begin
    select count(1) into c_1 from sys_user_wxx 
        where user_name = p_username and pass_word = p_password;
    if (c_1 = 1) then 
        b_ret := true;
    else
        b_ret := false;
    end if;   
    return b_ret;
   
    exception when others then
        return false; 
end;
Error: 插件处理期间引发的 PLSQL 代码中出错。

改回F_Login后登录后验证出错 TEST_USER_WXX3_PRO

-
 component: APEX_APPLICATION_AUTH logon (208665947166996685)

报错

-- 登录验证3
create function F_Login3(p_username in nvarchar2, p_password in nvarchar2)
    return boolean
as
    -- 登录验证
    -- return true:验证通过 false:验证未通过
    v_job_number nvarchar2(32);
    v_password   nvarchar2(32);
    v_content    varchar2(512);
    v_err_msg    varchar2(2000);
begin
    -- 登录信息
    v_content := 'p_username:' || p_username || chr(13) || 'p_password:' || p_password;
    select JOB_NUMBER, PASSWORD
    into v_job_number,v_password
    from USER_TEST_WXX2
    where IS_LEAVE = 0
      and JOB_NUMBER = upper(p_username);
    if p_password <> v_password then
        apex_error.add_error(
                p_message => '密码错误,请检查后输⼊',
                p_additional_info=>'附加消息-01',
                p_display_location => apex_error.c_inline_in_notification);
        return false;
    else
        if p_password = v_password then
            return true;
        end if;
    end if;
    return false;
exception
    when no_data_found then
        apex_error.add_error(
                p_message => '该账号不存在,请检查后输⼊',
                p_ignore_ora_error=> true,-- 忽略oracle异常消息,使⽤⾃定义错误消息
                p_display_location => apex_error.c_inline_in_notification);
        WRITE_LOG(GET_FN_NAME(), 'error', v_content || chr(13) || v_err_msg, null, -1);
        return false;
    when others then
        apex_error.add_error(
                p_message => '系统异常,请联系管理员',
                p_ignore_ora_error=> true,-- 忽略oracle异常消息,使⽤⾃定义错误消息
                p_display_location => apex_error.c_inline_in_notification);
        -- ⽇志记录
        v_err_msg := sqlerrm || chr(13) || dbms_utility.format_error_backtrace;
        WRITE_LOG(GET_FN_NAME(), 'error', v_content || chr(13) || v_err_msg, null, -1);
        return false;
end;

apex和pl/sql学习记录2,oracle apex,PL/SQL,错误记录,sql,oracle,apex,pl/sql

技术信息(仅提供给开发人员使用)

  • is_internal_error: false
  • component.type: APEX_APPLICATION_AUTH
  • component.id: 208665947166996685
  • component.name: logon

检查了一下apex和pl/sql学习记录2,oracle apex,PL/SQL,错误记录,sql,oracle,apex,pl/sql

 apex和pl/sql学习记录2,oracle apex,PL/SQL,错误记录,sql,oracle,apex,pl/sql

 查看会话可以得知是设置授权方案的时候还延续着

begin apex_authentication.login(
    p_username => :P9999_USERNAME,
    p_password => :P9999_PASSWORD,
    p_uppercase_username => false);
end;

apex和pl/sql学习记录2,oracle apex,PL/SQL,错误记录,sql,oracle,apex,pl/sql

细节

占位符统一

页设计→项→外观 值占位符:请输入xx 

apex和pl/sql学习记录2,oracle apex,PL/SQL,错误记录,sql,oracle,apex,pl/sql

错误:

【错误记录】PLS-00201: 必须声明标识符 'LOGIN_SUCCESS_WXX_PRO'

apex和pl/sql学习记录2,oracle apex,PL/SQL,错误记录,sql,oracle,apex,pl/sql

登录后验证存储过程LOGIN_SUCCESS_WXX_PRO 未被创建成功

apex和pl/sql学习记录2,oracle apex,PL/SQL,错误记录,sql,oracle,apex,pl/sql

 要实现菜单页面的显示/隐藏,需要在

共享组件→ 列表→导航菜单→列表详细资料→创建/编辑→列表条目→条件 选择“返回布尔值的函数体”(即只有返回true才会显示菜单,false则会隐藏菜单)

【错误记录】 Error: ERR-1002 在应用程序 "273" 中未找到项 "USER_JOB_NUMBER" 的项 ID

apex和pl/sql学习记录2,oracle apex,PL/SQL,错误记录,sql,oracle,apex,pl/sql

授权方案查验

会话 1988285613145
用户 李四
工作区 2204375772170718
浏览器语言 zh-cn

之前

return f_control(
  p_username => :APP_NAME,
  p_pageid => :APP_PAGE_ID
);

之后

return f_control(
  p_username => :USER_NAME,
  p_pageid => :PAGE_ID
);

【错误记录】ora_sqlerrm: ORA-01422: 实际返回的行数超出请求的行数

 

 apex和pl/sql学习记录2,oracle apex,PL/SQL,错误记录,sql,oracle,apex,pl/sql

【错误记录】ora_sqlerrm: ORA-06550: 第 1 行, 第 27 列: PLS-00302: 必须声明 'LOGIN2' 组件

apex和pl/sql学习记录2,oracle apex,PL/SQL,错误记录,sql,oracle,apex,pl/sql

apex和pl/sql学习记录2,oracle apex,PL/SQL,错误记录,sql,oracle,apex,pl/sql

apex和pl/sql学习记录2,oracle apex,PL/SQL,错误记录,sql,oracle,apex,pl/sql

 全是问题,盖亚!

查看日志

select * from E_LOGS order by CREATED_DATE desc;

apex和pl/sql学习记录2,oracle apex,PL/SQL,错误记录,sql,oracle,apex,pl/sql

登录后验证:TEST_USER_WXX_PRO

create PROCEDURE TEST_USER_WXX_PRO AS
    V_USER_ID    NUMBER(20);
    V_ROLE_ID    NUMBER(20);
    V_PERM_ID    NUMBER(20);
    V_USER_NAME  NVARCHAR2(64);
    V_JOB_NUMBER NVARCHAR2(32);
    V_MOBILE     NVARCHAR2(32);
    V_EMAIL      NVARCHAR2(32);
    V_COUNT      NUMBER(10);
    V_ID         NUMBER(10);
    V_DEPT_NAME  NVARCHAR2(64);

begin
    -- 获取用户基础信息
    SELECT
           ROLE_ID,
           PERM_ID,
           USER_ID,
           USER_NAME,
           JOB_NUMBER,
           MOBILE,
           EMAIL
    INTO V_ROLE_ID,V_PERM_ID,V_USER_ID, V_USER_NAME, V_JOB_NUMBER, V_MOBILE, V_EMAIL
    FROM TEST_USER_WXX_V
    where USER_NAME = upper(V('P9999_USERNAME')) and rownum=1;

    -- 获取用户角色权限
    select COUNT(USER_ID)
    into V_COUNT
    from ROLE_USER_TEST_WXX ru
             join ROLE_TEST_WXX2 r
                  on r.ROLE_ID = ru.ROLE_ID
    where USER_ID = V_USER_ID;

    if V_COUNT > 0 then
        select r.ROLE_ID
        into V_ROLE_ID
        from ROLE_USER_TEST_WXX ru
                 join ROLE_TEST_WXX2 r
                      on r.ROLE_ID = ru.ROLE_ID
        where USER_ID = V_USER_ID
          and rownum = 1;

    else
        select ROLE_ID
        into V_id
        from ROLE_TEST_WXX2
        where IS_ENABLE = 1
          and rownum = 1;
        insert into ROLE_USER_TEST_WXX(USER_ID, ROLE_ID)
        values (V_USER_ID, V_id);
        commit;
    end if;

    -- 设置USER
    apex_custom_auth.set_user(V_USER_NAME);

    -- 将用户登入录信息注入session state
    apex_util.set_session_state('ROLE_ID', V_ROLE_ID);
    apex_util.set_session_state('DEPT_NAME', V_DEPT_NAME);
--     apex_util.set_session_state('USER_NAME', V_NAME);
    apex_util.set_session_state('USER_JOB_NUMBER', V_JOB_NUMBER);
end;
/

 成功啦!

apex和pl/sql学习记录2,oracle apex,PL/SQL,错误记录,sql,oracle,apex,pl/sql

参考样例

新的思路

return is_have_permission_wxx(V('WXX_USER_ID'), 2,V('WXX_ROLE_ID'));

动态菜单

select
     level,
    m1.NAME label,
    'f?p=&'||'APP_ID.:'||m1.PAGE_ID||':&'||'SESSION.::&'||'DEBUG.::::' target,
    null IS_CURRENT,
    m1.ICON image
from AUTH_MENU m1
where m1.APP_CODE = V('APP_CODE') and m1.TENANT_ID = :USERTENANT and m1.DEL_FLAG = 0 and m1.IS_ACTIVE = 'Y' and m1.MENU_ID in (
    select m2.PARENT_ID as MENU_ID from AUTH_ROLE_MENU_ASSO rma1
    join AUTH_MENU m2
        on rma1.MENU_ID = m2.MENU_ID
    where rma1.ROLE_ID = :ROLEID and m2.PARENT_ID is not null
    union
    select rma2.MENU_ID from AUTH_ROLE_MENU_ASSO rma2 where rma2.ROLE_ID = :ROLEID
    )
start with m1.PARENT_ID is null
connect by prior m1.MENU_ID = m1.PARENT_ID
order siblings by m1.SORT_NO文章来源地址https://www.toymoban.com/news/detail-680509.html

到了这里,关于apex和pl/sql学习记录2的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Oracle/PL/SQL奇技淫巧之ROWNUM伪列

    ROWNUM 是一个伪列,它是根据每次查询的结果动态生成的一列递增编号,表示 Oracle 从表中选择该行的顺序,选择的第一行 ROWNUM 为1,第二行 ROWNUM 为2,以此类推。 ROWNUM 伪列是在 WHERE 子句之前生成的,就是说它并不是在执行了 WHERE 子句过滤之后再对数据编号 比如在执行 WHE

    2024年02月12日
    浏览(41)
  • Oracle/PL/SQL奇技淫巧之Json转表

    在Oracle中,有些时候我们需要在一个json文档中查数据 这个时候我们可以通过 JSON_TABLE 函数来把 json文档 提取成一张可以执行正常查询操作的表 先看 JSON_TABLE 函数的基础用法: 其中: json_data :要从中提取数据的 JSON文档 或 JSON列 $.json_path :JSON路径表达式,该表达式指定要提

    2024年02月12日
    浏览(40)
  • ORACLE数据库 —— PL/SQL知识点2

    ORACLE数据库  PL/SQL语句基础知识点  适合有SQL基础的人群。  禁止转载! 内置函数 字符串函数     lower(列名|字符串)函数用于返回字符串的小写形式。         eg.SELECT ename,sal FROM emp WHERE ename=lower(\\\'ename\\\');     upper(列名|字符串)函数用于返回字符串的大写形式。       

    2024年02月08日
    浏览(50)
  • Oracle/PL/SQL数据库基础操作(持续更新)

            PL/SQL不是一个独立的编程语言;它是Oracle编程环境中的工具。 SQL* Plus是一个互动的工具,它可以在命令提示符下键入SQL和PL/SQL语句。这些命令发送到数据库进行处理。语句处理之后将结果发回,并在屏幕上显示出来。 分类 命令 DDL create:创建;drop:删除;alter:

    2024年02月09日
    浏览(59)
  • 用PL/SQL Developer连接远程Oracle数据库

    oracle数据库安装教程参考 注意: 第六步中的Oracle基目录中的用户名为中文的话,需要去掉中文部分。然后管理口令一定保存好。 2.打开oracle安装目录(默认在C盘,我的在D盘),找到tnsnames.ora文件 这是oracle客户端所需要的一个文件,通过该文件可以配置数据库的连接地址,

    2024年02月13日
    浏览(42)
  • Oracle开发和应用——PL/SQL语法2(游标及集合)

    6.4.6.  游标 这里的游标 (cursor) ,是指数据库开发中的游标,而且,这里所指的是显式定义的游标。因为,除了显式定义的游标,我们每条SQL语句也会隐式的定义、打开和关闭一个游标,其实质是一个带有指针的结果集。当我们按照顺序取出结果时,这个指针会按照从前到

    2024年02月22日
    浏览(42)
  • PL/SQL+cpolar公网访问内网Oracle数据库

    Oracle,是甲骨文公司的一款关系数据库管理系统,它在数据库领域一直处于领先地位。可以说Oracle数据库系统是世界上流行的关系数据库管理系统,系统可移植性好、使用方便、功能强,适用于各类大、中、小微机环境。它是一种高效率的、可靠性好的、适应高吞吐量的数据

    2024年02月08日
    浏览(40)
  • PL/SQL Developer15和Oracle Instant Client安装配置

    Oracle Instant Client Downloads | Oracle 中国 PL/SQL Developer - Allround Automations Free trial - Allround Automations 一路默认下一步。 选择输入许可信息: 产品码: 4tqw83ltw4ustkjfftny7wjl7tqv9uscs8 序列号: 182522 密码: *************  一路默认下一步,直到安装完成。 解压到自己喜欢的位置即可。 Oracl

    2024年02月12日
    浏览(42)
  • 【数据库】日常使用PL/SQL 登录ORACLE 数据库查询数据

    一、PL/SQL 登录方式 username: ##访问数据库的账号 password: ##访问数据库的密码 Databse: ##数据库IP地址/实例名 数据库集群心跳地址/实例名 Connect as : ##Normal,如果使用sysdba账户登录选择SYSDBA 二、PL/SQL使用SQL语句查询 点击上方导航栏,New,选择SQL Window,即可再次输入要查询的

    2024年02月19日
    浏览(68)
  • Oracle PL/SQL Programming 第5章:Iterative Processing with Loops 读书笔记

    总的目录和进度,请参见开始读 Oracle PL/SQL Programming 第6版 本章探讨 PL/SQL 的迭代控制结构(也称为循环),它允许您重复执行相同的代码。 PL/SQL 提供了三种不同类型的循环结构: 简单或无限循环 FOR 循环(数字和游标) WHILE 循环 每种类型的循环都是针对特定目的而设计:

    2024年02月20日
    浏览(32)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包