长话短说,我们有这个功能。。。这就是功能。
它被称为“获取用户id”
它所做的是从上下文中获取有关apex登录的信息,然后从自定义身份验证表中选择用户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秒。
问题解决了。。。但是
我的问题来了
在Apex raports/item sources和db视图中,有没有合适的方法来更改sql的所有实例
获取用户id
到
(
select user_id from users
where upper(login) = nvl(upper(:APP_USER),'SYSTEM')
)
编辑:
我在考虑更新apex内部表格,有经验的人吗?