如何在 Postgresql 中编写更新函数(存储过程)?
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/21087710/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
How to write update function (stored procedure) in Postgresql?
提问by Iren Patel
I want to create an update function
(stored procedure) in postgresql, I have searched many times on google, but didn't find a proper example of an update function (stored procedure). How can I write an update function in Postgresql and change the existing data in a table?
我想update function
在 postgresql 中创建一个(存储过程),我在谷歌上搜索了很多次,但没有找到更新函数(存储过程)的正确示例。如何在 Postgresql 中编写更新函数并更改表中的现有数据?
Thanks in advance.
提前致谢。
Example of Function
CREATE OR REPLACE FUNCTION updateuser_login(userloginidp integer, usercategoryidf integer, usertypeidf integer, usertypereferenceidf integer, loginname text, loginpassword text, menutypeidf integer, username text, dashboardconfig text, careprovideridf integer, isactive boolean)
RETURNS void AS
$BODY$BEGIN
UPDATE tbuserlogin
SET usercategoryidf="@usercategoryidf",
usetypeidf="@usertypeidf",
usertypereferenceidf="@usertypereferenceidf",
loginname="@loginname",
loginpassword="@loginpassword",
menutypeidf="@menutypeidf",
username="@username",
dashboardconfig="@dashboardconfig",
careprovideridf="@careprovideridf",
isactive="@isactive"
WHERE userloginidp = "@userloginidp";
END$BODY$
LANGUAGE plpgsql VOLATILE
COST 100;
ALTER FUNCTION updateuser_login(integer, integer, integer, integer, text, text, integer, text, text, integer, boolean)
OWNER TO postgres;
回答by Denis de Bernardy
You can find excellent examples of this kind of stuff in the PGXN site's source code:
您可以在 PGXN 站点的源代码中找到此类内容的优秀示例:
https://github.com/pgxn/pgxn-manager/tree/master/sql
https://github.com/pgxn/pgxn-manager/tree/master/sql
Example from the users sql file:
来自用户 sql 文件的示例:
CREATE OR REPLACE FUNCTION update_user(
nickname LABEL,
full_name TEXT DEFAULT NULL,
email EMAIL DEFAULT NULL,
uri URI DEFAULT NULL,
twitter CITEXT DEFAULT NULL
) RETURNS BOOLEAN LANGUAGE plpgsql SECURITY DEFINER AS $$
/*
% SELECT update_user(
nickname := 'theory',
full_name := 'David E. Wheeler',
email := '[email protected]',
uri := 'http://www.justatheory.com/',
twitter :- 'theory'
);
update_user
─────────────
t
Update the specified user. The user must be active. The nickname cannot be
changed. The password can only be changed via `change_password()` or
`reset_password()`. Pass other attributes as:
full_name
: The full name of the user.
email
: The email address of the user. Must be a valid email address as verified by
[Email::Valid](http://search.cpan.org/perldoc?Email::Valid).
uri
: Optional URI for the user. Should be a valid URI as verified by
[Data::Validate::URI](http://search.cpan.org/perldoc?Data::Validate::URI).
twitter
: Optional Twitter username. A leading "@" wil be removed.
Returns true if the user was updated, and false if not.
*/
BEGIN
UPDATE users
SET full_name = COALESCE(update_user.full_name, users.full_name),
email = COALESCE(update_user.email, users.email),
uri = COALESCE(update_user.uri, users.uri),
twitter = COALESCE(trim(leading '@' FROM update_user.twitter), users.twitter),
updated_at = NOW()
WHERE users.nickname = update_user.nickname
AND users.status = 'active';
RETURN FOUND;
END;
$$;
回答by darkangel
Postgresql reads double quotes as a name of column.. Replace it with single quote or you can just use your parameters..
Postgresql 读取双引号作为列的名称.. 用单引号替换它,或者你可以只使用你的参数..
CREATE OR REPLACE FUNCTION updateuser_login(userloginidp integer,
usercategoryidf integer, usertypeidf integer, usertypereferenceidf
integer, loginname text, loginpassword text, menutypeidf integer,
username text, dashboardconfig text, careprovideridf integer, isactive
boolean) RETURNS void AS
$BODY$
BEGIN
UPDATE tbuserlogin
SET usercategoryidf = '@usercategoryidf',
usetypeidf = '@usertypeidf',
usertypereferenceidf = '@usertypereferenceidf',
loginname = '@loginname',
loginpassword = '@loginpassword',
menutypeidf = '@menutypeidf',
username = '@username',
dashboardconfig = '@dashboardconfig',
careprovideridf = '@careprovideridf',
isactive = '@isactive'
WHERE userloginidp = '@userloginidp';
END;
$BODY$
LANGUAGE plpgsql VOLATILE
COST 100;
ALTER FUNCTION updateuser_login(integer, integer, integer, integer, text, text, integer, text, text, integer, boolean)
OWNER TO postgres;