2013-05-03 65 views
0

我有一個表有一個StartDate和EndDate字段,還有一大堆其他字段。我需要將StartDate & EndDate之間的所有日期的每條記錄分解到另一個表中,該表與外觀完全一樣,除了它具有CurrentDate字段和2個計算字段。 CurrentDate字段是我正在處理的StartDate和EndDate之間的當前日期。oracle sql打破記錄

我的問題是,由於這裏有很多字段,有沒有什麼簡單的方法可以在我的存儲過程中插入光標當前所在的整行,並且不需要列出這一列插入語句中的每一行?這太單調乏味了。

+0

您是否正在嘗試編寫一個查詢,該查詢使用不同的'CurrentDate'返回該行的多個副本?你是否試圖編寫將數據插入到另一個表中的代碼?還有別的嗎?你談論一個遊標,但是你也在談論一個'INSERT'語句。你是否需要這個PL/SQL,因爲你正在做一堆額外的操作?或者單個SQL語句會起作用,因爲這樣會更高效? – 2013-05-03 18:51:51

+0

單個sql語句會很好,但我不確定是否有可能使用1條記錄中的2個字段從1條記錄中「製作」更多記錄。 – user441521 2013-05-03 19:12:01

回答

0

如果您的源和目標表適合此配置文件:

  1. 目標表中的列是相同的源表中的列,並
  2. 新的目標列在末尾

...然後你可以這樣做:

INSERT INTO dest_table 
SELECT Source_Table.*, new_value 
    FROM Source_Table 
    WHERE Source_Table.PKValue = cursor.PKValue 

如果它是一個ca光標類似於目標表,像這樣可能工作本身,而是注意我沒有測試它:

CREATE PROCEDURE whatever IS 
    destRow dest_table%ROWTYPE; 
    CURSOR fromSourceTable IS 
    SELECT <your existing select list>, NULL AS new_value 
    FROM <the rest of your cursor query>; 
BEGIN 
    FOR destRow IN fromSourceTable LOOP 
    destRow.new_value = <the split date>; 
    INSERT INTO dest_table VALUES destRow; 
    END LOOP; 
END whatever; 

我要出去的肢體與NULL AS new_value。如果您遇到問題,請嘗試使用CAST(NULL AS DATE) AS new_value,如果您仍然遇到問題,請嘗試如SYSDATE AS new_value。再次,這沒有測試,但如果你認爲它是有希望的,並且執行有困難,我很樂意測試它。

+0

所以你的第二部分可以工作,但是我在目標表中有1個額外的列,這是正在分拆的日期。 – user441521 2013-05-03 19:13:09

+0

我可能會在這裏接近一點;我馬上更新我的答案。 – 2013-05-03 19:18:25

+0

我應該停止說「片刻」,只是說「幾分鐘」:)無論如何,答案都會更新。讓我知道這是否接近;這是一個有趣的問題,我很樂意在家測試,但前提是您認爲這種方法有承諾。 – 2013-05-03 19:26:05

0

在單個SQL語句中簡化數據很容易。假設你知道一個合理的最小和最大範圍內爲您begin_dateend_date(我假設2000年1月1日 - 2020年12月31日的時刻,但是可以很明顯的調整是)

WITH all_days AS (
    SELECT date '2000-01-01' + level dt 
    FROM dual 
CONNECT BY level <= date '2020-12-31' - date '2000-01-01' 
) 
SELECT <<list of colums from your table>>, 
     all_days.dt current_date 
    FROM your_table actual 
     JOIN all_days ON (actual.begin_date <= all_days.dt AND 
         actual.end_date >= all_days.dt) 

如果你不」我想要對開始日期和結束日期進行硬編碼,您也可以從您的表中獲取它們。這隻需要你第二次上桌,這通常效率較低。