适用范围,源表更新较为频繁。代替物化视图不能增量更新数据的缺点。
1.先建立一个表用于存储查询结果数据,如下所示:
CREATE TABLE emp_max AS
SELECT empno,ename,hiredate,deptno FROM
(SELECT empno,ename,hiredate,deptno,row_number() over(partition by deptno order by hiredate) row_num FROM emp)
WHERE row_num=1;
2.建立管道函数,实现数据增量更新操作:
CREATE OR REPLACE PACKAGE pkg_test
IS
TYPE test_table IS TABLE OF emp_max%rowtype;
FUNCTION func_test RETURN test_table PIPELINED;
END pkg_test;
/
CREATE OR REPLACE PACKAGE BODY pkg_test
IS
FUNCTION func_test RETURN test_table PIPELINED
IS
PRAGMA AUTONOMOUS_TRANSACTION;
v_lastdate DATE;
v_row emp_max%rowtype;
v_cur SYS_REFCURSOR;
BEGIN
SELECT MAX(hiredate) INTO v_lastdate FROM emp_max;
MERGE INTO emp_max a
USING
(
SELECT empno,ename,hiredate,deptno FROM
(SELECT empno,ename,hiredate,deptno,row_number() over(partition by deptno order by hiredate) row_num FROM emp WHERE emp.hiredate>=v_lastdate)
WHERE row_num=1) a2
ON(a2.empno=a.empno)
WHEN MATCHED THEN
UPDATE
SET -- a.empno=a2.empno,
a.ename=a2.ename,
a.hiredate=a2.hiredate,
a.deptno=a2.deptno
WHEN NOT MATCHED THEN
INSERT (empno,ename,hiredate,deptno) VALUES(a2.empno,a2.ename,a2.hiredate,a2.deptno);
COMMIT;
OPEN v_cur FOR SELECT * FROM emp_max;
LOOP
FETCH v_cur INTO v_row;
EXIT WHEN v_cur%NOTFOUND;
PIPE ROW(v_row);
END LOOP;
CLOSE v_cur;
RETURN;
END;
END pkg_test;
3.查询结果 数据:
SELECT * FROM table(pkg_test.func_test)
缺点:不能更新JOINl列,只能更新同一表的数据。