2012-05-16 1 views
2

Я сделал процедуру в PL/SQL, которая вставляет данные из одной таблицы в другую на основе первичного ключа. Моя процедура работает нормально, но я не могу понять, как я буду обновлять столбец CODE_NUMBER моей таблицы MAIN, если первичный ключ уже существует.
На самом деле, я хочу, чтобы строки MAIN таблицы обновлялись, когда у него есть первичный ключ и вставляются данные из REGIONS, когда первичный ключ не существует.Вставка/обновление в PL/SQL

DECLARE 
    variable number; 
    id number; 
    description varchar2 (100); 

    CURSOR C1 IS 
     select regions.REGION_ID variable 
     from regions; 

BEGIN 
     FOR R_C1 IN C1 LOOP 
      BEGIN 
       select regions.REGION_ID,regions.REGION_NAME 
       into id,description 
       from regions 
       where regions.REGION_ID = R_C1.variable; 
       ----If exists then update otherwise insert 
       INSERT INTO MAIN(ID, CODE_NUMBER) VALUES(id,description); 
       dbms_output.put_line(id ||' '|| 'Already Exists'); 
      EXCEPTION 
       WHEN DUP_VAL_ON_INDEX THEN 
       dbms_output.put_line(R_C1.variable); 
      END; 
     END LOOP; 
END; 

ответ

1

В этом случае я не могу видеть точку в курсоре. Почему вы не можете сделать это так:

--Update the rows 
UPDATE MAIN 
SET ID=regions.REGION_ID, 
    CODE_NUMBER=regions.[description] 
FROM MAIN 
JOIN regions 
    ON MAIN.ID=regions.REGION_ID; 

--Insert the new ones 
INSERT INTO MAIN(ID,CODE_NUMBER) 
SELECT 
    regions.REGION_ID, 
    regions.[description] 
FROM 
    regions 
WHERE NOT EXISTS 
    (
     SELECT 
      NULL 
     FROM 
      MAIN.ID=regions.REGION_ID 
    ) 
7

Нет необходимости делать это с помощью PL/SQL и курсоров. То, что вы действительно хотите сделать что-то вроде этого:

MERGE INTO MAIN dst 
USING (
    SELECT regions.REGION_ID id, 
     regions.REGION_NAME description 
    FROM regions 
) src 
ON src.id = dst.id 
WHEN MATCHED THEN UPDATE 
    SET dst.code_number = src.description 
WHEN NOT MATCHED THEN INSERT (id, code_number) 
    VALUES (src.id, src.description) 

Подробнее о SQL MERGE заявление в документации