记录处理如果记录存在UPDATE,则在PLSQL中插入

时间:2012-05-10 22:28:20

标签: oracle stored-procedures plsql insert

I have three tables:

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

我需要检查参考以查看参考(Ref_Tracking)中是否存在来自CUSTOMER的列(跟踪)中的记录。然后检查参考(项目)中的相关记录是否存在于PROJECT(项目)中。

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

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

我有一个游标正在循环使用Customer Table的所有变量。

我在下面尝试但没有填充数据我不确定我做错了什么,或者是否有更好的方法来做到这一点。我正在学习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 个答案:

答案 0 :(得分: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。这似乎也不太可能。我打赌写入的查询总是返回多行,这实际上是你所期望的,所以你的异常处理程序吞噬了你的异常。反过来,这意味着您的代码运行,没有按预期执行,并且不会抛出任何错误。在这种情况下,您可能会更好地删除异常处理程序并让代码在遇到错误时抛出异常。至少在这种情况下,您可以使用一些信息来调试问题。只有当你可以对它们做一些有用的事情,或者如果你真的很高兴忽略这个错误时,才能捕获异常。