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

F A Q



Q.pgbashは、bashのどのバージョンを使用しますか?
     bash-2.03のソースプログラムを使用します。pgbash-2.0以降のバージョンでは、bash-2.03のソースにパッチをあてて独自のpgbashという名前のシェルを作成します。
Q.testディレクトリで動作テストしたら"No differences encountered"が数行表示されたが正常ですか?
    はい、正常です。 動作テストでは、単に 処理結果を results/ に書込み expected/ に既に作成されている処理結果のファイルと diff をとるだけになっています。
     diffコマンドは、2つのファイル間で"差異が無い場合に何も出力しないタイプ"と"上記のように表示をするタイプ"があるようです。いずれにしてもdiffで差異がなければ正常ということになります。
Q.独自の対話型操作環境を作成したのですがどうすれば良いですか?
     /etc/pgbashrc をホームディレクトリに .pgbashrc としてコピーし、そのファイルに独自の対話型操作環境を追加でしてください。

Q.シェルプログラムで alias相当の指定ができますか?
    シェルプログラム内では alias は使用できませんので、function を定義します。例えば次のようにします。
     #!/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 ""
     exec_sql  -i
    
Q.CONNECT文を使用しなくても自動的にデータベースに接続してくれますか?
    CONNECT文を実行せずに SQL文を実行した場合は、ログインユーザ名をユーザ名とし、ユーザ名と同じ名前のデータベース名に対して自動的に接続します。
    例えば、ログインユーザ名が admin の場合は、exec_sql "connect to default" 又は exec_sql "connect to admin user admin"が実行されたことと同じになります。

     但し、パスワードが設定されているデータベースは、"CONNECT データベース名 user ユーザ名 [パスワード]"の形式で CONNECT文を実行しなければなりません。CONNECT文の最後にパスワードを記述しなかった場合は、パスワードの入力要求メッセージが表示されますので、それにしたがってパスワードを入力しなければなりません。
Q.CONNECT文で接続名を指定しなかった場合はどうなりますか?
    "CONNECT TO データベース名 AS 接続名" の接続名を省略した場合は、データベース名と同じ名前になります。次の例では接続名はいずれも"admin"です。
      exec_sql "connect to admin"
      exec_sql "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.pgbashはCGIプログラムとして利用することができますか?
     はい、できます。すべての出力を HTML出力に切り替え、GET/POSTメソッドにデータを読み込みシェル変数にセットする機能があります。pgbashをCGIプログラムとするには、exec 2>&1 と exec_sql -i が必須になります。
     #!/usr/local/bin/pgbash
     exec 2>&1    ................ pgbashの標準エラー出力を標準出力に切り替える
     echo "Content-type: text/html"
     echo ""
     exec_sql  -i ................ HTML出力、GET/POSTのデータ処理
    
Q.HTTP クッキーを処理する方法が提供されていますか?
    はい、提供されています。exec_sql -i を実行すると $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 ""
     exec_sql  -i
     # 
     declares -i x; let x=0; while(( x < HTTP_NCOOKIE ))
     do
            echo "${HTTP_COOKIEKEY[x] = ${HTTP_COOKIEVAL[x]}"
    	let x=x+1
     done
    
Q.pgbash の検索結果と psql の検索結果は同じですか?
    はい、基本的には同じです。但し、pgbashは、psqlで使用している PQprint()を拡張した PSprint()を使用していますので、結果の表示形態は次の点が異なることがあります。

    ・外枠罫線の出力
    ・NULL, 空 を'NULL','-0-'などの文字列として表示
    ・行数の表示の停止
    ・タイトル文字列の挿入
Q.SQL文はそのまま backend に送信されますか?
    次のSQL文は、pgbashの内部で処理されます。

    ・ CONNECT 文、 DISCONNECT 文、 SET CONNECTION 文
    ・ FETCH INTO 文の INTO句 (INTO句を除いた文が backend に送信される)
    ・ COPY table () 文 (COPY文はそのまま backend に送信される)

    上記のSQL文を除いた他の全てのSQL文はそのまま backend に送信されます。
Q.Fetch Into 文で 検索数とか'ALL'を指定したらどうなりますか?
     fetch ALL in cur into :aaa, :bbb, :ccc; のようにした場合、検索結果が複数タプルの場合は、into句の処理はされません。標準出力(画面)に出力されてしまいます。ALLを指定しても検索結果が1タプルの場合は、into句は処理され、シェル変数 aaa,bbb, ccc に値がセットされます。一般的には、into句を指定する場合は検索数とか'ALL'は指定しません。
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 をバックエンドに送信しているのですか?
     これを知るには、exec_sql -e -l tables のように -e オプションをつけてデータベース情報表示コマンドを実行してください。表示結果の先頭に、バックエンドに送信される QUERY が表示されます。尚、データベース情報の表示コマンドの種類は「使用方法」を参照してください。
Q.COPY文でデータを入力するにはどうしますか?
     対話型環境では、exec_sql "copy table_name from STDIN" と入力します。すると、次のようなメッセージが表示されますので、データを入力します。データの区切りは標準でタブになっています。
     copy table_name from STDIN;             ................ COPY文の入力
     Enter info followed by a newline        ................ システムメッセージ
     End with a backslash and a period on a line by itself.
     >>
     111	namae1	jyuusyo1                 ................ データを入力
     222	namae2	jyuusyo2
     \.                                      ................ 終了記号
     
    シェルプログラムでは、ヒアドキュメントにします。また、"Enter info..."のシステムメッセージを表示したくない場合は "&> /dev/null" を指定します。
     #!usr/local/bin/pgbash
     copy table_name from STDIN; &> /dev/null << EOF
     111	namae1	jyuusyo1                 ................ データを入力
     222	namae2	jyuusyo2
     EOF                                     ................ 終了記号
    
 
Q.COPY文で列名を指定できますか?
    はい、可能です。
       copy table_name( 列名1, 列名2, .. ) to '/tmp/test.dat';
     
    のようにテーブル名の後ろに列名を指定します。
Q.スペースとNULLとゼロビット(空)とを区別して表示できますか?
     はい、可能です。-N , -Z オプションを指定します。例えば、NULLを"-NULL-"、空を"-0-"にした場合は次のようにします。
    exec_sql -N '-NULL-' -Z '-0-' "select * from test"
    
    code  |name      |address
    ------+----------+--------
    222   |test2     |addr2
    333   |          |-0-
    444   |-NULL-    |-NULL-
    (3 rows)
    
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
    

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

Last Modified at 2000/05/10