オープンnavicate、オープンAクエリは、次のコードを実行することは解決することができます。
CREATE OR REPLACE FUNCTIONの pgsql_type(a_type varchar型)RETURNS VARCHAR AS $ BODY $ DECLAREの v_typeのvarchar型を、 BEGIN IF a_typeは= ' INT8 ' THEN v_type:= ' BIGINT ' ; ELSIF a_type = ' INT4 ' THEN v_type:= ' 整数' 。 ELSIF a_type = ' INT2 ' THEN v_type:= ' SMALLINT ' 。 ELSIF a_type = ' bpchar ' THEN v_type:= ' 文字' ; ELSE v_type:= a_type。 END IF ; RETURNのv_type。 END ; BODY $ $ LANGUAGE plpgsqlがします。 CREATE TYPEを" パブリック "。 "tablestruct" AS ( "fields_key_name" のvarchar(100 )、 "fields_name"(200 )、 "fields_type" VARCHAR(20 )、 "fields_length" BIGINT 、 "fields_not_null" VARCHAR(10 )、 "fields_default" VARCHAR(500 )、 "fields_comment" VARCHAR(1000年) )。 CREATE OR REPLACE FUNCTIONを " パブリック "。 "table_msg"(a_schema_name varchar型、a_table_name varchar型は)RETURNS SETOF " 公共の "。」 $身体の$ DECLAREの v_retのtablestruct。 v_oid OID; v_sql varchar型; v_rec RECORD; v_key varchar型; BEGIN SELECTが pg_class.oid INTOがv_oid FROM のpg_class インナー JOIN pg_namespace ON(pg_class.relnamespace = pg_namespace.oid AND 下部(pg_namespace.nspname)= a_schema_name) WHERE pg_class.relname = a_table_name。 IF はNOT FOUNDTHEN RETURN ; END IF ; v_sql = ' SELECT fields_name、AS pg_attribute.attname fields_index AS pg_attribute.attnum、 fields_type、AS pgsql_type(pg_type.typname :: VARCHAR) fields_lengthとしてpg_attribute.atttypmod-4、 CASE WHEN THEN pg_attribute.attnotnull '' NOT NULL ' ELSE ' ''」 fields_not_null、AS END fields_default AS pg_attrdef.adsrc、 fields_comment AS pg_description.description FROM のpg_attribute INNERはpg_classのON pg_attribute.attrelid = pg_class.oid、JOIN INNER JOINをpg_typeシステムカタログON pg_attribute.atttypid = pg_type.oidもし LEFT OUTER JOINをpg_attrdef ON pg_attrdef.adrelid = pg_class.oid AND pg_attrdef.adnum = pg_attribute.attnum LEFT OUTER JOINのはpg_description ON pg_description.objoid = pg_class.oid AND pg_description.objsubid = pg_attribute.attnum WHERE pg_attribute.attnum> 0 AND attisdropped <> '' T '' AND pg_class.oid = ' || v_oid || ' pg_attribute.attnum BY ORDER ' ; FOR v_rec、IN EXECUTE LOOPのv_sql v_ret.fields_name = v_rec.fields_name。 v_ret.fields_type = v_rec.fields_type。 IF v_rec.fields_length > 0 THEN v_ret.fields_length:= v_rec.fields_length。 ELSE v_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 THEN v_ret.fields_key_name = v_key。 ELSE v_ret.fields_key_name = '' ; END IF ; RETURN NEXTのv_ret。 終わりループ; RETURN ; END ; $ボディ$ LANGUAGE ' plpgsqlが' VOLATILE CALLED ON NULLのINPUT SECURITY INVOKER。 COMMENT ON FUNCTION " パブリック " "table_msg"(a_schema_name varchar型、a_table_name varchar型は) IS ' 获得表信息' ; - -重载一个函数 CREATE OR REPLACE FUNCTIONを " パブリック " "table_msg"(a_table_name varchar型)RETURNS SETOF「公共の」。 "tablestruct" AS $ボディ$ DECLAREの v_retのtablestruct; BEGIN FOR v_ret 、IN SELECT * FROM table_msgは(' 公共' 、a_table_name)LOOP RETURN NEXT v_ret; END LOOP; RETURN ; END ; $ボディの$ LANGUAGEは' plpgsqlが' VOLATILEは、CALLED ON NULLのINPUT SECURITY INVOKER; COMMENT ON FUNCTION " 公共 " "table_msg"(a_table_name。VARCHAR) IS 「情報テーブルを取得するために」。