[Home] [ダウンロード] [インストール] [使用方法] [使用例] [FAQ]
F A Q
インストールに関するFAQ
- pgbashは、bashのどのバージョンを使用しますか?
- pgbashは、PostgreSQLのどのバージョンを使用しますか?
- 独自の対話型操作環境を作成したのですがどうすれば良いですか?
- シェルスクリプトは存在しているが"No such file or directory"で実行できません。
bashの操作に関するFAQ
データベースの接続に関するFAQ
- CONNECT文を使用しなくても自動的にデータベースに接続してくれますか?
- CONNECT文で接続名を指定しなかった場合はどうなりますか?
- セッションが切れた場合 backendは終了しますか?
- SQL使用中にbackendが死んだ場合はどうなりますか?
SQLの操作に関するFAQ
検索結果の出力に関するFAQ
- pgbash の検索結果と psql の検索結果は同じですか?
- Select Into 文で検索結果が複数タプルの場合はどうなりますか?
- Fetch Into 文で 検索数とか'ALL'を指定したらどうなりますか?
- スペースとNULLとゼロビット(空)とを区別して表示できますか?
- SELECTの結果をCSV形式でファイルに出力することができますか?
- 検索した時の列名を取得する方法はありますか?
Webアプリケーションに関するFAQ
Q.pgbashは、bashのどのバージョンを使用しますか?
pgbash-8r2.05は bash-2.05a, pgbash-8r3.2 は bash-3.2.48, pgbash-8r4.1 は bash-4.1.10 のソースファイルを使用します。
Q.pgbashは、PostgreSQLのどのバージョンを使用しますか?
pgbash は PostgreSQL-7.4以降の libpqライブラリを使用します。 そして、PostgreSQL-7.4, PostgreSQL-8.0 から 8.4 および PostgreSQL 9.0 サーバに接続できます。libpqライブラリのPostgreSQLバージョンと、サーバ側のPostgreSQLバージョンは一致しなくてもかまいません。
Q.独自の対話型操作環境を作成したのですがどうすれば良いですか?
/etc/pgbashrc をホームディレクトリに .pgbashrc としてコピーし、そのファイルに独自の対話型操作環境を追加してください。
Q.シェルスクリプトは存在しているが"No such file or directory"で実行できません。
シェルスクリプトの改行コードは'LF'です。'CR+LF'コードになっていると、このエラーになります。もちろん、パスが間違っても同じです。
Q.シェルスクリプトで alias相当の指定ができますか?
シェルスクリプト内では alias は使用できません。例えば、次のように function を定義して alias と同様に使用することができます。
#!/usr/local/bin/pgbash function E { exec_sql "$*" } E "select * from test" Q.pgbashの標準エラー出力を標準出力に切り替えることができますか?
はい、できます。exec 2>&1 とします。CGI用のシェルスクリプトを作成する場合は、プログラムの先頭で必ず指定した方が良いでしょう。
#!/usr/local/bin/pgbash exec 2>&1 echo "Content-type: text/html" echo "" set EXEC_SQL_OPTION CGI;
-
-
- Q.CONNECT文を使用しなくても自動的にデータベースに接続してくれますか?
-
CONNECT文を実行せずに SQL文を実行した場合は、ログインユーザ名をユーザ名とし、ユーザ名と同じ名前のデータベース名に対して自動的に接続します。
例えば、ログインユーザ名が admin の場合は、connect to default; は **connect to admin user admin;**が実行されたことと同じになります。
但し、パスワードが設定されているデータベースは、"CONNECT データベース名 user ユーザ名 [パスワード]"の形式で CONNECT文を実行しなければなりません。CONNECT文の最後にパスワードを記述しなかった場合は、パスワードの入力要求メッセージが表示されますので、それにしたがってパスワードを入力しなければなりません。
Q.CONNECT文で接続名を指定しなかった場合はどうなりますか?
"CONNECT TO データベース名 AS 接続名" の接続名を省略した場合は、データベース名と同じ名前になります。次の例では接続名はいずれも"admin"です。
connect to admin; connect to admin@www.psn.co.jp:5432; Q.セッションが切れた場合 backendは終了しますか?
pgbashのシェルスクリプトが終了すると、セッションが切れ、backendは自動的に終了します。対話型でpgbashを使用している場合は、ログアウトするかもしくは、"disconnect 接続名またはALL"で backendは終了します。
Q.SQL使用中にbackendが死んだ場合はどうなりますか?
SQL使用中に、backendプロセスが何らかの理由で死ぬと、backendを再起動しても"SQL_BAD_RESPONSE"のエラーが発生してデータ操作ができなくなります。次のいずれかの処理を行わなければなりません。
(対処)
・ disconnect all; でデータベースの切断を行う。
・ connect to xxx as db123;のように新しい接続名で接続する。
・ pgbashをログインシェルとして使用している場合、ログアウトして再度ログインする。
・ pgbashをサブシェルとして使用している場合は、exit してして再度pgbashを起動する。
Q.SQL文はそのまま backend に送信されますか?
次のSQL文は、pgbashの内部で処理されます。
・ CONNECT 文、 DISCONNECT 文、 SET CONNECTION 文
・ SET EXEC_SQL_OPTION文、SET OPTION_NAME=VALUE; 文
・ FETCH INTO 文の INTO句 (INTO句を除いた文が backend に送信される)
・ SELECT INTO 文の INTO句 (INTO句を除いた文が backend に送信される)
上記のSQL文を除いた他の全てのSQL文はそのまま backend に送信されます。
Q.列の値がNULLであることを判断できますか?
はい、判断できます。例えば、
begin; declare cur cursor for select * from test; fetch in cur into :aaa :aaa_indi, :bbb :bbb_indi; if(( aaa_indi == SQL_NULL )); then ... fi end;
のように fetch into の標識変数(インディケータ)が SQL_NULLと等しいことで判断できます。ちなみに、そのときのシェル変数($aaa)には '\0' (1バイト目がビットオフ)が代入されています。echo $aaaとしても何も表示されません。
Q.データベース情報を表示するコマンドはどのような QUERY をバックエンドに送信しているのですか?
これを知るには、E+ を入力した後にデータベース情報表示コマンドを実行してください。表示結果の先頭に、バックエンドに送信される QUERY が表示されます。元に戻すには E- を入力します。
pgbash> E+ pgbash> ?l [ List of databases ] ########## QUERY ########## SELECT pg_database.datname as "Database", pg_user.usename as "Owner", pg_encoding_to_char(pg_database.encoding) as "Encoding" FROM pg_database, pg_user WHERE pg_database.datdba = pg_user.usesysid UNION SELECT pg_database.datname as "Database", NULL as "Owner", pg_encoding_to_char(pg_database.encoding) as "Encoding" FROM pg_database WHERE pg_database.datdba NOT IN (SELECT usesysid FROM pg_user) ORDER BY "Database" ###########################
Database |Owner |Encoding ---------+--------+--------- admin |postgres|EUC_JP postgres |postgres|SQL_ASCII template0|postgres|SQL_ASCII template1|postgres|SQL_ASCII Q.pgbash の検索結果と psql の検索結果は同じですか?
はい、基本的には同じです。但し、pgbashは次の機能を拡張しています。
・外枠罫線の出力有無のコントロール
・NULLや ZERO(文字型のAll bit off)に適当な文字列を表示する機能
・表形式の出力において、CHAR型であってもデータの後ろのスペースを削除して罫線を揃えます。
Q.Select Into 文で検索結果が複数タプルの場合はどうなりますか?
検索結果が複数タプルの場合は、into句の処理(シェル変数に検索結果を代入)はされません。検索結果は、標準出力(画面)に出力されてしまいます。
Q.Fetch Into 文で 検索数とか'ALL'を指定したらどうなりますか?
fetch ALL in cur into :aaa, :bbb, :ccc; のようにした場合、検索結果が複数タプルの場合は、into句の処理はされません。標準出力(画面)に出力されてしまいます。ALLを指定しても検索結果が1タプルの場合は、into句は処理され、シェル変数 aaa,bbb, ccc に値がセットされます。一般的には、into句を指定する場合は検索数とか'ALL'は指定しません。
Q.スペースとNULLとゼロビット(空)とを区別して表示できますか?
はい、可能です。例えば、NULLを"-NULL-"、空を"-0-"にした場合は次のようにします。
set OPTION_NULLSTRING="-NULL-"; set OPTION_ZEROSTRING="-0-"; select * from test;
code |name |address ------+----------+-------- 222 |test2 |addr2 333 | |-0- 444 |-NULL- |-NULL- (3 rows) Q.SELECTの結果をCSV形式でファイルに出力することができますか?
はい、可能です。一時的にCSV形式にするには、
exec_sql -S ',' -TBA "select ... from ... where ..."
全ての出力を CSV形式にする場合は、次の方が便利です。
set OPTION_SEPARATOR=',';
set OPTION_HEADER=OFF;
set OPTION_BOTTOM=OFF;
set OPTION_ALIGNMENT=OFF;
のようにオプションを指定しておいて、SELECTを実行します。
Q.検索した時の列名を取得する方法はありますか?
はい、あります。$SQLNFIELD に列数、${SQLFIELDNAME[i]}に列名がセットされています。例えば、次のような方法で列名を表示することができます。
select * from test; declares -i x; let x=0; while(( x < SQLNFIELD )) do echo "NAME=${SQLFIELDNAME[x]}" let x=x+1 done
-
-
- Q.pgbashはCGIプログラムとして利用することができますか?
-
はい、できます。すべての出力を HTML出力に切り替え、GET/POSTメソッドにデータを読み込みシェル変数にセットする機能があります。pgbashをCGIプログラムとするには次の文が必要です。但し、exec 2>&1 は必須ではありません。
#!/usr/local/bin/pgbash exec 2>&1 ................ pgbashの標準エラー出力を標準出力に切り替える echo "Content-type: text/html" echo "" set EXEC_SQL_OPTION CGI; .... HTML出力、GET/POSTのデータ処理 Q.HTTP クッキーを処理する方法が提供されていますか?
はい、提供されています。set EXEX_SQL_OPTION CGI; を実行すると
#!/usr/local/bin/pgbash exec 2>&1 echo "Content-type: text/html" echo "Set-Cookie: key11=111" echo "Set-Cookie: kei22=222" echo "" set EXEC_SQL_OPTION CGI;
declares -i x; let x=0; while(( x < HTTP_NCOOKIE )) do echo "${HTTP_COOKIEKEY[x] = ${HTTP_COOKIEVAL[x]}" let x=x+1 done