为什么 Postgresql 函数不能按预期工作

法鲁兹·亚萨

我有这样的桌子

 id|    booking_id       |       status         |         message             |          created_at
 ----------------------------------------------------------------------------------------------------------
 1 | 1467                | VALIDATE             | Validate Payment            | 2022-03-18 07:43:20.688+00
 2 | 1901                | SUCCESS              |                             | 2022-03-18 07:51:58.072+00
 3 | 1847                | FAILED               | payment is insufficient     | 2022-03-18 08:16:05.79+00

我创建这样的get函数

CREATE OR REPLACE FUNCTION get_booking_status(booking_id BIGINT)
  RETURNS JSONB
  LANGUAGE SQL
  SECURITY DEFINER
AS $$
SELECT to_jsonb(result)
FROM (SELECT * FROM booking.booking_status WHERE booking.booking_status.booking_id = booking_id) AS result
$$;

我试图这样调用函数

SELECT get_booking_status(1467)

但返回 json 全部 3 行而不是 1 行booking_id1467

你能解释根本原因吗?

保护者

问题的根本原因是将参数 () 命名为与表booking_id中的列名 ( booking_id) 相同。处理查询时,任何不合格的引用都遵循层次结构来确定正确的引用;第一个是表格列。在这种情况下,对booking_idwhere booking.booking_status.booking_id = booking_id的两个引用都被中断,因为引用了 table 列。那么对于表中的每一行来说都是如此。您基本上有 2 个选择:更改参数名称或使用函数名称限定。

CREATE OR REPLACE FUNCTION get_booking_status(booking_id BIGINT)
  RETURNS JSONB
  LANGUAGE SQL
  SECURITY DEFINER
AS $$
SELECT to_jsonb(result)
  FROM (SELECT * 
          FROM booking.booking_status 
         WHERE booking.booking_status.booking_id 
             = get_booking_status.booking_id) AS result
$$;

另请参阅上面@a_horse_with_no_name 和@AdrianKlaver 的评论。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章