UPSERT into table with dynamic table name

前端 未结 3 727
北荒
北荒 2020-12-11 14:27

Any better method to UPSERT into a table, provided :

  • Data upsert at ~1 row/second
  • Table Name is DYNAMIC, generated using ObjectID parameter passed to
3条回答
  •  暖寄归人
    2020-12-11 14:46

    MERGE works perfectly fine with Native dynamic SQL (EXECUTE IMMEDIATE):

    create table so_test(pk number not null primary key, value varchar2(20));
    
    insert into so_test(pk, value) values(1, 'one');
    
    declare
      l_SQL varchar2(4000);
      l_tablename varchar2(4000) default 'so_test';
    begin
      l_SQL := 'merge into ' || l_tablename || ' target' ||
        ' using (select 1 pk, ''eins'' value from dual union all
                 select 2 pk, ''zwei'' value from dual) source
          on (target.pk = source.pk)
          when matched then 
            update set target.value = source.value
          when not matched then
            insert values(source.pk, source.value)      
      ';
      dbms_output.put_line(l_sql);
      execute immediate l_SQL;
    end; 
    

    Could you please post the error message you get when using MERGE?

提交回复
热议问题