Why is Postgres throwing "ERROR: procedure returned null record"?
Why is Postgres throwing "ERROR: procedure returned null record"?
下面是一个 returns 没有记录的虚拟查询:
WITH no_records AS (
SELECT usesysid AS id, usename AS value
FROM pg_user
WHERE usename = 'non-existent-user'
)
SELECT
jsonb_build_object(
'id', id,
'value', value
)
FROM no_records;
结果:
jsonb_build_object
--------------------
(0 rows)
但是当我使用 INOUT
参数
在 Postgres 13 过程中包装相同的查询时
CREATE OR REPLACE PROCEDURE get_something(
INOUT result JSONB DEFAULT NULL
)
LANGUAGE SQL
AS $$
WITH null_record AS (
SELECT usesysid AS id, usename AS value
FROM pg_user
WHERE usename = 'non-existent-user'
)
SELECT
jsonb_build_object(
'id', id,
'value', value
)
FROM null_record;
$$;
...我称之为
CALL get_something();
...我收到以下错误:
ERROR: procedure returned null record
with a as(
SELECT usesysid AS id, usename AS value
FROM pg_user
WHERE usename = 'non-existent-user')
select row_to_json(a.*) from a;
会return
row_to_json
-------------
(0 rows)
那里什么都没有,它不是空值,空值是未定义的值。但是 null 是某种东西。这里什么都没有。
CREATE PROCEDURE test_proc1(inout JSONB DEFAULT NULL)
LANGUAGE plpgsql
AS $$
BEGIN
NULL;
END;
$$;
称之为:call test_proc1(null::jsonb);
它将 return:
column1
---------
[null]
(1 row)
下面是一个 returns 没有记录的虚拟查询:
WITH no_records AS (
SELECT usesysid AS id, usename AS value
FROM pg_user
WHERE usename = 'non-existent-user'
)
SELECT
jsonb_build_object(
'id', id,
'value', value
)
FROM no_records;
结果:
jsonb_build_object
--------------------
(0 rows)
但是当我使用 INOUT
参数
CREATE OR REPLACE PROCEDURE get_something(
INOUT result JSONB DEFAULT NULL
)
LANGUAGE SQL
AS $$
WITH null_record AS (
SELECT usesysid AS id, usename AS value
FROM pg_user
WHERE usename = 'non-existent-user'
)
SELECT
jsonb_build_object(
'id', id,
'value', value
)
FROM null_record;
$$;
...我称之为
CALL get_something();
...我收到以下错误:
ERROR: procedure returned null record
with a as(
SELECT usesysid AS id, usename AS value
FROM pg_user
WHERE usename = 'non-existent-user')
select row_to_json(a.*) from a;
会return
row_to_json
-------------
(0 rows)
那里什么都没有,它不是空值,空值是未定义的值。但是 null 是某种东西。这里什么都没有。
CREATE PROCEDURE test_proc1(inout JSONB DEFAULT NULL)
LANGUAGE plpgsql
AS $$
BEGIN
NULL;
END;
$$;
称之为:call test_proc1(null::jsonb);
它将 return:
column1
---------
[null]
(1 row)