2010-07-28 34 views
0

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價值!我對它進行了測試,因此也可以工作,您可以在整個邏輯中忽略它。只是在這裏給你一個完整的情況圖片!

+0

要更簡單地「縮短」pDate值,您可以這樣做: pformateddate:= trunc(to_date(pdate,'DD.MM.YYYY HH24:MI:SS')); – 2010-07-28 08:45:54

+0

事實上,我沒有發現pDate是一個日期,所以你需要的只是「pformatteddaet:= trunc(pDate);」 – 2010-07-28 09:58:19

回答

3

這是在SQL論壇上很常見的模式。該模式的OP說

「我在蟾蜍工作 (或其他)運行該SQL和它的作品但當 我包括在不同的上下文 - 如存儲過程 - 它 不起作用。什麼給了?「

是什麼讓的是,兩種說法都不一樣。某處有誤轉錄。也許加入已被省略或額外的一個補充。錯誤的最可能的來源是更換在與存儲過程的參數的工作文字。

很明顯,我不能告訴你其中的區別在於,所有我能做的就是敦促你仔細檢查兩個SQL語句,並計算出的差異。

如果你真的找不到任何區別,那麼你需要調試你的代碼最惡劣的方式是使用魔鬼調試器。在插入語句之後添加以下行:

dbms_output.put_line('Rows inserted = '||to_char(sql%rowcount)); 

您需要在TOAD中啓用DBMS_OUTPUT;有一個標籤在某處。這至少會告訴你這個查詢是否真的返回了零行,或者你的過程插入了行,並且你由於某種原因沒有看到它們。這是兩個不同的問題。

0

您需要在運行此過程的Toad會話中執行COMMIT,然後才能在任何其他會話(例如表瀏覽器)中的表中看到該數據。你記得那麼做嗎?

+0

是我記得有一個提交 – Husky110 2010-07-28 09:11:51

0

不是真的你的問題相關,但這個

Select to_date(to_char(to_date(pdate, 'DD.MM.YYYY HH24:MI:SS'), 'DD.MM.YYYY'), 'DD.MM.YYYY') 
into pformateddate 
from dual; 

距離傳遞的參數除去時間因素的長篇大論方式。這做同樣的事情:

Select trunc(pdate) 
into pformateddate 
from dual; 

還是確如託尼指出,一個簡單的任務:

pformateddate := trunc(pdate); 
+0

已經得到了...看@評論 – Husky110 2010-07-28 09:53:06

+0

確實「pformateddate:= trunc(pdate);」 ! – 2010-07-28 09:56:55

+0

@Tony。是的,我原本以爲它是sysdate,然後一旦我發現它是一個參數,就沒有遵循。 – APC 2010-07-28 10:16:22

相關問題