thinkphp8 连接pgsql数据库,报错ERROR: function table_msg(unknown) does not exist
一、实际报错内容:
pgsql SQLSTATE[42883]: Undefined function: 7 ERROR: function table_msg(unknown) does not exist\nLINE 1: ...fault as \"default\",fields_default as \"extra\" from table_msg(...\n
^\nHINT: No function matches the given name and argument types. You might need to add explicit type casts.
二、解决办法:
在pgsql客户端(确认你的 PostgreSQL 版本大于10以上),
查看版本
SELECT version();
执行sql。
CREATE OR REPLACE FUNCTION "public"."table_msg" (a_schema_name varchar, a_table_name varchar) RETURNS SETOF "public"."tablestruct" AS
$body$
DECLAREv_ret tablestruct;v_oid oid;v_sql varchar;v_rec RECORD;v_key varchar;
BEGINSELECTpg_class.oid INTO v_oidFROMpg_classINNER JOIN pg_namespace ON (pg_class.relnamespace = pg_namespace.oid AND lower(pg_namespace.nspname) = a_schema_name)WHEREpg_class.relname=a_table_name;IF NOT FOUND THENRETURN;END IF;v_sql='SELECTpg_attribute.attname AS fields_name,pg_attribute.attnum AS fields_index,pgsql_type(pg_type.typname::varchar) AS fields_type,pg_attribute.atttypmod-4 as fields_length,CASE WHEN pg_attribute.attnotnull THEN ''not null''ELSE ''''END AS fields_not_null,pg_attrdef AS fields_default,pg_description.description AS fields_commentFROMpg_attributeINNER JOIN pg_class ON pg_attribute.attrelid = pg_class.oidINNER JOIN pg_type ON pg_attribute.atttypid = pg_type.oidLEFT OUTER JOIN pg_attrdef ON pg_attrdef.adrelid = pg_class.oid AND pg_attrdef.adnum = pg_attribute.attnumLEFT OUTER JOIN pg_description ON pg_description.objoid = pg_class.oid AND pg_description.objsubid = pg_attribute.attnumWHEREpg_attribute.attnum > 0AND attisdropped <> ''t''AND pg_class.oid = ' || v_oid || 'ORDER BY pg_attribute.attnum' ;FOR v_rec IN EXECUTE v_sql LOOPv_ret.fields_name=v_rec.fields_name;v_ret.fields_type=v_rec.fields_type;IF v_rec.fields_length > 0 THENv_ret.fields_length:=v_rec.fields_length;ELSEv_ret.fields_length:=NULL;END IF;v_ret.fields_not_null=v_rec.fields_not_null;v_ret.fields_default=v_rec.fields_default;v_ret.fields_comment=v_rec.fields_comment;SELECT constraint_name INTO v_key FROM information_schema.key_column_usage WHERE table_schema=a_schema_name AND table_name=a_table_name AND column_name=v_rec.fields_name;IF FOUND THENv_ret.fields_key_name=v_key;ELSEv_ret.fields_key_name='';END IF;RETURN NEXT v_ret;END LOOP;RETURN ;
END;
$body$
LANGUAGE 'plpgsql' VOLATILE CALLED ON NULL INPUT SECURITY INVOKER;COMMENT ON FUNCTION "public"."table_msg"(a_schema_name varchar, a_table_name varchar)
IS '获得表信息';---重载一个函数
CREATE OR REPLACE FUNCTION "public"."table_msg" (a_table_name varchar) RETURNS SETOF "public"."tablestruct" AS
$body$
DECLAREv_ret tablestruct;
BEGINFOR v_ret IN SELECT * FROM table_msg('public',a_table_name) LOOPRETURN NEXT v_ret;END LOOP;RETURN;
END;
$body$
LANGUAGE 'plpgsql' VOLATILE CALLED ON NULL INPUT SECURITY INVOKER;COMMENT ON FUNCTION "public"."table_msg"(a_table_name varchar)
IS '获得表信息';
三、在函数中能看到这个及完成
四、执行thinkphp8的查询代码,运行正常。