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

DB fiddle

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)