PostgreSQL调用cid类型参数函数的方法及报错解决
核心问题原因
cid是PostgreSQL内置的系统级命令标识符类型,底层为32位无符号整数,但数据库默认未开放integer、bigint等常规数值类型到cid的直接类型转换规则,普通调用时直接传数值会触发类型不匹配错误。
你之前的测试操作还存在两个额外的语法错误:
- 引用带schema的函数时,将schema名和函数名放在同一组双引号内(如
"sa_db_test.simplecid"),数据库会将其识别为名称包含点号的单个函数,而非sa_db_test schema下的simplecid函数,自然无法匹配到目标函数。如果需要加双引号,正确写法为"sa_db_test"."simplecid",如果对象名全为小写,完全可以省略双引号。 - 测试字符串转cid时传入了非数字值
'a',cid的合法文本输入格式为数字字符串,非数字值无法解析为cid类型。
控制台SQL正确调用方法
两种写法均可正常执行:
- 传入数字格式的字符串,直接转换为cid类型
SELECT simplecid('123'::cid); -- 带schema的写法 SELECT sa_db_test.simplecid('123'::cid);
- 从integer数值转换时,通过bit类型做中转(二者底层都是32位存储,可直接互转)
SELECT simplecid(123::bit(32)::cid);
JDBC端正确调用方法
PostgreSQL官方JDBC驱动没有内置cid类型的参数绑定规则,直接setInt/setLong会将参数标记为int/bigint类型,无法匹配cid入参,推荐在SQL层完成类型转换,不需要驱动额外适配:
- 方案1:绑定数字字符串,SQL内转cid
CallableStatement callableStatement = conn.prepareCall("{ call sa_db_test.simplecid(CAST(? AS cid)) }"); callableStatement.setString(1, "34"); callableStatement.execute();
- 方案2:绑定int数值,通过bit类型中转
CallableStatement callableStatement = conn.prepareCall("{ call sa_db_test.simplecid(?::bit(32)::cid) }"); callableStatement.setInt(1, 34); // cid为32位长度,setInt即可满足取值范围要求,不需要使用setLong callableStatement.execute();
常见报错对应原因
function simplecid(integer) does not exist:直接传入整数值,没有做类型转换,参数类型不匹配。cannot cast type integer to cid:尝试直接将integer强转为cid,数据库无对应转换规则。function simplecid(cid) does not exist:大概率是函数名引用错误(如双引号包裹schema+函数名的写法错误),或传入的字符串无法解析为合法cid值。- JDBC报
function sa_db_test.simplecid(bigint) does not exist:直接调用setLong传参,参数被标记为bigint类型,无匹配函数。
内容的提问来源于stack exchange,提问作者Andrey Vladimirovich
相关产品推荐
相关产品推荐

