按照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" ),
  24. "fields_name" ),
  25. "fields_type" ),
  26. "fields_length" BIGINT,
  27. "fields_not_null" ),
  28. "fields_default" ),
  29. "fields_comment" )
  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. 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 '获得表信息';

;

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. centos 7 mysql 离线安装教程

    1. 解压下载的zip包,会发现有以下几个rpm包: MySQL-client-advanced-5.6.22-1.el7.x86_64.rpm MySQL-devel-advanced-5.6.22 ...

  2. httperf+autobench测试web应用

    测试性能相关的概念理解 httperf使用 主页:  http://www.hpl.hp.com/research/linux/httperf/ 下载: http://httperf.googleco ...

  3. centos7 samba安装与配置

    1.关闭防火墙. CentOS 7 是自带的firewall,CentOS 6 好像是iptables.关闭防火墙命令如下: 第一种方法是关闭防火墙: systemctl disable firewa ...

  4. 查询执行慢的SQL

    --执行慢的SQL: SELECT S.SQL_TEXT, S.SQL_FULLTEXT, S.SQL_ID, ROUND(ELAPSED_TIME / 1000000 / (CASE WHEN (E ...

  5. 【spring cloud】【spring boot】项目启动报错:Cannot determine embedded database driver class for database type NONE

    解决参考文章:https://blog.csdn.net/hengyunabc/article/details/78762097 spring boot启动报错如下: Error starting A ...

  6. sublime去除空白行和重复行

    去除空白行 edit -> line -> delete blank lines 去除重复行 打开正则模式 1 edit-> sort lines 2 command+option+ ...

  7. git-ssh配置和使用

    https://segmentfault.com/a/1190000002645623 1.设置Git的user name和email:(如果是第一次的话) $ git config --global ...

  8. vue v-model使用说明

    1.概述 v-model 会忽略所有表单元素的 value.checked.selected 特性的初始值而总是将 Vue 实例的数据作为数据来源.你应该通过 JavaScript 在组件的 data ...

  9. 编程算法 - 两个链表的第一个公共结点 代码(C)

    两个链表的第一个公共结点 代码(C) 本文地址: http://blog.csdn.net/caroline_wendy 题目: 输入两个链表, 找出它们的第一个公共结点. 计算链表的长度, 然后移动 ...

  10. C/C++内存管理详解(转)

    内存分配方式 简介 在C++中,内存分成5个区,他们分别是堆.栈.自由存储区.全局/静态存储区和常量存储区. 栈:在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动 ...