0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

plpgsql_checkを64bit Windows10+Postgres12にインストールした時のメモ

Last updated at Posted at 2020-05-29

plpgsql_check.dllのビルドメモ

●はじめに

postgresqlの関数は文法エラーチェックを実行時に行います。(oracleとは異なる。)
開発実装時にエラーをチェックする場合にplsql_checkが非常に便利で使っています。
エラー箇所がリアルタイムでわかるためリリース時の不具合混入を大幅に減らせます。

●用意するもの

  1. plpgsql_check本体

    https://github.com/okbob/plpgsql_check からcloneで丸ごとダウンロード
    Clone or downloadボタンをクリック
    ダウンロードしたファイルをC:\plpgsql_check に解凍しておく。

  2. postgresql 12

    以下のサイトからダウンロード
    https://www.enterprisedb.com/downloads/postgres-postgresql-downloads

  3. VisualStudio 2019

    MSサイトからダウンロード(無料版可)

  4. icu4c-67_2-Win64-MSVC2017

    https://ja.osdn.net/projects/sfnet_icu/downloads/ICU4C/64.2/icu4c-64_2-Win64-MSVC2017.zip/
    C:\plpgsql_check\icu4c-67_1-Win64-MSVC2017に解凍しておく。

●plpgsql_checkのビルド

  1. Visual studio2019で新規プロジェクトを作成
    プロジェクト名はplpgsql_checkにしておく。
    プロジェクトのテンプレートはDLL(ユニバーサル)を選択
    プロジェクトのプロパティを
    構成をDebug
    プラットフォームをx64
    に変更。

  2. 以下のファイルをプロジェクトから削除(これらのファイルは使用しない)
    targetver.h
    dllmain.cpp
    pch.cpp
    pch.h
    plpgsql_check\plpgsql_check.cpp
    plpgsql_check.h

  3. 使用するソースとヘッダを追加
    C:\plpgsql_check\srcの.cと.hを全部プロジェクトに追加する。

  4. C:\plpgsql_check\lib\plpgsql.libファイルを生成
    DLLをlibに変換をググれば手順がわかります。

Visual studioから開発者コマンドプロンプトを開く。
mkdir C:\plpgsql_check\lib
cd C:\plpgsql_check\lib
copy "C:\Program Files\PostgreSQL\12\lib\plpgsql.dll" C:\plpgsql_check\lib
dumpbin /exports C:\plpgsql_check\lib\plpgsql.dll > plpgsql.def
plpgsql.defをsakura.exeなどで開いて短径選択し名前だけのファイルにする。
lib /def:C:\plpgsql_check\lib\plpgsql.def /OUT:C:\plpgsql_check\lib\plpgsql.lib /machine:x64
```
5. VisuaStudioでlibとincludeパスを追加する。
プロジェクトのプロパティ設定からそれぞれのパスとファイルを指定する。
●includeパスを追加
C:\Program Files\PostgreSQL\12\include\server
C:\Program Files\PostgreSQL\12\include
C:\Program Files\PostgreSQL\12\include\server\port\win32
C:\Program Files\PostgreSQL\12\include\server\port\win32_msvc
C:\plpgsql_check\icu4c-67_1-Win64-MSVC2017\include

**●libパスを追加**(追加のライブラリディレクトリ)
	C:\plpgsql_check\lib
	C:\Program Files\PostgreSQL\12\lib
	C:\plpgsql_check\icu4c-67_1-Win64-MSVC2017\lib64


**●リンカーの追加の依存ファイルに以下のlibを追加**
	postgres.lib
	plpgsql.lib
  1. VisuaStudioでのCオプションのプリコンパイル済みヘッダを変更する。

    使用しないにする。

  2. VisuaStudioでプロジェクトをビルドする。
    以下のDLLが生成されれば成功
    plpgsql_check\x64\Debug\plpgsql_check\plpgsql_check.dll

  3. 以下の3つのファイルをPostgreSQLフォルダのサブフォルダにコピーする。

copy plpgsql_check.dll "C:\Program Files\PostgreSQL\12\lib\plpgsql_check.dll"
copy C:\plpgsql_check\plpgsql_check.control "C:\Program Files\PostgreSQL\12\share\extension"
copy C:\plpgsql_check\plpsql_check--1.9.sql "C:\Program Files\PostgreSQL\12\share\extension"
```

  1. psqlでpostgresqlにログインし以下のcreate extensionコマンドを実行する。
    CREATE EXTENSION plpgsql_check;

  2. psqlで全エラー検索するためのSQLを実行してみる。
    以下のSQLでエラー関数を検索

```SQL

select
p.proname as "NAME"
, (pcf).functionid::regprocedure
, (pcf).lineno, (pcf).statement
, (pcf).sqlstate
, (pcf).message
, (pcf).detail
, (pcf).hint
, (pcf).level
, (pcf)."position"
, (pcf).query
, (pcf).context
, (pcf).message as "ERROR"
FROM pg_proc p LEFT outer JOIN
(SELECT pro.oid as pro_oid
, plpgsql_check_function_tb(pro.oid, COALESCE(tr.tgrelid, 0)) AS pcf
FROM pg_proc pro
LEFT JOIN pg_trigger tr
ON (tr.tgfoid = pro.oid)
WHERE
prolang = (SELECT lang.oid FROM pg_language lang WHERE lang.lanname = 'plpgsql') AND
pronamespace <> (SELECT nsp.oid FROM pg_namespace nsp WHERE nsp.nspname = 'pg_catalog') AND
-- ignore unused triggers
(pro.prorettype <> (SELECT typ.oid FROM pg_type typ WHERE typ.typname = 'trigger') OR
tr.tgfoid IS NOT NULL)
OFFSET 0
) ss on p.oid = ss.pro_oid
```

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?