代码之家  ›  专栏  ›  技术社区  ›  Eaxxx

将函数重构为sql查询

  •  2
  • Eaxxx  · 技术社区  · 6 年前

    长话短说,我们有这个功能。。。这就是功能。
    它被称为“获取用户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内部表格,有经验的人吗?

    1 回复  |  直到 6 年前
        1
  •  1
  •   Littlefoot    6 年前

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

    然后删除(*)应用程序并将其从修改后的应用程序导入。SQL文件。

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