Postgresql &引用;条款条目中缺少“;在PLPGSQL函数中更新表

Postgresql &引用;条款条目中缺少“;在PLPGSQL函数中更新表,postgresql,sql-update,plpgsql,Postgresql,Sql Update,Plpgsql,我正在尝试更新Postgres中的一个表,但出现以下错误。 Userid是主键 创建或替换函数public.update\u user(用户名字符不同, 用户标识字符变化, roleid整数, deptid整数, 状态(整数) 将整数返回为 $$ 开始 更新公共。“M_User”设置公共。“M_User”。User_name=public.UPDATE_User.username, public.M_User.User_role_id=public.update_User.roleid, pub

我正在尝试更新Postgres中的一个表,但出现以下错误。
Userid
是主键

创建或替换函数public.update\u user(用户名字符不同,
用户标识字符变化,
roleid整数,
deptid整数,
状态(整数)
将整数返回为
$$
开始
更新公共。“M_User”设置公共。“M_User”。User_name=public.UPDATE_User.username,
public.M_User.User_role_id=public.update_User.roleid,
public.M_User.dept_id=public.update_User.deptid,
public.M_User.status=public.update_User.status
其中public.M_User.User_id=userid;
返回0;
结束
$$
语言“plpgsql”;
电话:

错误:

声明 SQL状态:42P01

如何解决此问题?

表示可以将输入引用为
函数\u名称。参数\u名称
,因此请尝试删除对
模式\u名称的引用

UPDATE public."M_User" 
SET user_name = update_user.username, 
    user_role_id = update_user.roleid, 
    dept_id = update_user.deptid, 
    status = update_user.status 
WHERE user_id = update_user.userid;
说明可以将输入引用为
函数\u名称.参数\u名称
,因此请尝试删除对
模式\u名称的引用

UPDATE public."M_User" 
SET user_name = update_user.username, 
    user_role_id = update_user.roleid, 
    dept_id = update_user.deptid, 
    status = update_user.status 
WHERE user_id = update_user.userid;
创建或替换函数public.update\u user(\u username varchar,
_userid varchar,
_roleid整数,
_deptid整数,
_状态(整数)
返回整数
语言sqlas
$func$
更新公共。“M_用户”u
设置用户名=\u用户名
,用户角色id=\u角色id
,部门id=\u部门id
,status=\u status
其中u.user\u id=\u userid
和(u.user\u name、u.user\u role\u id、u.dept\u id、u.status)不同于
(_用户名,_角色ID,_部门ID,_状态)--可选添加
返回u.user\u id;
$func$
您可以使用函数名限定函数参数以消除歧义,但这通常是一个笨拙的解决方案。重命名函数时中断。还有其他方法。见:

我喜欢用下划线作为参数和变量的前缀,而从不对列名使用下划线。不是标准,而是普遍的惯例。养成对所有列名进行表限定的习惯,这样您就安全了。表格别名有助于降低噪音。基础知识

但是,
UPDATE
语句中的目标列不能限定。(它们从不含糊不清。)

我添加了一个可选谓词来跳过更新,如果它不会改变任何东西的话。见:

对此,您不需要PL/pgSQL。(当然可以)一个更简单的SQL函数可以完成这项工作。见:

返回0
没有任何用处。我将其更改为返回更新行的有效
用户id
。(通常与输入
\u userid
相同,但它可能与触发器不同。)重要的区别是:只有在实际更新行时才能获得返回值,从而使其有用。否则,您不妨将函数声明为
返回void
。与无条件
返回0一样有用,但更便宜。

创建或替换函数public.update\u user(\u username varchar,
_userid varchar,
_roleid整数,
_deptid整数,
_状态(整数)
返回整数
语言sqlas
$func$
更新公共。“M_用户”u
设置用户名=\u用户名
,用户角色id=\u角色id
,部门id=\u部门id
,status=\u status
其中u.user\u id=\u userid
和(u.user\u name、u.user\u role\u id、u.dept\u id、u.status)不同于
(_用户名,_角色ID,_部门ID,_状态)--可选添加
返回u.user\u id;
$func$
您可以使用函数名限定函数参数以消除歧义,但这通常是一个笨拙的解决方案。重命名函数时中断。还有其他方法。见:

我喜欢用下划线作为参数和变量的前缀,而从不对列名使用下划线。不是标准,而是普遍的惯例。养成对所有列名进行表限定的习惯,这样您就安全了。表格别名有助于降低噪音。基础知识

但是,
UPDATE
语句中的目标列不能限定。(它们从不含糊不清。)

我添加了一个可选谓词来跳过更新,如果它不会改变任何东西的话。见:

对此,您不需要PL/pgSQL。(当然可以)一个更简单的SQL函数可以完成这项工作。见:


返回0
没有任何用处。我将其更改为返回更新行的有效
用户id
。(通常与输入
\u userid
相同,但它可能与触发器不同。)重要的区别是:只有在实际更新行时才能获得返回值,从而使其有用。否则,您不妨将函数声明为
返回void
。与无条件
返回0一样有用
,但更便宜。

此外,
设置column\u name=column\u val
必须只是列名而不是表名。column\u name per'…在目标列的规范中不包括表名…'。所以,
user\u name=update\u user.username
@AdrianKlaver当然可以,谢谢您的收看!另外,
SET column\u name=column\u val
必须只是列名而不是表名。column\u name per'…在目标列的规范中不包括表名…'。所以,
user\u name=update\u user.username
@AdrianKlaver当然,t
UPDATE public."M_User" 
SET user_name = update_user.username, 
    user_role_id = update_user.roleid, 
    dept_id = update_user.deptid, 
    status = update_user.status 
WHERE user_id = update_user.userid;