2012-12-18 46 views
0

我正在嘗試編寫一個簡單的PL/SQL過程,但我不斷收到錯誤,我不明白。有一些 語法失敗,如果有人能幫助我,我將不勝感激。 我需要創建一個程序,允許我插入一個特定的人(varchar2)與兩個日期(日期),他的合同期限。然而,他的合同不能在現有日期之間,因此不能重疊,同一個人可以有多個聯繫人,但只能在完全不同的時間段之間。 我知道我需要使用INTERSECT,這只是我很困惑如何在這裏使用它,因爲我只有一個表。我之前有兩張桌子相交,我怎麼在這裏相交呢?我;米也不知道我是否可以有2如果發言 謝謝!創建正確的過程

CREATE OR REPLACE PROCEDURE test1 
(name    VARCHAR2, 
startDate  DATE, 
endDate   DATE) 
AS 
overlap  NUMBER := 0; 
CURSOR cursor IS 
SELECT date_from, date_to FROM contractTable; 
BEGIN 
    FOR row IN cursor LOOP 
    /*check if there is an overlap between dates*/ 
    IF (startDate, endDate) INTERESECT (SELECT date_from, date_to FROM ContractTable) THEN 
    overlap := overlap + 1;  
    END IF; 
    /*if there isn't, then insert new contact for this person*/ 
    IF overlap <= 0 THEN 
    INSERT INTO ContractTable VALUES(name, startDate, endDate); 
    END IF; 
    END test1; 

回答

0
CREATE PROCEDURE test1 (l_name IN VARCHAR2, l_start_date IN DATE, l_end_date IN DATE) 
IS 

    l_overlap_check NUMBER; 

BEGIN 

    SELECT count(*) INTO l_overlap_check 
     FROM contract 
    WHERE (l_start_date between start_date and end_date 
      OR 
      l_end_date between start_date and end_date) 
     AND l_name = name; 

    IF l_overlap_check = 0 THEN 
     INSERT INTO contract (name, start_date, end_date) 
         VALUES (l_name, l_start, l_end); 
    END IF; 

END; 

我沒有Oracle環境中方便,但應該是你所需要的。

+0

我會在程序中包含一個異常處理程序作爲「最佳實踐」。 – tale852150