首页 > 解决方案 > 在 PL/pgSQL 中使用更新

问题描述

首先,我是 SQL 和 PostgreSQL 的新手。这可能是一个愚蠢的初学者的错误。

create or replace function temporary_function_for_getting(admission_number_text text,organization_id bigint,user_object_json json)
returns table(admission_number  text ,status text)
LANGUAGE plpgsql
    AS $function$
declare
    select_user_with_id text := 
                          'select $1 as admin,
                            case 
                                when $2 is null then ''Invalid organization ID''
                                when $1 is null then ''Invalid admission number''
                                when exists (update hsg_id_master set hsg_suffix=''something new'' where admission_number=$1 and organization_id=$2 returning hsg_suffix )
                                  then ''success''
                                else ''User does not exists.''
                            end;';
    begin 
    return query
    execute select_user_with_id using admission_number_text,organization_id;
     
end;
$function$ ;

^这不起作用给我一个错误

SQL 错误 [42601]:错误:“更新”处或附近的语法错误
其中:PL/pgSQL 函数temporary_function_for_getting(text,bigint,json) 第 13 行,位于 RETURN QUERY。

更新查询本身工作正常,不确定我做错了什么。如果有人能指出我的资源和/或执行相同过程的更好方法,将不胜感激。

标签: sqlpostgresqlplpgsql

解决方案


您似乎想要基本查询的更新 CTE。尝试这样的事情:

with u as (
      update hsg_id_master
          set hsg_suffix = ''something new''
           where admission_number = $1 and organization_id = $2 
           returning hsg_suffix 
     )
select $1 as admin,
       (case when $2 is null then ''Invalid organization ID''
             when $1 is null then ''Invalid admission number''
             when exists (select 1 from u)
             then ''success''
             else ''User does not exists.''
        end);

请注意,如果or是,update则不会更新任何行,因为该子句将评估为-- 过滤掉所有行。$1$2NULLwhereNULL


推荐阅读