【问题标题】:Database agnostic command to update if exists otherwise insert(UPSERT) Spring boot数据库不可知的命令,如果存在则更新,否则插入(UPSERT)Spring boot
【发布时间】:2021-11-05 16:45:02
【问题描述】:

我在 oracle 中有一个查询,如果存在,基本上将激活标志更新为是,如果不存在,则添加带有活动标志是的新条目。 这个查询不能很好地配合我正在做的 postgres 转换工作。我尝试查找,但找不到适用于这两种情况的查询。

有人有这样的例子可以在 postgres 和 oracle 上工作吗?

一些上下文:

oracle sql: update if exists else insert

这是我现有的仅在 java 中的 Oracle 查询

 private static final String SQL_UPDATE_OR_INSERT_USER ="
DECLARE 
  u_name users.name%type := (:name); 
  u_key users.ukey%type := (:ukey); 
BEGIN  
  UPDATE users SET ACTIVE=1 WHERE ukey IN (u_key) and  lower(name) = lower(u_name); 
  IF ( sql%rowcount = 0 ) THEN 
    INSERT INTO users(user_id, ukey, name, ACTIVE) VALUES 
    (hibernate_sequence.nextval, u_key, u_name, 1); 
  END IF;   
END;";

这不适用于 postgres,并且 postgres 看起来与这个非常不同。

【问题讨论】:

  • SQL 标准完全针对您的情况类型指定了MERGE 语句。请注意,这是一条 SQL 语句;你写的是 PL/SQL 代码,它“不可知”的可能性为零。即使使用MERGE - 虽然标准指定了它,但我不知道哪些数据库产品确实支持它,哪些不支持; Oracle 有,所以在 Oracle 中你应该使用它(而不是你现在拥有的 PL/SQL 代码)。
  • @SayanMalakshinov 我将尝试使用合并重写它
  • @mathguy 这是我正在修复的遗留代码。我的数据库知识充其量也很糟糕,我会尝试将其重构为用户 mereg。
  • @SayanMalakshinov:Postgres 不支持 MERGE 语句。不要使用互联网上的随机发现(在本例中是关于实施它的讨论)作为参考。如果支持特定命令,唯一的权威来源是the manual
  • @a_horse_with_no_name 嘿,我正在尝试使用 INSERT INTO ON CONCFLICT。但我的问题是我想为一列检查多行。有没有办法将 where 子句放在冲突条件中

标签: java postgresql oracle spring-boot


【解决方案1】:

尽管有标准,但在某些情况下(有些人会说大多数情况),任务没有与数据库无关的流程。不幸的是,这就是其中之一。关于 Oracle 的 Postgres 中您可以获得的最接近的是:(请参阅带有 -- 的行

DO $$                                            --<<< added
    DECLARE 
      u_name users.name%type := (:name); 
      u_key users.ukey%type := (:ukey); 
      sql_rowcount integer;                      --<<< added
    BEGIN  
      UPDATE users SET ACTIVE=1 WHERE ukey IN (u_key) and  lower(name) = lower(u_name); 
      
      GET DIAGNOSTICS sql_rowcount = ROW_COUNT;  --<<< added 
     
      IF ( sql_rowcount = 0 ) THEN               --<<< changed 
        INSERT INTO users(user_id, ukey, name, ACTIVE) VALUES 
        (hibernate_sequence.nextval, u_key, u_name, 1); 
      END IF;   
    END;
$$;                                              --<<< added

【讨论】:

    猜你喜欢
    • 2015-12-17
    • 1970-01-01
    • 2016-11-19
    • 2016-01-14
    • 1970-01-01
    • 1970-01-01
    • 2016-02-06
    • 1970-01-01
    • 2014-05-05
    相关资源
    最近更新 更多