【问题标题】:How to populate same value for multiple rows using pl/sql如何使用 pl/sql 为多行填充相同的值
【发布时间】:2017-08-11 17:36:40
【问题描述】:

如果员工id 相同,我如何将相同的数据填充到多行中。无需每次都查询表 例如。 如果我从员工表中得到以下行

EMPLID  CHANGETIME
------  --------------
1234    8/10/2017
1234    8/11/2017

对于上述员工,我需要查询 NAME 表以获取姓名并填充两行。

EMPLID  CHANGETIME  FirstNAME LastNAME
------  ----------  --------- --------
1234    08/10/17    JOHN       MATHEW
1234    08/11/17    JOHN       MATHEW

当我第一次查询时,我想将它存储在数组或某个变量中,如果 EMPLID 与前一个匹配,则填充相同的变量。

只是想这样做以提高性能。任何提示都会有所帮助。

现在我正在使用批量插入类型表,每次从 EMPLOYEE 表中获取一行时它都会搜索 NAME 表

【问题讨论】:

    标签: oracle performance plsql


    【解决方案1】:

    我会使用连接来获取员工姓名(也在 pl/sql 中),例如: SELECT e.emplid, e.first_name, e.last_name, c.changetime FROM employee_changes c INNER JOIN employee e ON e.emplid = c.emplid WHERE c.change_time > sysdate - 30 ORDER BY e.emplid, c.change_time

    如果你想选择可以用作光标...

    【讨论】:

      【解决方案2】:

      我认为您需要一些额外的标准,例如“最后更改时间”。 在这种情况下,您可以编写如下代码:

      SELECT e.EMPLID, e.CHANGETIME, n.FirstNAME, n.LastNAME
        FROM Employee e, NAME n
       WHERE e.emplid = n.emplid
         AND e.changetime = (SELECT MAX(e1.changetime)
                               FROM Employee e1
                              WHERE e1.emplid = e.emplid);
      

      “对于每个员工,只需获取 de max changetime”

      【讨论】:

        【解决方案3】:

        如果您使用的是 11g,则应考虑使用结果缓存功能。这允许我们定义返回值存储在内存中的函数。像这样的:

        create or replace function get_name 
            (p_empid pls_integer)
            return varchar2
            result_cache relies_on (names)
        is
          return_value varchar2(30);
        begin
            select empname into return_value  
            from names
            where empid = p_empid;
            return return_value;
        end get_name;
        /   
        

        注意 RELIES_ON 子句:这是一个选项,但它表明缓存仅对缓慢变化的表有用。如果 NAMES 表中有大量流失,Oracle 将继续刷新缓存,您将不会获得太多好处。但至少结果是正确的——这是你目前的方法无法保证的。

        这是一个示例。忽略经过的时间,但要注意在第二次通话中获得相同的员工姓名所需的努力:

        SQL> set autotrace on 
        SQL> set timing on
        SQL> select get_name(7934) from dual
          2  /
        
        GET_NAME(7934)
        ------------------------------------------------------------------------------------------------------------------------------------------------------
        MILLER
        
        Elapsed: 00:00:01.25
        
        Execution Plan
        ----------------------------------------------------------
        Plan hash value: 1388734953
        
        -----------------------------------------------------------------
        | Id  | Operation        | Name | Rows  | Cost (%CPU)| Time     |
        -----------------------------------------------------------------
        |   0 | SELECT STATEMENT |      |     1 |     2   (0)| 00:00:01 |
        |   1 |  FAST DUAL       |      |     1 |     2   (0)| 00:00:01 |
        -----------------------------------------------------------------
        
        Statistics
        ----------------------------------------------------------
                842  recursive calls
                166  db block gets
               1074  consistent gets
                 44  physical reads
              30616  redo size
                499  bytes sent via SQL*Net to client
                437  bytes received via SQL*Net from client
                  2  SQL*Net roundtrips to/from client
                134  sorts (memory)
                  0  sorts (disk)
                  1  rows processed
        
        SQL>
        

        第二次通话:

        SQL> r
          1* select get_name(7934) from dual
        
        GET_NAME(7934)
        ------------------------------------------------------------------------------------------------------------------------------------------------------
        MILLER
        
        Elapsed: 00:00:00.13
        
        Execution Plan
        ----------------------------------------------------------
        Plan hash value: 1388734953
        
        -----------------------------------------------------------------
        | Id  | Operation        | Name | Rows  | Cost (%CPU)| Time     |
        -----------------------------------------------------------------
        |   0 | SELECT STATEMENT |      |     1 |     2   (0)| 00:00:01 |
        |   1 |  FAST DUAL       |      |     1 |     2   (0)| 00:00:01 |
        -----------------------------------------------------------------    
        
        Statistics
        ----------------------------------------------------------
                  0  recursive calls
                  0  db block gets
                  0  consistent gets
                  0  physical reads
                  0  redo size
                499  bytes sent via SQL*Net to client
                437  bytes received via SQL*Net from client
                  2  SQL*Net roundtrips to/from client
                  0  sorts (memory)
                  0  sorts (disk)
                  1  rows processed
        
        SQL> 
        

        文档中有很多关于这个漂亮功能的内容。 Find out more.

        【讨论】:

          猜你喜欢
          • 2017-02-24
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-11-16
          • 1970-01-01
          • 1970-01-01
          • 2015-12-06
          • 1970-01-01
          相关资源
          最近更新 更多