在DB查询中设置标志值

时间:2016-11-16 10:02:16

标签: sql plsql oracle12c

如果存在特定ID,我的查询会更新表,否则会插入新值。

我想实现像 - :

这样的东西
public class ApplicationDbContext :DbContext
{
    public ApplicationDbContext()
        : base("MySQLConnectionString")
    {
    }

    public DbSet<Sector> Sectors { get; set; }

    public DbSet<Campus> Campuss { get; set; }
    public static ApplicationDbContext Create()
    {
        return new ApplicationDbContext();
    }
}

我现有的查询是

if(exists){
   update table,
   flag = 0}
else{
   insert into table,
   flag = 1}
return flag;

2 个答案:

答案 0 :(得分:1)

运行MERGE时,您可以使用SQL%ROWCOUNT来获取受影响的行数。但是,您无法确定是否应用了插入或更新,甚至是更新了多少行以及插入了多少行。因此,您必须事先检查相关行是否存在。而且,那么你知道要更新或插入自己,所以你不再需要MERGE

DECLARE
  v_count integer;
BEGIN
  select count(*) into v_count 
  from fcm_device_registration
  where device_ad_id = 1;

  if v_count = 0 then
    insert into fcm_device_registration 
      (device_ad_id, fcm_notification_id) values (1, 'Y');
  else
    update fcm_device_registration
    set fcm_notification_id = 'N', last_update_date = sysdate
    where device_ad_id = 1;
  end;
END;

变量v_count包含0或1(正如您所说,device_ad_id在表中是唯一的)。更新为1,插入为0。正好与你想要的相反。但是,您可以通过以下方式轻松派生您的旗帜:v_flag := 1 - v_count

答案 1 :(得分:1)

BEGIN
update  fcm_device_registration 
set fcm_notification_id='N',
last_update_date = SYSDATE
where device_ad_id = 1;
--in case of no update
if sql%rowcount = 0 then
  insert into fcm_device_registration(device_ad_id,fcm_notification_id) values (1,'Y');
  dbms_output.put_line('insert');
else  
  dbms_output.put_line('update');-- in case of record update
end if;
END;