【发布时间】:2018-10-29 08:22:59
【问题描述】:
长话短说,我们有这个功能......它就是功能。
它被称为“get_user_id”
它的作用是从上下文中获取有关 apex 登录的信息,然后从我们的自定义身份验证表中选择 user_id。
这个功能有 5 年甚至更长的时间,因为我可以在 db 用户列表中看到 APEX_030200 用户,我们的 DBA 说他在评估 Apex 以供公司使用时创建了它。
create or replace function get_user_id return number as
client_info VARCHAR2(1000);
rezult number;
x_user varchar2(512);
begin
-- return 1;
DBMS_APPLICATION_INFO.READ_CLIENT_INFO ( client_info );
x_user := substr(client_info,INSTR(client_info, ':' ,3,1)+1) ;
select user_id
into rezult
from USERS
where upper(login) = upper(x_user) ;
RETURN rezult ;
EXCEPTION
WHEN OTHERS THEN
RETURN -1;
end;
所以是的... 我尝试运行此查询:
select * from (0,5 x 10^6 rows ) where user_id = get_user_id;
我们的服务器花了大约 2 分钟才返回任何行
我开始阅读有关在 sql 等中优化函数的信息,我发现我可以通过以下方式将它降低到 0.1 秒以下:
select * from (0,5 x 10^6 rows ) where user_id = (select get_user_id from dual );
然后我开始分析函数内部的实际内容,捂脸,然后就这样做了
select * from (0,5 x 10^6 rows )
where user_id in (
select user_id from users
where upper(login) = nvl(upper(:APP_USER),'SYSTEM')
)
查询时间:0.03 秒。
问题解决了……但是
这是我的问题
是否有任何体面的方法可以从
get_user_id
到
(
select user_id from users
where upper(login) = nvl(upper(:APP_USER),'SYSTEM')
)
编辑:
我正在考虑更新 apex 内部表 any1 有任何经验吗?
【问题讨论】:
-
如果您的意思是全局搜索和替换?没有任何支持。您必须逐页浏览。您可以使用顶点视图来查找所有事件。您遇到了为什么我从不在 Apex 页面上公开原始 sql 或 plsql 并且总是包装在存储查询中的原因
标签: oracle oracle11g oracle-apex