PostgreSQL触发器函数INSERT后INTO语法错误求助
问题分析与解决
嘿,我一眼就找到你这个报错的根源啦!
错误原因
你写的PL/pgSQL代码里犯了一个基础的语法结构错误:DECLARE块必须放在BEGIN关键字之前,而不是紧跟在BEGIN后面。
当你把DECLARE写在BEGIN之后时,PostgreSQL会误以为你是在尝试声明一个变量,但后面跟着的INSERT INTO语句完全不是合法的类型定义,所以它才会报错说INTO附近有语法问题,甚至把整个INSERT语句当成了无效的类型名称。
修正后的代码
把变量声明部分移到BEGIN之前,代码就能正常运行了:
CREATE FUNCTION public.tf_test() RETURNS trigger LANGUAGE 'plpgsql' NOT LEAKPROOF AS $BODY$ DECLARE targetid orderpayment.id%TYPE; BEGIN INSERT INTO orderpayment(currencycode,tableorderid,payment,tip,paymentprocessor) VALUES (NEW.currency,NEW.orderid,NEW.amount,NEW.tip,1) RETURNING id INTO targetid; NEW.orderpayment = targetid; RETURN NEW; END $BODY$;
小提醒
PL/pgSQL函数的标准结构是:
CREATE FUNCTION 函数名(参数) RETURNS 返回类型 LANGUAGE plpgsql AS $BODY$ DECLARE -- 这里放变量声明 BEGIN -- 这里放执行逻辑 END $BODY$;
一定要注意DECLARE和BEGIN的顺序哦!
内容的提问来源于stack exchange,提问作者Rick DeBay
相关产品推荐
相关产品推荐

