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

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

Мне нужно проверить ссылку, чтобы увидеть, имеются ли записи в столбце (отслеживание) из CUSTOMER в Reference (Ref_Tracking). Затем проверьте, существует ли связанная запись из Reference (Project) в PROJECT (Project).Обработка записи Если существует запись UPDATE, INSERT в PLSQL

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

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

У меня есть курсор, который перебирает все переменные для таблицы клиентов.

Я пробовал ниже, но данные не заполняются. Я не уверен, что я делаю неправильно, или если есть лучший способ сделать это. Im обучение 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_Ref, V_Project и V_Project_2 не определены или NULL. Это также кажется маловероятным. Я хотел бы утверждать, что в запросе, как написано, всегда возвращается несколько строк, и это на самом деле то, что вы ожидали, чтобы ваш обработчик исключений проглатывал ваше исключение. Это, в свою очередь, означает, что ваш код работает, не делает то, что вы ожидаете, и не бросает никаких ошибок. Вероятно, вам будет намного лучше в этом случае полностью удалить обработчик исключений и позволить вашему коду генерировать исключение, если оно встретит ошибку. По крайней мере, у вас есть некоторая информация, которая будет использоваться для отладки проблемы. Исключения должны быть только пойманы, если вы можете сделать что-то полезное с ними или если вы действительно счастливы игнорировать ошибку.

Смежные вопросы