按照tp5的官方文档的说法, 必须这么做: 先执行一段sql代码
1 CREATE OR REPLACE FUNCTION pgsql_type(a_type varchar) RETURNS varchar AS 2 $BODY$ 3 DECLARE 4 v_type varchar; 5 BEGIN 6 IF a_type='int8' THEN 7 v_type:='bigint'; 8 ELSIF a_type='int4' THEN 9 v_type:='integer'; 10 ELSIF a_type='int2' THEN 11 v_type:='smallint'; 12 ELSIF a_type='bpchar' THEN 13 v_type:='char'; 14 ELSE 15 v_type:=a_type; 16 END IF; 17 RETURN v_type; 18 END; 19 $BODY$ 20 LANGUAGE PLPGSQL; 21 22 CREATE TYPE "public"."tablestruct" AS ( 23 "fields_key_name" varchar(100), 24 "fields_name" VARCHAR(200), 25 "fields_type" VARCHAR(20), 26 "fields_length" BIGINT, 27 "fields_not_null" VARCHAR(10), 28 "fields_default" VARCHAR(500), 29 "fields_comment" VARCHAR(1000) 30 ); 31 32 CREATE OR REPLACE FUNCTION "public"."table_msg" (a_schema_name varchar, a_table_name varchar) RETURNS SETOF "public"."tablestruct" AS 33 $body$ 34 DECLARE 35 v_ret tablestruct; 36 v_oid oid; 37 v_sql varchar; 38 v_rec RECORD; 39 v_key varchar; 40 BEGIN 41 SELECT 42 pg_class.oid INTO v_oid 43 FROM 44 pg_class 45 INNER JOIN pg_namespace ON (pg_class.relnamespace = pg_namespace.oid AND lower(pg_namespace.nspname) = a_schema_name) 46 WHERE 47 pg_class.relname=a_table_name; 48 IF NOT FOUND THEN 49 RETURN; 50 END IF; 51 52 v_sql=' 53 SELECT 54 pg_attribute.attname AS fields_name, 55 pg_attribute.attnum AS fields_index, 56 pgsql_type(pg_type.typname::varchar) AS fields_type, 57 pg_attribute.atttypmod-4 as fields_length, 58 CASE WHEN pg_attribute.attnotnull THEN ''not null'' 59 ELSE '''' 60 END AS fields_not_null, 61 pg_attrdef.adsrc AS fields_default, 62 pg_description.description AS fields_comment 63 FROM 64 pg_attribute 65 INNER JOIN pg_class ON pg_attribute.attrelid = pg_class.oid 66 INNER JOIN pg_type ON pg_attribute.atttypid = pg_type.oid 67 LEFT OUTER JOIN pg_attrdef ON pg_attrdef.adrelid = pg_class.oid AND pg_attrdef.adnum = pg_attribute.attnum 68 LEFT OUTER JOIN pg_description ON pg_description.objoid = pg_class.oid AND pg_description.objsubid = pg_attribute.attnum 69 WHERE 70 pg_attribute.attnum > 0 71 AND attisdropped <> ''t'' 72 AND pg_class.oid = ' || v_oid || ' 73 ORDER BY pg_attribute.attnum' ; 74 75 FOR v_rec IN EXECUTE v_sql LOOP 76 v_ret.fields_name=v_rec.fields_name; 77 v_ret.fields_type=v_rec.fields_type; 78 IF v_rec.fields_length > 0 THEN 79 v_ret.fields_length:=v_rec.fields_length; 80 ELSE 81 v_ret.fields_length:=NULL; 82 END IF; 83 v_ret.fields_not_null=v_rec.fields_not_null; 84 v_ret.fields_default=v_rec.fields_default; 85 v_ret.fields_comment=v_rec.fields_comment; 86 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; 87 IF FOUND THEN 88 v_ret.fields_key_name=v_key; 89 ELSE 90 v_ret.fields_key_name=''; 91 END IF; 92 RETURN NEXT v_ret; 93 END LOOP; 94 RETURN ; 95 END; 96 $body$ 97 LANGUAGE 'plpgsql' VOLATILE CALLED ON NULL INPUT SECURITY INVOKER; 98 99 COMMENT ON FUNCTION "public"."table_msg"(a_schema_name varchar, a_table_name varchar) 100 IS '获得表信息'; 101 102 ---重载一个函数 103 CREATE OR REPLACE FUNCTION "public"."table_msg" (a_table_name varchar) RETURNS SETOF "public"."tablestruct" AS 104 $body$ 105 DECLARE 106 v_ret tablestruct; 107 BEGIN 108 FOR v_ret IN SELECT * FROM table_msg('public',a_table_name) LOOP 109 RETURN NEXT v_ret; 110 END LOOP; 111 RETURN; 112 END; 113 $body$ 114 LANGUAGE 'plpgsql' VOLATILE CALLED ON NULL INPUT SECURITY INVOKER; 115 116 COMMENT ON FUNCTION "public"."table_msg"(a_table_name varchar) 117 IS '获得表信息';
;