- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我目前正在学习大量 PostgreSQL,尤其是 PLPGSQL
,并且正在努力处理函数中的查询结果。我想围绕用户表创建一个包装器,稍后使用结果然后返回它。在我的例子中,用户和帐户是两个不同的表,我想一次性创建它。
我的第一个天真的方法是构建以下内容:
CREATE OR REPLACE FUNCTION schema.create_user_with_login (IN email varchar, IN password varchar, IN firstname varchar DEFAULT NULL, IN surname varchar DEFAULT NULL)
RETURNS schema.user
LANGUAGE plpgsql
VOLATILE
RETURNS NULL ON NULL INPUT
AS
$$
declare
created_user schema."user";
begin
INSERT INTO schema."user" ("firstname", "surname", "email")
VALUES (firstname, surname, email)
RETURNING * INTO created_user;
// [...] create accounts and other data using e.g. created_user.id
// the query should return the initially created user
RETURN created_user
end;
$$;
这种方法不起作用,因为 schema.user
有 NOT NULL
字段(具有该约束的域类型)并且会为声明的语句抛出异常:
domain schema."USER_ID" does not allow null values
所以也许它可以工作,但在那个受限的环境中不行。
我还尝试使用 RETURNS SETOF schema.user
并直接使用 RETURN QUERY INSERT ....
,但这不会返回所有列,而是返回一列所有数据。
我怎样才能实现将初始用户对象作为适当的用户行返回的效果,同时在函数内部提供数据?
我正在使用 Postgres 9.6。我的版本输出:
PostgreSQL 9.6.1 on x86_64-pc-linux-gnu, compiled by gcc (GCC) 4.8.2 20140120 (Red Hat 4.8.2-16), 64-bit
最佳答案
I also tried to use
RETURNS SETOF schema.user
and directlyRETURN QUERY INSERT
...., but this does not return all columns, but instead one column with all the data.
肯定会返回所有列。您必须像这样调用设置返回函数:
<b>SELECT * FROM</b> schema.create_user_with_login;
您必须将其声明为 RETURNS SETOF foo.users
以配合 RETURN QUERY
。
将您的函数声明为 STRICT
(RETURNS NULL ON NULL INPUT
的同义词)然后声明 NULL 参数默认值是无稽之谈:
... firstname varchar DEFAULT NULL, IN surname varchar DEFAULT NULL)
您不能将 NULL 值传递给定义为 STRICT
的函数,它只会返回 NULL 而什么都不做。虽然 firstname
和 surname
是可选的,但不要定义函数 strict(或传递空字符串或其他东西)
不要称你的模式为“schema”
。
不要使用 reserved word user
作为标识符。尽可能使用合法的、小写的、不带引号的标识符。
综合考虑,您的函数可能如下所示:
CREATE OR REPLACE FUNCTION foo.create_user_with_login (_email text
, _password text
, _firstname text = NULL
, _surname text = NULL)
RETURNS SETOF foo.users
LANGUAGE plpgsql AS -- do *not* define it STRICT
$func$
BEGIN
RETURN QUERY
WITH u AS (
INSERT INTO foo.users (firstname, surname, email)
VALUES (_firstname, _surname, _email)
RETURNING *
)
, a AS ( -- create account using created_user.id
INSERT INTO accounts (user_id)
SELECT u.user_id FROM u
)
-- more chained CTEs with DML statements?
TABLE u; -- return the initially created user
END
$func$;
是的,这是一个单个 SQL 语句,带有几个数据修改 CTE 来完成这一切。最快最干净。为方便起见,函数包装器是可选的。也可能是 LANGUAGE sql
。相关:
我在函数参数名称前加上下划线 (_email
) 以排除命名约定。这完全是可选的,但如果不这样做,您已经仔细跟踪了冲突参数、变量和列名的范围。
TABLE u
是 SELECT * FROM u
的缩写。
三种不同的情况:
单值:
单行
行集(= 表)
没有“表变量”,但有几个其他选项:
关于postgresql - 从 PL/pgSQL 函数中的 INSERT INTO 访问并返回结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42940546/
我正在使用源代码中的Postgres 13(Rel_13_STRATE分支),并且我使用的是来自apachea/age源代码的(Release/PG13/1.3.0分支)中的1.3.0版的Apache
我有 fusionpbx 和简单的 pgsql 工作......现在我已经用 bdr pgsql 创建了 HA fusionpbx 并且它工作正常但我不知道如何将数据从非 bdr pgsql 迁移到
我正在尝试安装 php7.0-pgsql,但总是得到 E: 无法定位软件包 phpXXX-pgsql 我在尝试 apt-get update apt-get install php7.0-pgsq
我有一个 Rails 应用程序,我正在尝试对其运行测试。在我能够成功运行 rake test:all 的前一天,一切都井井有条。今天,当我运行 rake test:all 时,我收到了这个错误: 我知
有时候我们项目中会遇到查询的字符串比较特殊:如自己本身待单引号 此时查询肯定报错。那么处理方式也很简单 只需要这样加一个单引号 这样就可以解决了 解决方式和MySQL方式不一样。 补充
1、网上一般说的方法如下: :=,赋值,比如user_id := 20; select into 赋值,比如 ?
我就废话不多说了,看代码吧~ ? 1
删除数据库的命令: ? 1
方法: pg10.0之前: select pg_switch_xlog(); pg10.0之后: select pg_switch_wal(); 备注:执行 pg_switch_xlog(
1. 获取表中普通信息:如字段名,字段类型等 ? 1
环境:VMware、CentOS-7-x86_64-DVD-2009.iso、nginx-1.26.1、php-7.2.0、postgresql-12 php最好安装对应php项目所需版本,否则会出
我正在尝试将字符串列数据排序为数字。我收到如下错误: ERROR: invalid input syntax for integer: "HEI001" SQL state: 22P02 我尝试过:
如果我将这两个 Postgres 函数定义保存在两个单独的 .sql 文件中: CREATE OR REPLACE FUNCTION column_exists(tablename text, col
我正在尝试在 Windows 10 64 位 (WAPP) 上使用 pgsql 扩展。 我有: 重新启动 Apache 取消注释 php.ini 中的所有 postgresql 扩展 使用LoadFi
我尝试使用 phpPgAdmin 在我的数据库中创建一个表。但是在生成代码后出现错误。 SQL 错误: ERROR: syntax error at or near "(" at character
我已经在 pgsql 中创建了一个存储过程。特定列中有一个 json 对象,我需要获取该 json 对象中数据的总和。在遇到空值之前,它可以完美运行。json 对象中的元素可以有空值。但是当我得到总和
我必须编写一个查询,以某种方式对我的用户名进行排序(排序),其中应优先使用特定字母(在名称中)进行排序。例如,如果我有用户 Lemon、Loger、Alan、Avon、Bland、Cavin、Clau
背景 我是 PostgreSQL 的新手,我在使用这个触发函数时遇到了一些问题,我在下面明显简化了这些问题。我可以要求帮助修复查询,但我认为我可以处理,而且我更关心的是我有很多这样的功能,我需要一种方
我正在尝试确定如何在 PgSQL 中将一年中的某一天转回日期。当我这样做时 select date '2013-01-01' + interval '53 days' 我得到一个时间戳: "2013-
这段代码没有错误,但没有任何数据变化,请帮助我。我想从一些库存表中多次更新数量 drop FUNCTION SP_PROSES_STOCK(noresep bigint, p_post_cd varc
我是一名优秀的程序员,十分优秀!