我正在尝试调用一个以单个
UUID
作为参数的数据库函数。当我这样做时:
report_id = "5ed30f08-0de0-47f4-99e8-9aeeb8eb2dfe";
query = "select * public.fn_func($1)";
report_nav = pq_exec_params (conn, query, {report_id});
我明白了:
__pq_exec_params__: fatal error: ERROR: function public.fn_func(text) does not exist
很明显,有些东西正在将
report_id
转换为 PostgreSQL text
数据类型。所以我尝试通过将查询更改为以下方式来转换为 UUID
:
query = "select * public.fn_func($1::uuid)";
但后来我收到这条消息:
no converter found for element oid 1700
我确实已将
uuid-ossp
模块添加到我的数据库中,因此我可以直接针对数据库运行它:
select '5ed30f08-0de0-47f4-99e8-9aeeb8eb2dfe'::uuid;
我使用
octave
v6.4 来执行脚本,在 Ubuntu 22.04 上运行 PostreSQL v14.13。
分配给局部变量
report_id
可以有效地使 UUID 文字类型 text
。
缺少一个
FROM
:
query = "select * public.fn_func($1::uuid)";
尝试:
query = "SELECT * FROM public.fn_func($1::uuid)";
但是你真的应该得到这个错误:
错误:“public”处或附近的语法错误
如果这不能解决问题,那么我不确定您的客户如何设法阻止查询。
您可以创建一个(重载?)函数,采用
text
并在函数中进行强制转换(如 Adrian 评论的那样),或者您可以将查询字符串与非类型化文字连接起来:
query = "SELECT * FROM public.fn_func('5ed30f08-0de0-47f4-99e8-9aeeb8eb2dfe')";