PostgreSQL通过更新/插入查询返回受影响的行

PostgreSQL通过更新/插入查询返回受影响的行,sql,postgresql,return,plpgsql,Sql,Postgresql,Return,Plpgsql,嗯。我有两个问题。两者的作用相同: 1) 如果配置文件已经存在,则仅使用新信息更新配置文件 2) 如果配置文件不存在,则创建一个新的配置文件 限制: 1) 用户名是唯一的(不能重复) 2) 用户id是唯一的(不能重复) 我试图从服务器获取布尔响应,这样我的应用程序就可以检查查询是否有效执行,行是否受到影响。例如,如果用户希望更改其用户名,但他选择的用户名已在使用中,则查询将不会执行,因此不会影响任何行。我需要某种返回(受影响行的计数?)或真/假,告诉我一行是否受影响 我是postgreSQL的新

嗯。我有两个问题。两者的作用相同:

1) 如果配置文件已经存在,则仅使用新信息更新配置文件 2) 如果配置文件不存在,则创建一个新的配置文件

限制: 1) 用户名是唯一的(不能重复) 2) 用户id是唯一的(不能重复)

我试图从服务器获取布尔响应,这样我的应用程序就可以检查查询是否有效执行,行是否受到影响。例如,如果用户希望更改其用户名,但他选择的用户名已在使用中,则查询将不会执行,因此不会影响任何行。我需要某种返回(受影响行的计数?)或真/假,告诉我一行是否受影响

我是postgreSQL的新手,非常感谢任何形式的帮助。谢谢=) 向何塞·玛丽亚·兰达致意()



我将创建一个函数,让它返回文本或带有结果的枚举。以下是一个例子:

CREATE OR REPLACE FUNCTION people.update_profile(USERID text,
    USER_NAME text, PHOTO_URL text)
  RETURNS text AS
$BODY$
DECLARE
  rec profile;
  matching_uid boolean;
  matching_name boolean;
  matching_both boolean;
  result text;
BEGIN

  for rec in select * from people.profile where user_id = USERID or USER_NAME = alias
  loop
    if rec.user_id = USERID and rec.alias = USER_NAME then matching_both = true;
    elsif rec.user_id = USERID then matching_uid = true;
    elsif rec.alias = USER_NAME then matching_name = true;
    end if;
  end loop;

  if matching_both then
    update people.profile
    set profile_picture = PHOTO_URL
    where user_id = USERID;

    result := 'Photo Updated';    
  elsif matching_name then
    result := 'Username is in use.  Please choose another';
  elsif matching_uid then
    update people.profile
    set profile_picture = PHOTO_URL, alias = USER_NAME
    where user_id = USERID;

    result := 'Photo and User Name Updated';
  else
    insert into people.profile
    (user_id, alias, profile_picture)
    values (USERID, USER_NAME, PHOTO_URL);

    result := 'New User Added';
  end if;

  return result;
END;
$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100;
如果您这样调用函数:

select people.update_profile('hamb', 'Hambone', 'http://purple.com');
它会告诉你它是否成功更新,如果成功,采取了什么措施

插入/更新后,您肯定可以返回受以下内容影响的行数:

GET DIAGNOSTICS rowcount = ROW_COUNT;

但考虑到函数只返回1或0,我认为这些消息的文本或枚举将更有价值。

谢谢!!!这就成功了!!!为什么我以前没想过???你真的帮了我的忙。再次感谢!!!
select people.update_profile('hamb', 'Hambone', 'http://purple.com');
GET DIAGNOSTICS rowcount = ROW_COUNT;