Postgres函数更新列含糊不清

时间:2018-01-24 13:31:58

标签: postgresql plpgsql

我创建了一个像这样的postgres函数:

CREATE OR REPLACE FUNCTION delete_annotation_f(
    IN cmtid uuid)
    RETURNS bool AS $$
DECLARE
     pid uuid;
     cmt_cnt int4;
BEGIN
    SELECT get_comment_cnt_f(cmtid) INTO cmt_cnt;
    UPDATE detail_t SET ann_cmt_cnt=ann_cmt_cnt - cmt_cnt;
    RETURN TRUE;
END
$$
LANGUAGE plpgsql;

但是当我运行此函数时,我收到此错误:

ERROR:  column reference "cmt_cnt" is ambiguous
LINE 1: ...detail_t SET ann_cmt_cnt=ann_cmt_cnt-cmt_cnt WH...

我找到了这个链接On Inset: column reference "score" is ambiguous,但它无法帮助我解决问题。有人有解决方案吗?

2 个答案:

答案 0 :(得分:1)

您正在使用与列名相同的变量。查询解析器无法决定它必须选择哪个,更改变量名称,然后模糊性将消失。

答案 1 :(得分:1)

https://www.postgresql.org/docs/current/static/plpgsql-implementation.html

  

默认情况下,如果SQL语句中有名称,PL / pgSQL将报告错误   可以指变量或表列。你可以解决这个问题   通过重命名变量或列,或通过限定   模糊的引用,或通过告诉PL / pgSQL解释   喜欢。 最简单的解决方案是重命名变量或列。普通的   编码规则是为PL / pgSQL使用不同的命名约定   变量比用于列名称的变量。例如,如果你   一致地命名函数变量v_something而不是你的   列名以v_开头,不会发生冲突。

并进一步:

  

您还可以逐个函数地设置行为   在函数的开头插入这些特殊命令之一   文本:

#variable_conflict error
#variable_conflict use_variable
#variable_conflict use_column