Séb*_*ent 12 postgresql functions centos-7
在CentOS v7上使用phpPgAdmin v5.6和PostgreSQL v11.2,当我尝试访问架构中的选项卡时,出现以下错误:Functionspublic
ERROR: column p.proisagg does not exist
LINE 18: WHERE NOT p.proisagg
^
HINT: Perhaps you meant to reference the column "p.prolang".
Dans l'instruction :
SELECT
p.oid AS prooid,
p.proname,
p.proretset,
pg_catalog.format_type(p.prorettype, NULL) AS proresult,
pg_catalog.oidvectortypes(p.proargtypes) AS proarguments,
pl.lanname AS prolanguage,
pg_catalog.obj_description(p.oid, 'pg_proc') AS procomment,
p.proname || ' (' || pg_catalog.oidvectortypes(p.proargtypes) || ')' AS proproto,
CASE WHEN p.proretset THEN 'setof ' ELSE '' END || pg_catalog.format_type(p.prorettype, NULL) AS proreturns,
u.usename AS proowner
FROM pg_catalog.pg_proc p
INNER JOIN pg_catalog.pg_namespace n ON n.oid = p.pronamespace
INNER JOIN pg_catalog.pg_language pl ON pl.oid = p.prolang
LEFT JOIN pg_catalog.pg_user u ON u.usesysid = p.proowner
WHERE NOT p.proisagg
AND n.nspname = 'public'
ORDER BY p.proname, proresult
Fatal error: Call to a member function recordCount() on integer in /mnt/webdata/websites/applications/pga/classes/Misc.php on line 1949
Run Code Online (Sandbox Code Playgroud)
我使用psql 中的\df元命令(结果是 10.1 版)得到了同样的错误:
ts_d=> \df
ERROR: column p.proisagg does not exist
LIGNE 6 : WHEN p.proisagg THEN 'agg'
^
ASTUCE : Perhaps you meant to reference the column "p.prolang".
ts_d=>
Run Code Online (Sandbox Code Playgroud)
这些查询中的错误似乎是由于引用proisagg了最初来自架构pg_proc中表的列pg_catalog,但在 PostgreSQL 11 中不再存在。请参阅:https : //www.postgresql.org/docs/11/release -11.html
有什么办法可以解决这个问题?
在 Postgres 11 中proisagg被替换prokind为系统目录中的pg_proc:
prokind|char|f对于普通函数、p过程、a聚合函数或w窗口函数
需要调整查询。喜欢:
SELECT ...
FROM pg_catalog.pg_proc p
...
WHERE p.prokind = 'f' -- to only get plain functions
...
Run Code Online (Sandbox Code Playgroud)
有关的:
您从\dfpsql 中的元命令观察到的错误很可能是由于使用了过时的 psql 版本。当然,psql 11 及更高版本已更新以应对此更改。
对于phpPgAdmin,您必须修改\classes\database\Postgres.php.
pg_proc.proisagg(PostgreSQL 10 及之前版本)是一个布尔值,当函数是聚合函数时设置为 TRUE。
pg_proc.prokind (PostgreSQL 11) 是一个字符,取值为“f”、“p”、“a”或“w”(参见上面 Erwin 的答案)。
因此,对于每次出现WHERE NOT p.proisagg(函数不是聚合函数),请替换为WHERE p.prokind <> 'a'。