按照tp5的官方文档的说法, 必须这么做: 先执行一段sql代码

 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:='integer';
      ELSIF a_type='int2' THEN
           v_type:='smallint';
      ELSIF a_type='bpchar' THEN
           v_type:='char';
      ELSE
           v_type:=a_type;
      END IF;
      RETURN v_type;
 END;
 $BODY$
 LANGUAGE PLPGSQL;

 CREATE TYPE "public"."tablestruct" AS (
   "fields_key_name" ),
   "fields_name" ),
   "fields_type" ),
   "fields_length" BIGINT,
   "fields_not_null" ),
   "fields_default" ),
   "fields_comment" )
 );

 CREATE OR REPLACE FUNCTION "public"."table_msg" (a_schema_name varchar, a_table_name varchar) RETURNS SETOF "public"."tablestruct" AS
 $body$
 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
            INNER JOIN pg_namespace ON (pg_class.relnamespace = pg_namespace.oid AND lower(pg_namespace.nspname) = a_schema_name)
      WHERE
            pg_class.relname=a_table_name;
      IF NOT FOUND THEN
          RETURN;
      END IF;

      v_sql='
      SELECT
            pg_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.adsrc AS fields_default,
            pg_description.description AS fields_comment
      FROM
            pg_attribute
            INNER JOIN pg_class  ON pg_attribute.attrelid = pg_class.oid
            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 || '
      ORDER BY pg_attribute.attnum' ;

      FOR v_rec IN EXECUTE v_sql LOOP
          v_ret.fields_name=v_rec.fields_name;
          v_ret.fields_type=v_rec.fields_type;
           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;
      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$
 DECLARE
     v_ret tablestruct;
 BEGIN
     FOR v_ret IN SELECT * FROM table_msg('public',a_table_name) LOOP
         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_table_name varchar)
 IS '获得表信息';

;

thinkphp5, 结合pgsql使用时, 要先运行这段sql代码的更多相关文章

  1. 用BSF + Beanshell使Java程序能够运行字符串形式的代码(转载)

    BSF(Bean Scripting Framework)最初是IBM Alpha工作组的项目,后来贡献给了Apache,BSF使Java能够更好的与各种流行脚本语言整合,实现不同语言之间的交互功能. ...

  2. 使用node成功安装完某插件typescript后,在使用时提示:tsc(或xxx)不是内部或外部命令,也不是可运行的程序或批处理文件

    具体出错情形: 使用npm安装typescript明明安装成功,但在使用时一直报错,报错语句为  tsc不是内部或外部命令,也不是可运行的程序或批处理文件 具体出错原因: node未正确安装,或相关环 ...

  3. MySQL 安装和启动服务,“本地计算机 上的 MySQL 服务启动后停止。某些服务在未由其他服务或程序使用时将自动停止。”

    MySQL 安装和启动服务,以及遇到的问题 MySQL版本: mysql-5.7.13-winx64.zip (免安装,解压放到程序文件夹即可,比如 C:\Program Files\mysql-5. ...

  4. fstream对象重复使用时注意clear()的调用

    fstream对象重复使用时注意clear()的调用,否则会造成打开第二个文件失败.这是因为一个fstream对象对应磁盘上的一个文件,这种绑定关系在调用open()函数或者构造函数时指定,但有时我们 ...

  5. Eclipse和Android Studio中的DDMS使用时什么不同?

    http://www.jb51.net/softjc/454131.html Eclipse和Android Studio中的DDMS使用时什么不同? 相信很多经常开发Android应用的朋友应该都接 ...

  6. SSH hibernate 使用时最好添加访问数据库的编码

    SSH hibernate 使用时最好添加访问数据库的编码 如下所示:第13行为设置hibernate访问数据库的编码(&是&的转义序列) <!DOCTYPE hibernate ...

  7. Toolbar 和 CollapsingToolbarLayout一起使用时menu item无点击反应解决办法

    昨天一直在琢磨为什么Toolbar和CollapsingToolbarLayout一起使用时menu item无点击放应的原因,后来在stackoverflow上一条回答,说可能是Toolbar的背景 ...

  8. jqueryUI中datepicker的使用,解决与asp.net中的UpdatePanel联合使用时的失效问题

    1.jqueryUI的datepicker的使用 -->首先在jqueryUI官网上根据你的需要下载适合你系统主题的样式,jqueryUI主题下载地址: -->下载后的文件 jquery- ...

  9. 【原】无脑操作:IDEA使用时,提示"8080端口被占用"的解决

    1.问题描述:IDEA使用时,提示"8080端口被占用" Description:    The Tomcat connector configured to listen on ...

随机推荐

  1. 2016北京集训测试赛(六)Problem B: 矩阵

    Solution 最小割. 参考BZOJ 3144切糕 在那道题的基础上将建图方法稍作变形: 我们对格子进行黑白染色, 对于两个格子之和\(\le k\)的限制, 就可以确定其中一个是白色格子, 一个 ...

  2. hdu 3062 Party 2-SAT

    题目链接:HDU - 3062 有n对夫妻被邀请参加一个聚会,因为场地的问题,每对夫妻中只有1人可以列席.在2n 个人中,某些人之间有着很大的矛盾(当然夫妻之间是没有矛盾的),有矛盾的2个人是不会同时 ...

  3. How To Commit Just One Data Block Changes In Oracle Forms

    You have an Oracle Form in which you have multiple data blocks and requirement is to commit just one ...

  4. dedecms调用文章发布日期

    <span>[field:pubdate function="MyDate('m-d',@me)"/]</span>

  5. python 单例模式应用

    class Singelton(object): __instance=None def __init__(self): pass def __new__(cls,*kwd,**kwargs): # ...

  6. htop简介

    htop可谓top的升级版,top不可以鼠标操作,但是htop可以使用鼠标操作 启动方式:命令行下输入htop直接启动,启动后的界面如图所示 操作:可以使用上下左右方向键进行移动查看.可以使用鼠标点击 ...

  7. 线程间操作无效: 从不是创建控件“XXX”的线程访问它

    方法1 Invoke((MethodInvoker)(()=>{XXX.Text = message;})); 方法2 取消跨线程检查 Control.CheckForIllegalCrossT ...

  8. 基于maven+dubbo+spring+zookeeper的简单项目搭建

    maven下搭建dubbo小demo,供初学者学习,有不正确地方还请见谅. 先推荐一篇创建maven项目的文章,个人认为比较完整详细清楚: http://www.cnblogs.com/leiOOle ...

  9. 软件业的发展方向:云、Web以及App

    随着行业互联网的发展,未来的软件发展方向是云技术.Web软件以及基于移动设备的Apps. 桌面软件主要负责大型的计算.渲染和消耗非常大CPU和内存的图形软件,以及基于这些软件的二次开发软件如Revit ...

  10. bat文件转换为exe文件

    批处理文件转换为exe文件(简单的处理文件),点击下载 使用超简单的了,不多说.