错误:“INTEGER”第 2 行或附近的语法错误:v_stage INTEGER:=0;

Posted

技术标签:

【中文标题】错误:“INTEGER”第 2 行或附近的语法错误:v_stage INTEGER:=0;【英文标题】:ERROR: syntax error at or near "INTEGER" LINE 2: v_stage INTEGER:=0; 【发布时间】:2021-01-03 08:29:44 【问题描述】:
DECLARE
  v_stage INTEGER:=0;
[...]
  RETURN QUERY 
  SELECT 1.0::FLOAT, v_stage, sex, birthdate, place, district, subdistrict, village, race,
     complexion, eyecolor, haircolor, height, weight, hp, mother, father, picture, sidenote,
     mannerism, name, method, crimetype, suspect_id
  FROM public.suspect
  WHERE complexion = p_complexion TEXT,
  AND CASE WHEN p_eyecolor IS NOT NULL THEN eyecolor = p_eyecolor ELSE true END
  AND CASE WHEN p_haircolor IS NOT NULL THEN haircolor = p_haircolor ELSE true END
  AND CASE WHEN p_height FLOAT IS NOT NULL THEN height = p_height ELSE true END
  AND CASE WHEN p_weight FLOAT IS NOT NULL THEN weight = p_weight ELSE true END
  AND CASE WHEN p_sex IS NOT NULL THEN sex = p_sex ELSE true END
  AND CASE WHEN p_sidenote TEXT IS NOT NULL THEN sidenote = p_sidenote ELSE true END
  AND CASE WHEN p_mannerism TEXT IS NOT NULL THEN mannerism = p_mannerism ELSE true END
  AND CASE WHEN p_method TEXT IS NOT NULL THEN method = p_method ELSE true END
  AND CASE WHEN p_crimetype TEXT IS NOT NULL THEN crimetype = p_crimetype ELSE true END;
[...]

->错误:“整数”或附近的语法错误“总是出错!我不知道为什么” ->第 2 行:v_stage INTEGER:=0;

请能解决这个问题的人,我真的很感激......

使用评论中的代码更新:

DO 
$$ 
    DECLARE 
    v_stage INTEGER:=0; 
    RAISE NOTICE 'y'; 
    RETURN QUERY 
        SELECT 
            1.0::FLOAT, v_stage, sex, birthdate, place, district, subdistrict, village, race, complexion, eyecolor, haircolor, height, weight, hp, mother, father, picture 
    FROM 
        public.suspect
    WHERE 
        complexion = p_complexion TEXT, 
    AND 
        CASE WHEN 
            p_eyecolor IS NOT NULL 
        THEN    
            eyecolor = p_eyecolor 
        ELSE 
            true 
        END 
    AND 
        CASE WHEN 
            p_haircolor IS NOT NULL 
        THEN 
            haircolor = p_haircolor 
        ELSE 
            true 
        END; 
    END$$; 

在我在 DECLARE 之前添加 DO $$ 之后,又出现了另一个错误:ERROR: syntax error at or near "SELECT" LINE 6: RETURN QUERY

CONTEXT:无效的类型名称“QUERY SELECT 1.0::FLOAT”

【问题讨论】:

一个do 块不能返回任何东西,所以return query 开头是错误的。但我认为 PL/pgSQL 根本没有理由。只需运行该选择语句。但是您缺少一个BEGIN 来生成有效的PL/pgSQL。 complexion = p_complexion TEXT, 也是无效的 SQL。 【参考方案1】:

这行得通:

DO $$
DECLARE
    v_stage INTEGER:=0;
BEGIN
    RAISE NOTICE 'test';

END$$;

NOTICE:  test
DO

所以我要说它是DECLARE 之前的东西。将函数的开头部分添加到您的代码示例中。

【讨论】:

感谢您的回复。我按照你说的做了,但是,出现了另一个错误:错误:在“[”或附近出现语法错误第 5 行:[...] 然后我尝试删除 [...] 然后再次错误:错误:语法“SELECT”第 6 行或附近出现错误:返回查询 ^ 上下文:类型名称无效“QUERY SELECT 1.0::FLOAT” DO $$ DECLARE v_stage INTEGER:=0;提高通知'y';返回查询选择 1.0::FLOAT、v_stage、性别、出生日期、地点、地区、街道、村庄、种族、肤色、眼睛颜色、头发颜色、身高、体重、hp、母亲、父亲、图片来自 public.crime WHERE 肤色 = p_complexion TEXT , AND CASE WHEN p_eyecolor IS NOT NULL THEN eyecolor = p_eyecolor ELSE true END AND CASE WHEN p_haircolor IS NOT NULL THEN haircolor = p_haircolor ELSE true END;结束$$;在我在 DECLARE 之前添加 DO $$ 之后,又出现了另一个错误:错误:在“SELECT”第 6 行或附近出现语法错误:返回查询 @AdrianKlaver 我将上面的内容添加到应该在哪里出现的问题中,并对其进行了格式化以使其可读。 我做错了什么?为什么它在“RETURN QUERY SELECT 1.0:: FLOAT”附近出现错误请帮我解决它... 看看here 了解如何构建 plpgsql 函数。我也会在函数之外运行查询,因为它有问题。

以上是关于错误:“INTEGER”第 2 行或附近的语法错误:v_stage INTEGER:=0;的主要内容,如果未能解决你的问题,请参考以下文章

尝试使用 if 语句创建函数时出现 Postgresql 语法错误

第 1 行的 ''')' 附近的 SQL 语法有错误

MySQL Workbench:查询中的错误(1064):第 1 行的“VISIBLE”附近的语法错误

-e 第 1 行,“'755']”附近的 nmake 语法错误

第 14 行 '' 附近的 SQL 语法错误

尝试从邻接树中获取子项时,语法错误在“)”处或附近