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

F A Q



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

Q.シェルスクリプトは存在しているが"No such file or directory"で実行できません。
    シェルスクリプトの改行コードは'LF'です。'CR+LF'コードになっていると、このエラーになります。もちろん、パスが間違っても同じです。
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 ""
     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.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
    
Q.pgbash の検索結果と psql の検索結果は同じですか?
    はい、基本的には同じです。但し、pgbashは次の機能を拡張しています。

    ・外枠罫線の出力有無のコントロール
    ・NULLや ZERO(文字型のAll bit off)に適当な文字列を表示する機能
Q.SQL文はそのまま backend に送信されますか?
    次のSQL文は、pgbashの内部で処理されます。

    ・ CONNECT 文、 DISCONNECT 文、 SET CONNECTION 文
    ・ SET EXEC_SQL_OPTION文、SET OPTION_NAME=VALUE; 文
    ・ 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 をバックエンドに送信しているのですか?
     これを知るには、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.COPY文でデータを入力するにはどうしますか?
     対話型環境では、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とゼロビット(空)とを区別して表示できますか?
     はい、可能です。例えば、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.検索した時の列名を取得する方法はありますか?
    はい、あります。$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 2001/05/01