Windows 10 安装PostgreSQL 数据库 plpgsql_check扩展(源码编译)

前言

之前的博客记录了Linux CentOS 7 PostgreSQL 10 安装plpgsql_check扩展(源码编译),本文记录 win10 64位 下安装 PostgreSQL 扩展插件plpgsql_check,支持PG9.2以上版本,目前测试通过9.4,9.6,10。

下载

打开网址:https://pgxn.org/dist/plpgsql_check/0.9.3/,点击图标下载plpgsql_check插件源码。

1、下载PostgreSQL数据库  https://www.postgresql.org/download/windows/

2、下载安装Microsoft Visual C++ 2010(测试通过2010和2013,只装C++模块即可)

3、plpgsql_check依赖于plpgsql,我们需要添加plpgsql.lib。不幸的是,PostgreSQL 9.4.3不包含这个库。

根据lib目录下的plpgsql.dll文件生成plpgsql.lib文件。传送门:如何由ddl文件生成lib文件

The plpgsql_check depends on plpgsql and we need to add plpgsql.lib 
to the library list. Unfortunately PostgreSQL 9.4.3 does not contain this library.

4、源码编译plpgsql_check。(生成plpgsql_check.dll 文件)  传送门:Windows 使用VS 源码编译plpgsql_check

5、拷贝 plpgsql_check.dll 到 PostgreSQL\9.4\lib。 (9.4替换成自己的版本)

6、源码文件夹下,拷贝plpgsql_check.controlplpsql_check--0.9.sql PostgreSQL\9.4\share\extension

pg 9.6 以上版本最新的SQL文件。

如果高版本的PG安装了低版本的SQL文件,会报错,如下图:

 

安装完成后,输入测试用例。

postgres=# load 'plpgsql';
LOAD
postgres=# CREATE EXTENSION plpgsql_check;
CREATE EXTENSION
postgres=# CREATE TABLE t1(a int, b int);
CREATE TABLE
postgres=# CREATE OR REPLACE FUNCTION public.f1()
postgres-# RETURNS void
postgres-# LANGUAGE plpgsql
postgres-# AS $function$
postgres$# DECLARE r record;
postgres$# BEGIN
postgres$#   FOR r IN SELECT * FROM t1
postgres$#   LOOP
postgres$#     RAISE NOTICE '%', r.c; -- there is bug - table t1 missing "c" column
postgres$#   END LOOP;
postgres$# END;
postgres$# $function$;
CREATE FUNCTION
postgres=# select f1(); -- execution doesn't find a bug due to empty table t1
 f1
----

(1 行记录)


postgres=# \x
扩展显示已打开。
postgres=# select * from plpgsql_check_function_tb('f1()');
-[ RECORD 1 ]---------------------
functionid | f1
lineno     | 6
statement  | RAISE
sqlstate   | 42703
message    | 记录"r"没有字段"c"
detail     |
hint       |
level      | error
position   |
query      |
context    | SQL 语句 "SELECT r.c"


postgres=# \sf+ f1
        CREATE OR REPLACE FUNCTION public.f1()
         RETURNS void
         LANGUAGE plpgsql
1       AS $function$
2       DECLARE r record;
3       BEGIN
4         FOR r IN SELECT * FROM t1
5         LOOP
6           RAISE NOTICE '%', r.c; -- there is bug - table t1 missing "c" column
7         END LOOP;
8       END;
9       $function$

postgres=#

 

OK,测试成功。

 

总结

1、psql中,创建plpgsql_check扩展时,无法加载plpgsql_check.dll。

首先确认lib下是否有该文件;如果有文件,还是无法加载,那就是生成的版本问题。

/machine参数后面可以设置x86、x64,亲测,版本不对,加载绝对有问题。

2、生成plpgsql.lib的问题。(不同的pg版本,plpgsql方法是不同

我机器装了9.4和10,在dll生成lib时候,错误的将pg10的plpgsql.dll生成lib后,放入了9.4的lib下面。

然后源码编译plpgsql_check时,会报exec_get_datum_type找不到。打开9.4的源码,

确实有这个方法,最后排查,是def文件里没有这个方法,原来错误将pg10的dll解析分给了9.4下的lib。

3、源码编译的问题

如果报了一大堆的方法找不到(并非语法错误),有可能是打包环境问题。

  • 首先,先确认include是否都引入了;其次可能是版本,比如x64的lib用vs打32的,或者是反之。
  • 其次也有可能是缺少系统的依赖包。It can needed installed a Microsoft Visual C++ 2010 SP1 Redistributable Package http://www.microsoft.com/en-us/download/details.aspx?id=8328.

4、引入unicode外部包。

fatal error C1083: Cannot open include file: 'unicode/ucol.h': No such file or directory

首先"<unicode>"不是pg自带的包,可能是系统包,也可能是其他第三方的包。

需要安装IBM下的ICU包。传送门:Icu4c-62_1

下载ICU4C Binary Download,不要下载源码,因为源码的文件很散,需要引入的文件夹很多。

解压后引入

 

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值