海约,
我必须编写一个过程,将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;
/
这里提到的两个表具有相同的结构(事实上,处理的表1只是表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
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语句的结果如下:
TIMEID | NAME
-----------------------------------
VALUE | VALUE
VALUE | VALUE
VALUE | VALUE
但是如果我执行这个过程并给它一个DummyDate(Sysdate-12或类似于'16.07.2010 10:32:50'的日期),我的蟾蜍会给我一条消息“过程完成”,我的表保持空白…!
但是正如前面所说,大型select语句给出结果,因此不应该尝试插入空的resultset…!有人能告诉我为什么我的手术无效吗?
每一个有用的答案。=)
格雷兹!
附笔。:
这个
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值!我测试了它,这样也可以工作,你可以忽略它的整个逻辑。这只是给你一个完整的情况图片!