这是基于 scott.emp 表的您可能需要的简化版本。首先是向您展示查询和输出。您还可以使用 INTERVAL 或 ADD_MONTHS 来获取过去 6 个月的数据:
SELECT * FROM
(
SELECT deptno, empno, ename, end_date AS hiredate
, TRUNC(MONTHS_BETWEEN(sysdate, end_date)) months_of_service
FROM emp_test
)
WHERE months_of_service <= 6 -- past 6 moths data only
ORDER BY 1
/
DEPTNO EMPNO ENAME HIREDATE MONTHS_OF_SERVICE
------------------------------------------------------------
10 7782 CLARK 11/2/2012 4
10 7934 MILLER 9/2/2012 6
...
20 7902 FORD 9/2/2012 6
20 7566 JONES 10/2/2012 5
...
30 7935 WALSH 12/2/2012 3
30 7900 JAMES 9/2/2012 6
30 7844 TURNER 1/27/2013 1
...
下面的示例基于您的帖子 - 您希望每次都重新创建表并用数据填充它。您也可以截断表并重新插入数据 - 由您决定。我个人会选择截断/插入而不是动态删除/创建表。
使用表名作为参数创建过程,或手动运行块,或使用 DBMS_SCHEDULER 或其他工具安排它,以便在您传递给 SCHEDULER 的每个时间间隔自动运行。
在表名之前添加架构名称。如果在 Drop table 部分下运行之前表已经存在,则从代码中删除异常部分。如果你得到“ORA-00942:表或视图不存在”,那么你需要一个例外。
DECLARE
v_tab_name VARCHAR2(100):= 'emp_test2';
BEGIN
EXECUTE IMMEDIATE 'DROP TABLE '|| v_tab_name; -- may truncate then insert
-- This exception will handle ORA-00942: table or view does not exist
-- If table already exists before you run this then you may remove it from code
EXCEPTION WHEN OTHERS
THEN
BEGIN
EXECUTE IMMEDIATE 'CREATE TABLE '||v_tab_name||' AS -- or insert into select...
SELECT * FROM
(
SELECT deptno, empno, ename, end_date
, TRUNC(MONTHS_BETWEEN(sysdate, end_date)) months_of_service
FROM emp_test
)
WHERE months_of_service <= 6
ORDER BY 1';
EXCEPTION WHEN OTHERS THEN dbms_output.put_line(SQLCODE||' '||SQLERRM);
END;
END;
/