oracle使用管道函数,实现数据更新分析查询,存储查询过程较为复杂的语句的结果

适用范围,源表更新较为频繁。代替物化视图不能增量更新数据的缺点。

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列,只能更新同一表的数据。

++a
发布了13 篇原创文章 · 获赞 0 · 访问量 1095

猜你喜欢

转载自blog.csdn.net/qq_40881607/article/details/104976884
今日推荐