sql - 在 PL/SQL 中插入/更新

标签 sql plsql oracle11g plsqldeveloper

我在 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; 

最佳答案

无需使用 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 的信息文档中的声明

关于sql - 在 PL/SQL 中插入/更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10613942/

相关文章:

sql - 如何创建一个表,其中一列包含其他表的名称

sql - 操作数类型冲突 : date is incompatible with smallint error in sql server

sql - SQL INSERT 能否在 PL/SQL 中不引发异常的情况下失败

sql - 如何从表中检索最新数据

performance - Oracle 全部插入与插入

sql - 显示不存在的列的值

mysql - WHERE IN 子查询未按预期工作

mysql - 构造mysql大表

sql - 从旧样式到新样式的加入

java - 通过Java调用PL\SQL : Registering out parameter as boolean