我在oracle中有一个查询,基本上更新激活标志为是,如果存在,添加的新条目与活动标志是,如果不存在。这个查询不适合我正在做的postgres转换工作。我试着找,但找不到一个查询,将工作的两种情况。
是否有人有这样的例子,将工作在postgres和oracle ?
一些背景:
sql: update if exists else insert
这是我现有的Oracle仅在java中的查询
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和这个看起来很不一样。
尽管有标准,但在某些情况下(有些人会说大多数情况下),任务没有与数据库无关的进程。不幸的是,这就是其中之一。在Postgres中,最接近Oracle的是:(参见带——<<<的行)>
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