[Home] [ダウンロード] [インストール] [使用方法] [使用例] [FAQ]

F A Q


インストールに関するFAQ

bashの操作に関するFAQ

データベースの接続に関するFAQ

SQLの操作に関するFAQ

検索結果の出力に関するFAQ

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; を実行すると $HTTP_NCOOKIEにクッキーの個数、${HTTP_COOKIEKEY[i]}にキー名、${HTTP_COOKIEVAL[i]}にクッキーの値がセットされます。(クッキーの文字列は $HTTP_COOKIE にセットされています)
     #!/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
    

[Home] [ダウンロード] [インストール] [使用方法] [使用例] [FAQ]