自定义发票号生成函数报错:relation 'transpending_h'不存在
解决
get_generated_kodesj()函数报错:"relation 'transpending_h' does not exist" 嘿,看你的问题描述,这个错误其实很好定位——PostgreSQL找不到你函数里引用的transpending_h表,而且错误指向第19行的FROM transpendi...,明显是表名拼写出问题了(看起来是截断了,少写了末尾的_h)。下面给你一步步的排查和修复方案:
第一步:先修正表名拼写
从错误提示和你给出的代码片段来看,第19行的FROM transpendi...应该是FROM transpending_h的笔误。把这个拼写修正过来,是最可能解决问题的办法。
比如把函数里的这行:
END END END AS "KODETRANSNEW" FROM transpendi...
改成:
END END END AS "KODETRANSNEW" FROM transpending_h
第二步:确认表是否真的存在
如果修正拼写后还是报错,那得先确认这个表到底在不在你的数据库里。执行这条SQL查一下:
SELECT table_name, table_schema FROM information_schema.tables WHERE table_name = 'transpending_h';
- 如果没返回结果:说明你还没创建
transpending_h表,得先把这个表建好才能让函数正常工作。 - 如果有结果:说明表存在,但可能不在当前的搜索路径里。这时候你可以在函数里用全限定表名(比如
your_schema.transpending_h,把your_schema换成实际的 schema 名称),或者调整数据库的搜索路径。
第三步:检查权限
另外还要注意,执行这个函数的数据库用户必须有transpending_h表的SELECT权限。如果没有的话,用这条命令给用户赋权(把your_user换成实际用户名):
GRANT SELECT ON transpending_h TO your_user;
修正后的完整函数示例
这里给你补全一下修正后的函数框架(保留你原来的逻辑,只修正表名部分,还补了容易遗漏的变量赋值):
CREATE FUNCTION get_generated_kodesj() RETURNS CHAR AS $$ DECLARE kodeSJ CHAR; BEGIN SELECT CASE WHEN MAX(RIGHT("KODETRANS",4)) IS NULL THEN CONCAT('SJ-',EXTRACT(YEAR FROM NOW()),LPAD(CAST(EXTRACT(MONTH from NOW()) AS CHAR), 2 ,'0'),'0001') ELSE -- 这里替换成你原本的CASE分支逻辑 CONCAT('SJ-',EXTRACT(YEAR FROM NOW()),LPAD(CAST(EXTRACT(MONTH from NOW()) AS CHAR), 2 ,'0'), LPAD(CAST(MAX(RIGHT("KODETRANS",4)) + 1 AS CHAR),4,'0')) END AS "KODETRANSNEW" INTO kodeSJ -- 必须把查询结果赋值给声明的变量,否则函数返回空 FROM transpending_h; -- 这里修正为正确的表名 RETURN kodeSJ; END; $$ LANGUAGE plpgsql;
最后测试
重新创建修正后的函数,再执行:
SELECT get_generated_kodesj();
如果表存在、拼写正确、权限也够,应该就能正常生成你要的发票编号了。
内容的提问来源于stack exchange,提问作者Agoeng Liu
相关产品推荐
相关产品推荐

