2012-05-10 77 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。这似乎也不太可能。我敢打赌,写入的查询总是返回多行,而这实际上是你期望的,所以你的异常处理程序吞噬你的异常。反过来,这意味着你的代码运行,不会做你期望的,也不会抛出任何错误。在这种情况下,您可能会更好地移除异常处理程序,并在遇到错误时让代码引发异常。至少这样,您可以使用一些信息来调试问题。只有在您可以对他们做一些有用的事情时才会发现异常,或者如果您真的很高兴忽略了错误。

相关问题