【问题标题】:Refactor function to sql query将函数重构为 sql 查询
【发布时间】: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 秒。

问题解决了……但是
这是我的问题
是否有任何体面的方法可以从

更改 Apex raports/item 源和数据库视图中的所有 sql 实例

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


【解决方案1】:

怎么样:导出应用程序。结果将是一个 .SQL 文件 - 您可以在任何文本编辑器中打开的 textual 文件。去做。执行搜索/替换。

然后 drop(*) 应用程序并从修改后的 .SQL 文件中导入它。

(*) 小心丢弃...。我建议您首先在测试工作区而不是在生产环境中尝试它,以防万一

【讨论】:

  • 我猜这是选项之一,我正在考虑更新 apex 内部表,你有经验吗?
  • 我不敢这样做。
  • 此外,您可以在 pre-prod 实例中使用不同的应用程序 ID 导入之前/之后进行测试。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-08-04
  • 1970-01-01
  • 1970-01-01
  • 2019-03-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多