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)

Customer テーブルのすべての変数をループするカーソルがあります。

以下で試してみましたが、データが入力されていません。何が間違っているのか、またはもっと良い方法があるのか​​ わかりません。私は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 または複数の結果を返し、ローカル変数V_RefV_Project、およびV_Project_2未定義または NULL である必要があります。それもありそうにない。書かれたクエリは常に複数の行を返し、これが実際に期待したものであるため、例外ハンドラーが例外を飲み込んでいることに賭けます。これは、コードが実行され、期待どおりに動作せず、エラーがスローされないことを意味します。この場合、例外ハンドラーを完全に削除し、エラーが発生した場合にコードが例外をスローできるようにした方がよいでしょう。少なくともそのようにして、問題をデバッグするために使用する情報が得られます。例外をキャッチする必要があるのは、それらを使って何か役に立つことができる場合、またはエラーを無視して本当に満足している場合だけです。

于 2012-05-11T00:04:02.897 に答える