【发布时间】: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