libpqxx で レコードを一行ずつ表示する
一行ずつカンマ区切りで表示する
ソースコード
#include "ClibpqxxMap.h"
#include <iostream>
#include <pqxx/pqxx>
using namespace std;
using namespace pqxx;
int main()
{
try {
connection Conn("dbname=postgres user=postgres");
work T(Conn);
result r(T.exec("select * from test"));
//一行ずつ表示する
const int num_rows = r.size();
for (int rownum = 0; rownum < num_rows; ++rownum)
{
std::cout << "r.size" << std::endl;
const pqxx::row row = r[rownum];
const int num_cols = row.size();
for (int colnum = 0; colnum < num_cols; ++colnum)
{
const pqxx::field field = row[colnum];
string fieldStr = field.c_str();
if (colnum +1 < num_cols) {
fieldStr = fieldStr + ",";
}
std::cout << fieldStr ;
}
std::cout << std::endl;
}
//T.commit();
Conn.disconnect();
}
catch (const exception &e) {
cerr << e.what() << endl;
return 1;
}
return 0;
}
実行結果
さらに改良し、1カラムずつ出力
ソースコード
#include "ClibpqxxMap.h"
#include <iostream>
#include <pqxx/pqxx>
using namespace std;
using namespace pqxx;
/*
自作split
*/
std::vector<std::string> split(const std::string input, char delimiter)
{
std::istringstream stream(input);
std::string field;
std::vector<std::string> result;
while (std::getline(stream, field, delimiter)) {
result.push_back(field);
}
return result;
}
int main()
{
try {
connection Conn("dbname=postgres user=postgres");
work T(Conn);
result r(T.exec("select * from test")); const int num_rows = r.size(); for (int rownum = 0; rownum < num_rows; ++rownum)
{
const pqxx::row row = r[rownum];
const int num_cols = row.size();
string record = ""; for (int colnum = 0; colnum < num_cols; ++colnum)
{
const pqxx::field field = row[colnum];
string fieldStr = field.c_str(); //次も値があるかチェック
int chCnt = colnum;
record = record + fieldStr;
if (chCnt +1 < num_cols) {
record = record + ",";
}
}
cout << endl; std::cout << "record : " << record << endl; // カンマで区切る
cout << "---split----" << endl;
for (const string& s : split(record, ',')) {
cout << s << endl;
}
}
cout << endl;
//T.commit();
Conn.disconnect();
}
catch (const exception &e) {
cerr << e.what() << endl;
return 1;
}
return 0;
}
実行結果
libpqxx5.1 を Visual Stadio 2017 でビルドする
環境
Visual Stadio 2017
libpqxxの5.1
※master版のビルドも次回やります(やることはほとんど変わりません。)
参考
基本的には参考のページを見て実施。
前提条件
libpqxxのビルドはPostgreSQLがインストールしてあることが前提です。
postgresのincludeファイルを使用します。
ビルド前準備
・common-sampleをcommonファイルとして複製。
→内容は参考のURL参照
(Postgresのインストールディレクトリのパスを書き換えるのを忘れずに)
・ヘッダーファイルのコピー
libpqxx-5.1\config\sample-headers\compiler\VisualStudio2013\pqxx
配下の2ファイルをlibpqxx-5.1\include\pqxxへコピー
・vc-libpqxx.makの修正
259,269行目の$(LIBPQDPATH)"$(LIBPQDDLL)"を
postgresのインストールディレクトリにあるlib配下のlibpq.dllのパスにする
私の場合は
"C:\Program Files\PostgreSQL\10\lib\libpq.dll"
271,274行目の$(LIBPQDPATH)"$(LIBPQDLIB)"を
postgresのインストールディレクトリにあるlib配下のlibpq.libのパスにする
私の場合は
"C:\Program Files\PostgreSQL\10\lib\libpq.lib"
※これはvc-libpqxx.makの$(LIBPQDPATH)"$(LIBPQDDLL)"や$(LIBPQDPATH)"$(LIBPQDLIB)"のダブルコーテーションの位置がおかしいため、エラーが発生します。
正しい位置(masterを参考にするとよい)にしてもビルド出来ると思いますが、今回は単純にパスを書きました。
(ここから先はVS2017の開発用コマンドプロンプトで実施)
・VCVARSALL.BATの実行
C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Auxiliary\Buildへ移動してコマンド実行
VCVARSALL.BAT amd64
ビルド
nmake /f win32/vc-libpqxx.mak ALL
※ビルド中に上記のような警告?が表示されるが、C++ではよくあるメッセージらしい。
コマンドプロンプトが上記のようになり、libpqxxのlibフォルダに以下のようにlibpqxx.dllが出来ていればOK(libpqxxD.dllはデバック用)
以上です。
早めにmasterのビルド方法もあげます。(やることは変わりません)
Lpic (LinuC) Level1 勉強方法
Lpic試験について
ざっくりいうとLinuxを使いこなすためのベンダー資格
レベル1は初心者向けの資格です。
レベル1は101、102の2試験ともに合格するとLpic Level1と名乗ることが出来ます。
今はLinuCという試験に変わりつつありますが、まだLpicも受けることが出来る(はず)です。
LinuCはまだ情報が少ないのでLpicの方が合格しやすいのではないかな、と個人的に思っております。
受験結果
101試験:660(合格ライン:500)
(内訳)
・システムアーキテクチャ:100%
・Linuxのインストールとパッケージ管理:54%
・デバイス、Linuxファイルシステム、ファイルシステム階層標準:80%
102試験:630(合格ライン:500)
(内訳)
シェル、スクリプト、およびデータ管理:80%
ユーザインタフェースとデスクトップ:100%
管理業務:91%
重要なシステムサービス:90%
ネットワークの基礎:71%
セキュリティ:55%
こうみると得意な部分と不得意な部分が極端で面白いですね。
ネットワークが一番悪いかなと思っていましたが(Oracle受ける時もネットワークは苦労しました。笑)
101ではパッケージ管理、102ではセキュリティが酷いですね。
また、102ではシェルやSQLを業務で多く使っていたので勉強する必要がなかったのは大きかったです。(100%ではなかったですが。。。)
勉強のもろもろ
期間
101試験:1ヶ月
102試験:3週間
だらだら勉強しても仕方ないので先に受験日を決めました。
ちょうど1カ月後には予定が入っていたため、というのと、シェルやSQLの分を差し引いて102を3週間としました。
勉強方法
いろいろ他の合格者の話を見ていたらこの問題集がお勧めされていたので購入。
結果として、一番使えました。本番の類似問題が多かったです。
問題数も多く、解説も丁寧なのでこの一冊だけで十分合格できると思います。
また、101,102の両方をこの一冊で補えるのでお財布にもやさしい。
私はこの本を約3~4週しました。目安は一日1章。
最後の一週間は巻末の模擬試験と自信がなかった章を解くようにしました。
さらに模擬試験では90%以上とれるまで繰り返しました。
Ping-t
ping-t.com101は無料で問題集を実施することができます。
スピードマスターをやっていると初見でも模擬試験モードで大体80~90%は取れると思います。
ですので、101も102も私は全部銀、半分くらい金の状態で受験しました。
問題数が多く、理解を深めるという位置づけで使用しました。
102の問題は有料です。月額ですので、自分の勉強期間に合わせて購入することが出来ます。
私は101を受けてから1月以内に102を受験するつもりで勉強していたので1ヶ月分を購入しました。
また、私は全て机上で勉強しましたが、環境がある人は実際にLinux環境を構築して実施するとよいと思います。
環境構築できないよ!って方はcygwin(https://www.cygwin.com/)をwindowsにインストールしましょう。windows上でLinuxコマンドが使用できるターミナルです。
これを使って勉強するのも有だと思います。
受けた感想
いたるところで、「日本語が変」だとか「一昔前のGoogle翻訳」だとか書かれていたのでドキドキしながら受験しましたが、私のときはもう変な日本語の問題はありませんでした。(運が良かっただけかもしれませんが)
また、記述問題は101も102も15問ほどでした。オプションが不要な時は不要、と書いてくれていますので、かかれていない時はオプションも付けると吉です。
101からでも102からでもどちらでも受けられますが、順当に101から受けることをお勧めします。
理由は明白で、101の学習内容を102でそのまま利用する場面があるからです。
また受験費用は15000円×2なのでお高いですのでなるべく1回で合格を目指しましょう。
次の資格の話はOSS-DBの取得を目指しているので合格したら書きます。
PL/SQL と PL/pgSQL のout引数が refcursor のプロシージャ を実行する
out引数がカーソルの時のファンクションの実行について
記事が少なかったのでメモしておく。
とりあえずテーブルを作る
>||
-- create
CREATE TABLE Test(
id numeric,
name VARCHAR(255)
);
とりあえずレコードも作る
--レコードを作る
insert into Test values(1,'aaa');
insert into Test values(2,'bbb');
insert into Test values(3,'ccc');
insert into Test values(4,'ddd');
insert into Test values(5,'eee');
insert into Test values(6,'fff');
Oracleの場合
PL/SQLの作成
create or replace procedure get_test(
in_id number
,full_cur out sys_refcursor
,id_cur out sys_refcursor
)
is
begin
open full_cur for
select * from test;
open id_cur for
select * from test where id =in_id ;
END;
/
oracleではプロシージャで作成。
Postgresではプロシージャという概念がないのでファンクションで作成します。
PL/SQLの実行
var full_cur refcursor;
var id_cur refcursor;
exec get_test(1,:full_cur ,:id_cur );
print full_cur ;
print id_cur ;
callでも行けるはずですが、確認してません。
print でカーソルの中身を確認できます。
PostgreSQLの場合
PL/pgSQLの作成
create or replace function get_test(
in in_id numeric
,out full_cur refcursor
,out id_cur refcursor)
returns record
as $$
declare
begin
open full_cur for
select * from test;
--closeは書かない
open id_cur for
select * from test where id =in_id ;
--closeは書かない
end;
$$ language plpgsql;
closeをかくのはReturnで明示的に戻している場合で、(たぶん)
out引数の時にcloseしちゃうと返った時にカーソルが閉じてしまって見れなくなります。
PL/pgSQLの実行
begin;
select * from get_test(1);
fetch all in "<unnamed portal 3>";
fetch all in "<unnamed portal 4>";
rollback;
unnamed portal (無名ポータル)にカーソルが返ってくるので
fetchで中身を見てあげる感じです。
※3とか4なのは1回ミスったからです。
Docker で Oracle DataBase 11gR2 を構築
12CはPDBとかCDBとかあるので面倒だなって思ったので
11gR2を公式のDockerファイルを使って構築してみる。
参考
公式 Oracle Database の Docker イメージを構築 - #chiroito ’s blog
まずはGitHubのclone or Download からzipファイルをダウンロード
(gitで落とせる人はcloneでもよい)
https://github.com/oracle/docker-images
11R2なので以下から「Oracle Database Express Edition 11g Release 2 for Linux x64」ファイルをダウンロード
Oracle Database Express Edition 11g Release 2のダウンロード
docker-images-master\OracleDatabase\SingleInstance\dockerfiles\11.2.0.2
にzipファイルのまま配置
dockerにて以下のコマンド実行
./buildDockerImage.sh -v 11.2.0.2 -x
次のようなログが出たらOK
--> oracle/database:11.2.0.2-xe
Build completed in 358 seconds.
確認
出来てる!
docker run --name orcl -p 1521:1521 -p 5500:5500 -v /c/oradata:/opt/oracle/oradata \
-e ORACLE_SID=orcl oracle/database:11.2.0.2-xe
エラーが発生している。
調べたらあった。
DockerでOracleデータベース11g XEを構築 - メンチカツには醤油でしょ!!
--shm-size=1g
上記のオプションを設定しなければならなかったらしい
runするときに以下のように実行した
docker run --shm-size=1g --name orcl -p 1521:1521 -p 5500:5500 -v /c/oradata:/opt/oracle/oradata \
-e ORACLE_SID=orcl oracle/database:11.2.0.2-xe
途中ですが、こんな感じ
無事に出来そうです。
Docker で イメージファイルを読み込む
前々回の記事の続き。
前回は古いDocker でpostgresの環境を作成した。
今日はUpgradeしたDockerでsaveしたファイルをloadする。
前回はつかえなかった
docker container ls
が使えるようになっています。
下位互換もあるらしいのでdocker ps
もそのまま使える。
loadはsaveとやることが逆なだけです。
イメージファイルが置いてあるディレクトリに移動して以下のコマンドを実行。
docker load < イメージファイル名 / docker load < postgres_new.tar.gz
実行したら以下のようにログが表示される
imageを確認する
docker images
コンテナの作成
docker run -d --name postgres10 -e POSTGRES_PASSWORD=password -p 15432:5432 postgres_new
前回と違うのはイメージ名はイメージファイルと同じになっているということです。
コンテナ内に入ってpostgresに接続できるのを確認しました。
やっと昨日に追いついた。
次回はpl/pgSQLについてやっていきたい。
Docker Toolbox 最新版をインストールする
前回の記事でDocker が古いことに気づいたので
最新版を入手した。
その方法をメモしておく。
環境は
Win7 pro
まずは以下のリンクへ飛ぶ。
Install Docker Toolbox on Windows | Docker Documentation
windows用のDockerをダウンロードする。
※赤枠のGet Docker Toolboxをクリックでダウンロードが始まります。
DockerToolbox.exe
がダウンロードされるのでダブルクリック。
18.03.0-CEをインストールします。
EE版はお金がかかります。
Welcome to the Docker Toolboc Setup Wizard
Next>
Select Components
全部最新版にするのでそのままNext>
Select Additional Tasks
上から
デスクトップにショートカット作成
環境パスの設定追加
VMのupgrade
NDISSドライバーのインストール
デフォルトのままNext>
Ready to Install
Installボタン
インストール中~
何回か以下のようにデバイスをインストールするか聞いてくるのでインストール。
ちなみにインストールしないにするとDocker Toolboxのインストールも失敗します。
無事に終了
PCを再起動して起動しようとしたところ、エラー・・・
以下の記事を参考にVirtualBoxの修復したら治りました。
次は前回作ったイメージファイルをloadで読み込みます。