2

我在 PL/SQL 中创建了一个基于主键将数据从一个表插入到另一个表的过程。我的程序运行良好,但我不知道如果主键已经存在,我将如何更新表 MAIN 的列 CODE_NUMBER。
实际上,我希望 MAIN 表的行在具有主键时得到更新,并在主键不存在时从 REGIONS 插入数据。

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

2 回答 2

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文档中声明的更多信息

于 2012-05-16T07:44:33.277 回答
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
    )
于 2012-05-16T07:41:29.443 回答