行方不明のソリューションtable_msg機能を示唆thinkphp使用pgsqlの、

オープン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" のvarchar100 )、
  "fields_name"200 )、
  "fields_type" VARCHAR20 )、
  "fields_length" BIGINT 
  "fields_not_null" VARCHAR10 )、
  "fields_default" VARCHAR500 )、
  "fields_comment" VARCHAR1000年
)。
 
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。VARCHARIS  情報テーブルを取得するために

 

おすすめ

転載: www.cnblogs.com/haokan/p/12543981.html