2015-11-10 62 views
-1

嘿傢伙試圖使用循環,雖然天,所以我的腳本不會失敗循環無法執行每次我不知道我在做什麼錯但是我知道一個事實選擇語句是好的,工作它只是循環我有麻煩也是有可能有循環檢查表中的最大日期刪除只有最近一天的情況下不完整的數據,然後添加只有什麼需要日期?Oracle PL/SQL循環問題

錯誤行41列4: PL/SQL:ORA-00933:SQL命令不能正確地結束 ORA-06550:行7米1列:忽略 PL/SQL語句

delete Target_table 
commit; 

DECLARE 
    i_date date; 
BEGIN 
    i_date := '01-Jan-2014'; 
WHILE i_date < sysdate LOOP 

insert into Target_table 
Select field_1, 
     field_2 
From Data_table_1 
LEFT JOIN Data_table_2 
ON Data_table_1.ACCOUNT_ID=Data_table_2.account_id 
Where Data_table_1.Date >= i_date 
     and Data_table_1.Date < i_date+1 
     and Data_table_1.COST_CENTRE In ('1','2','3','4','5','6','7','8','9','10') 
    And Data_table_1.field_3 In ('C', 'D') 
    And Data_table_1.field_4 Is Null 
    And Data_table_2.field_5 in (1,2) 
    END; 
commit; 
    i_date := i_date +1; 
    END LOOP; 
END 
+0

總是有助於發佈錯誤消息。使用DateAdd():'DATEADD(d,1,i_date)'。另外,將'i_date'聲明爲'YYYY-MM-DD'。 – Parfait

+0

我的日期被初始化爲一個字符串。將其轉換爲日期'i_date = to_date('01 -JAN-2014','DD-MON-YYYY')' – brenners1302

+0

添加了錯誤 –

回答

0

我有在你的代碼中做了一些修改。我認爲這應該工作。我也提到了我已經做出修改的評論。

DECLARE 
    i_date DATE; 
BEGIN 
    DELETE Target_table; -- Inserted inside the Anonymous block 
    i_date  := to_date('10-Nov-2015','DD-MON-YYYY'); -- Specified Date format 
    WHILE i_date < sysdate 
    LOOP 
    INSERT INTO Target_table 
    SELECT field_1, 
     field_2 
    FROM Data_table_1 
    LEFT JOIN Data_table_2 
    ON Data_table_1.ACCOUNT_ID  =Data_table_2.account_id 
    WHERE Data_table_1.Date_field1 >= i_date 
    AND Data_table_1.Date_field1 < i_date+1 
    AND Data_table_1.COST_CENTRE   IN ('1','2','3','4','5','6','7','8','9','10') 
    AND Data_table_1.field_3    IN ('C', 'D') 
    AND Data_table_1.field_4  IS NULL 
    AND Data_table_2.field_5  IN (1,2); 
    dbms_output.put_line(i_date); 
    i_date := i_date +1; 
    END LOOP; 
COMMIT; -- Added commit at the end 
END; 
1

只是想提一下,最有效的方法是在PL/SQL可以避免的情況下,儘可能在SQL中編寫查詢。 (SQL和PL/SQL塊之間的上下文切換涉及開銷)。這是我如何寫查詢。使用CONNECT的新塊將生成i_date和sysdate之間的所有日期

DECLARE 
i_date DATE; 
BEGIN 

DELETE Target_table; 

SELECT field_1, 
     field_2 
    FROM Data_table_1 
    JOIN (SELECT i_date + level -1 as i_date_new 
      FROM DUAL 
     CONNECT BY LEVEL<=TRUNC(sysdate)-i_date 
     )dates_generated 
     ON Data_table_1.Date_field1 >= dates_generated.i_date_new 
    AND Data_table_1.Date_field1 < dates_generated.i_date_new+1 
    LEFT JOIN Data_table_2 
    ON Data_table_1.ACCOUNT_ID  =Data_table_2.account_id 
    WHERE Data_table_1.COST_CENTRE   IN ('1','2','3','4','5','6','7','8','9','10') 
    AND Data_table_1.field_3    IN ('C', 'D') 
    AND Data_table_1.field_4  IS NULL 
    AND Data_table_2.field_5  IN (1,2); 

END;