Heyho,將結果集插入到Oracle中的表中
我必須編寫一個過程,它將結果集從select語句插入到表中。 我的同事之前做了類似的事情,將一個表中的值複製到另一個表中。他的說法是這樣的:
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;
/
這裏提到的兩個表得到了相同的結構(其實table1_processed只是表1的複印件)。 所以我覺得像「嘿!我也從我的選擇中得到了一個結果集!所以我爲什麼不把它調整一點!」 所以我建立了我的表是這樣的:
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語句ALONE看起來是這樣的:
但如果我執行這個過程並給它一個dummydate(sysdate - 12或像'16。077.2010 10:32:50'這樣的日期),我的蟾蜍 - 給我一個消息「過程完成」我的表保持空...! 但正如之前所說的大選擇語句給出的結果,所以不應該嘗試插入一個空的結果集......!誰能告訴我爲什麼我的程序不工作?
Thx爲每個有用的答案。 =)
Greetz!
P.S: 的
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價值!我對它進行了測試,因此也可以工作,您可以在整個邏輯中忽略它。只是在這裏給你一個完整的情況圖片!
要更簡單地「縮短」pDate值,您可以這樣做: pformateddate:= trunc(to_date(pdate,'DD.MM.YYYY HH24:MI:SS')); – 2010-07-28 08:45:54
事實上,我沒有發現pDate是一個日期,所以你需要的只是「pformatteddaet:= trunc(pDate);」 – 2010-07-28 09:58:19