2012-05-10 109 views
0
I have three tables: 

CUSTOMER     Columns (Tracking)        
Reference    Columns (Ref_Tracking, Project) 
PROJECT      Columns(Project) 

我需要檢查引用以查看引用(Ref_Tracking)中是否存在來自CUSTOMER的列(跟蹤)中的記錄。然後檢查參考文獻(項目)中的相關記錄是否存在於PROJECT(項目)中。記錄處理如果記錄存在PLSQL中的更新,插入

If they exist UPDATE PROJECT 
SET PROJECT.NAME = CURSOR VARIABLES 
     ETC 
     ETC 

If they do not exist 
INSERT INTO REFERENCE 
VALUES (CURSOR VALUES) 

我有一個遊標正在循環與客戶表的所有變量。

我已經在下面嘗試過,但沒有數據正在填充我不知道我做錯了什麼,或者如果有更好的方法來做到這一點。我學習PL/SQL,所以不知道我是否在正確的軌道上。

CREATE OR REPLACE PROCEDURE P1 
    AS 
     V_NAME   CUSTOMER.NAME%TYPE; 
     V_TRACKING  CUSTOMER.TRACKING%TYPE; 
     V_ADDRESS   CUSTOMER.ADDRESS%TYPE; 
     V_CITY   CUSTOMER.CITY%TYPE; 
     V_STATE   CUSTOMER.STATE%TYPE; 
     V_NUMBER   CUSTOMER.NUMBER%TYPE; 
     V_ Ref   Reference.REF_TRACKING%TYPE := NULL; 
     V_Project   REFERENCE.PROJECT%TYPE := NULL; 
     V_Project_2  PROJECT.PROJECT%TYPE := NULL; 

     CURSOR C01 
     IS 
      SELECT C.Name, 
        C.Tracking, 
        C.Address, 
        C.City, 
        C.State, 
        C.Number 
       FROM Customer 
      WHERE C.Number = Another_Table; 
    BEGIN 
     FOR fetchc01 IN C01 
     LOOP 
     BEGIN 
      Select Ref_Tracking, R.Project, P.Project 
      Into V_ Ref, V_Project, V_Project_2 
      From Customer C, Reference R, Project P 
      Where R.Project = P.Project 
      AND Tracking = Ref_Tracking; 
     EXCEPTION 
      WHEN TOO_MANY_ROWS 
      THEN 
       NULL; 
      WHEN NO_DATA_FOUND 
      THEN 
       NULL; 
     END; 

     BEGIN 
      IF V_Ref = fetch01.Tracking 
      Then 
      Insert Into Sample_Project 
       VALUES (V_Name, V_Tracking, V_Location) 
     END 
    END LOOP; 
    END; 
+1

你的問題到底是什麼? – Bohemian

+0

該過程編譯但它不會返回有關插入或更新的任何數據。想知道是否有更有效的做法或我做錯了什麼。謝謝! – user1307149

回答

0

這個查詢

Select Ref_Tracking, R.Project, P.Project 
    Into V_ Ref, V_Project, V_Project_2 
    From Customer C, Reference R, Project P 
Where R.Project = P.Project 
    AND Tracking = Ref_Tracking; 

是內循環,但它不依賴於任何從環到另一個的一次迭代變化。這對我來說似乎不太可能。查詢應該移到循環之外,或者更可能缺少某些謂詞。也許你想要的東西,像

Select Ref_Tracking, R.Project, P.Project 
    Into V_ Ref, V_Project, V_Project_2 
    From Customer C, Reference R, Project P 
Where R.Project = P.Project 
    AND Tracking = Ref_Tracking 
    AND tracking = fetchc01.tracking; 

此外,異常處理程序

EXCEPTION 
     WHEN TOO_MANY_ROWS 
     THEN 
      NULL; 
     WHEN NO_DATA_FOUND 
     THEN 
      NULL; 

是說你,如果你的查詢返回0或大於1名的結果讓你的地方的價值觀你完全樂於變量V_RefV_ProjectV_Project_2未定義或NULL。這似乎也不太可能。我敢打賭,寫入的查詢總是返回多行,而這實際上是你期望的,所以你的異常處理程序吞噬你的異常。反過來,這意味着你的代碼運行,不會做你期望的,也不會拋出任何錯誤。在這種情況下,您可能會更好地移除異常處理程序,並在遇到錯誤時讓代碼引發異常。至少這樣,您可以使用一些信息來調試問題。只有在您可以對他們做一些有用的事情時纔會發現異常,或者如果您真的很高興忽略了錯誤。

相關問題