PostgreSQL函数“idx”在某些机器上找到,但在其他机器上找不到。

4

这里是我正在使用 PreparedStatement 执行的查询语句

SELECT planner.udf_desc.* FROM planner.udf_desc WHERE id IN(3,2) ORDER BY idx(array[3,2], id);

我在planner模式下有一张名为udf_desc的表。
为了使其正常工作,我在我的数据库中安装了intarray扩展。

create extension "intarray"

我正在使用 Linux 机器。我曾在另外三台机器上尝试过(都是 Linux),但现在我在 Windows 机器上尝试同样的事情时,它却无法工作,并显示以下错误:

function idx(integer[], integer) does not exist

我在其他三台Windows机器上尝试了它,但它无法工作。
我在服务器控制台上打印了堆栈跟踪信息。

18:01:40,505 ERROR [com.ers.dao.UdfDao] (default task-13) SELECT planner.udf_desc.* FROM planner.udf_desc WHERE id IN(2) ORDER BY idx(array[2], id)
18:01:40,517 ERROR [stderr] (default task-13) java.sql.SQLException: ERROR: function idx(integer[], integer) does not exist
18:01:40,517 ERROR [stderr] (default task-13)   Hint: No function matches the given name and argument types. You might need to add explicit type casts.
18:01:40,520 ERROR [stderr] (default task-13)   Position: 73 Query: SELECT planner.udf_desc.* FROM planner.udf_desc WHERE id IN(2) ORDER BY idx(array[2], id) Parameters: []
18:01:40,522 ERROR [stderr] (default task-13)   at org.apache.commons.dbutils.AbstractQueryRunner.rethrow(AbstractQueryRunner.java:392)
18:01:40,524 ERROR [stderr] (default task-13)   at org.apache.commons.dbutils.QueryRunner.query(QueryRunner.java:351)
18:01:40,526 ERROR [stderr] (default task-13)   at org.apache.commons.dbutils.QueryRunner.query(QueryRunner.java:289)

所有机器上的内容都一样,但是idx函数在一个机器上能用,在另一个机器上不能用。


1
你需要在你的Windows安装上运行create extension intarray - user330315
1
或者你可能在错误的数据库中创建了扩展。 - user330315
2
或者是在错误的模式下(我注意到您使用了 planner. 限定了表名...扩展和函数存在于特定的模式中,就像其他数据库对象一样,比如您的表;但扩展有点特殊:它们可以在每个数据库中创建一次——但仍然在一个模式内)。 - pozs
@a_horse_with_no_name 我创建了一个扩展,如果我直接在控制台上编写查询(无论是使用pgAdmin还是命令行),它都可以正常工作。但是当我在Java中使用相同的查询时,它就无法正常工作。 - afzalex
1
@a_horse_with_no_name 我再次仔细核对了一切。问题是在某些机器上工作正常,即使我从头开始重新安装所有内容。但是在其他使用相同安装方法的机器上无法工作。目前我观察到的是,在任何Windows机器上都无法工作。如果您说99%的情况下问题出现在连接性、search_path和权限方面,我可以确保连接是正确的。也许问题出现在search_path或权限方面。如果您能帮助我解决这个问题,请告诉我。 - afzalex
显示剩余5条评论
1个回答

1

我在AWS RDS上遇到了同样的问题。解决方案是删除扩展并重新创建它:

DROP EXTENSION intarray;
CREATE EXTENSION intarray;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接