这是根据scott.emp表格可能需要的简化版本。首先是向您展示查询和输出。你也可以使用间隔或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表部分之前表已存在,则从代码中移除异常部分。如果你得到“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;
/
来源
2013-03-26 19:35:32
Art
这听起来像是完美的分区选择。您是否拥有许可的分区选项? – 2013-03-26 19:13:20