0
I have three tables:

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

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

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;
4

1 回答 1

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_Ref非常V_Project高兴V_Project_2未定义或为 NULL。这似乎也不太可能。我敢打赌,所写的查询总是返回多行,这实际上是您所期望的,因此您的异常处理程序正在吞噬您的异常。反过来,这意味着您的代码可以运行,不会按照您的预期运行,并且不会引发任何错误。在这种情况下,您可能会更好地完全删除异常处理程序并让您的代码在遇到错误时抛出异常。至少这样,您就有一些信息可用于调试问题。只有当你可以对它们做一些有用的事情或者你真的很高兴忽略错误时,才应该捕获异常。

于 2012-05-11T00:04:02.897 回答