2011-07-26 7 views

답변

3

다음은 문제에 대한 무딘 도구 접근 방식입니다. 이 테스트 데이터 주어진 그래서

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> 

를 doubtlessly 당신이 뭔가를 싶습니다 덜 장황하다. 11g에서 소개 된 향상된 메소드 4 동적 SQL을 사용하여 무언가를 할 수 있다고 생각합니다. 아아, 당신은 10g을 사용한다고 말합니다.

관련 문제