sql >> データベース >  >> RDS >> Oracle

2つのレコードを比較し、違いのみを表示します

    これが問題に対する鈍い計器進入です。

    create or replace function col_diff
        ( p_empno_1 in emp.empno%type
          , p_empno_2 in emp.empno%type )
        return col_nt pipelined
    is
        out_val col_t := new col_t(null, null, null);
        emp_rec1 emp%rowtype;
        emp_rec2 emp%rowtype;
    begin
        select *
        into emp_rec1
        from emp
        where empno = p_empno_1;
        select *
        into emp_rec2
        from emp
        where empno = p_empno_2;
    
        if emp_rec1.ename != emp_rec2.ename
        then
            out_val.col_name := 'ENAME';
            out_val.old_val := emp_rec1.ename;
            out_val.new_val := emp_rec2.ename;
            pipe row (out_val); 
        end if;
        if emp_rec1.hiredate != emp_rec2.hiredate
        then
            out_val.col_name := 'HIREDATE';
            out_val.old_val := to_char(emp_rec1.hiredate, 'DD-MON-YYYY');
            out_val.new_val := to_char(emp_rec2.hiredate, 'DD-MON-YYYY');
            pipe row (out_val); 
        end if;
        return;
    end;
    /
    

    したがって、このテストデータを考えると...

    SQL> select empno, ename, hiredate
      2  from emp
      3  where empno > 8100
      4  /
    
         EMPNO ENAME      HIREDATE
    ---------- ---------- ---------
          8101 PSMITH     03-DEC-10
          8102 PSMITH     02-JAN-11
    
    SQL>
    

    ...次の出力が得られます:

    SQL> select * from table (col_diff(8101,8102))
      2  /
    
    COL_NAME
    ------------------------------
    OLD_VAL
    -------------------------------------------------------------------
    NEW_VAL
    -------------------------------------------------------------------
    HIREDATE
    03-DEC-2010
    02-JAN-2011
    
    
    SQL>
    

    さて、間違いなくあなたはより冗長でない何かを望んでいます。 11gで導入された拡張メソッド4動的SQLを使用して何かを行うことができるかもしれないと思います。残念ながら、あなたは10gを使用していると言います。



    1. mssqlはvarcharをfloatに変換します

    2. MySQLとFOREIGNKEYSとの多対多の関係

    3. OR条件でのLEFTJOINのインデックスの使用

    4. ホストアクセス許可をMySQLユーザーに再割り当てします