これは、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 に渡す時間間隔ごとに自動的に実行されるようにします。
テーブル名の前にスキーマ名を追加します。ドロップ テーブル パーツの下で実行する前にテーブルが既に存在する場合は、コードから例外パーツを削除します。「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;
/