ヘイホー、
選択ステートメントからテーブルに結果セットを挿入するプロシージャを作成する必要があります。私の同僚は、あるテーブルから別のテーブルに値をコピーするために、以前に似たようなことをしました。彼の声明は次のようになります。
CREATE OR REPLACE PROCEDURE Co-Worker(
pId IN INT
)
AS
BEGIN
INSERT INTO Table1_PROCESSED
SELECT * FROM Table1
WHERE ID = pId;
DELETE FROM Table1
WHERE ID = pId;
END Co-Worker;
/
ここで言及した 2 つのテーブルは同じ構造になっています (実際、table1_processed はテーブル 1 の単なるコピーです)。だから私は、「ちょっと、私も select-statement から結果セットを取得します!だから、少し調整しないで同じようにするのはなぜですか!」と考えました。そこで、次のようにテーブルを作成しました。
MyTable:
TIMEID (number) | NAME (varchar2 - 128)
-----------------------------------
VALUE | VALUE
VALUE | VALUE
VALUE | VALUE
そして私の手順は次のようになります:
CREATE OR REPLACE procedure MyProcedure(
pdate in date,
pJobtype in number default 3,
pTasktype in number default 4,
pJobstatus in number default 1,
pTaskstatus in number default 4
)
AS
pformateddate date;
BEGIN
Select to_date(to_char(to_date(pdate, 'DD.MM.YYYY HH24:MI:SS'), 'DD.MM.YYYY'), 'DD.MM.YYYY')
into pformateddate
from dual;
Insert into MyTable (TIMEID, NAME)
Select Function_GETTIMEID(to_date(st, 'DD.MM.YYYY HH24')) TIMEID
,to_char(ext) NAME
from(
Select to_char(arch_job.exec_start, 'DD.MM.YYYY HH24') st
,file.name ext
, count(file.id) cnt
from
arch_task_file
left join file on arch_task_file.File_ID = file.ID
left join arch_task on arch_task_file.Task_ID = arch_task.ID
left join arch_job on arch_task.Job_ID = arch_job.ID
where
arch_job.exec_start > pformateddate
and arch_job.exec_end <pformateddate + 1
and arch_job.jobtype_id = pJobtype
and arch_job.jobstatus_id = pJobstatus
and arch_task.Tasktype_ID = pTasktype
and arch_task.Taskstatus_ID = pTaskstatus
group by
file.name,
to_char(arch_job.exec_start, 'DD.MM.YYYY HH24'
)
);
End MyProcedure;
/
大きな Select-Statement ALONE の結果は次のようになります。
TIMEID | NAME
-----------------------------------
VALUE | VALUE
VALUE | VALUE
VALUE | VALUE
しかし、この手順を実行してダミーの日付 (sysdate - 12 または '16.07.2010 10:32:50' のような日付) を指定すると、Toad から「手順が完了しました」というメッセージが表示され、テーブルが空のままになります...! しかし、前に述べたように、大きな Select-Statement によって結果が得られるため、空の結果セットを挿入しようとするべきではありません...! 私の手順が機能しない理由を誰か教えてもらえますか?
すべての有用な回答に感謝します。=)
グリーツ!
追伸:
Select to_date(to_char(to_date(pdate, 'DD.MM.YYYY HH24:MI:SS'), 'DD.MM.YYYY'), 'DD.MM.YYYY')
into pformateddate
from dual;
pDate-value を短くするには が必要です! 私はそれをテストしたので、それも機能し、ロジック全体で無視できます。状況の全体像をお伝えするのはここだけです!