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

pgbash の使用方法

 pgbashは、SQL;をシェルコマンドとして実行することができます。exec_sqlコマンドを使用して、各種のオプション付きでSQLを実行することもできます。以下の説明では、pgbashは"/usr/local/bin"ディレクトリにあるものとします。
◎ pgbashの起動と終了方法
  1. サブシェルとして使用する場合
     サブシェルとは、既に使用しているシェルの上で起動されたシェルのことをいいます。bashシェルを使用してログインした後に、/usr/local/bin/pgbash と入力すると、pgbashがサブシェルとして起動します。pgbashの起動時は、~/.bashrc と ~/.pgbashrc が読みこまれ次の Welcomeメッセージが表示されます。
      prompt> /usr/local/bin/pgbash
      Welcome to Pgbash version 2.2 ( bash-2.05.0(1)-release )
    
        Type '?' for HELP. (HELP is defined in ~/.pgbashrc)
        Type 'connect to DB;' before executing SQL.
        Type 'SQL;' to execute SQL.
        Type 'exit' or 'Ctrl+D' to terminate Pgbash.
    
      pgbash> exit
    
     exit (もしくは Ctrl+D)を入力しますと、サブシェル(pgbash)を終了し元のログインシェルに戻ります。

    尚、 pgbashを使用中に ~/.bashrc や ~/.pgbashrc を変更した場合は、source コマンドを使用して環境を更新します。例えば、 source ~/.pgbashrc とします。

  2. シェルスクリプトで使用する場合
    シェルスクリプトでは、シェルスクリプトの先頭に #!/usr/local/bin/pgbash を記述します。
    #!/usr/local/bin/pgbash
    source ~/.pgbashrc ......... 任意
    #

    ~/.pgbashrc に設定された環境を利用したい場合は、sourceコマンドを実行する必要があります。

    (注意)
    シェルスクリプトの改行コードはLFです。CR+LF になっていると実行できません。


◎ SQL文の指定方法
     対話型環境およびシェルスクリプトのいずれも、SQL;(終端子はセミコロン)と入力するだけでSQLを実行することができます。 SQL; は、time、パイプ、リダイレクション、バックグランドジョブ指定で実行することが可能です。SQLの指定方法は次です。

    [timespec] SQL; [pipeline][redirection][&]

     SQL文は単語の切れ目で自由に改行することができます。改行すると > プロンプトが表示されますので続けてSQL文を入力します。セミコロンが現れた時点でSQLの終了とみなします。

    例)
    pgbash> select * from test;
    pgbash> time select * from test; | more > /tmp/sel.dat &
    pgbash> insert into test values(111,
    > 'aaa','bbb');

    SQL; の形式はif文、while文の後ろに記述することはできません。SQLの実行状態を知りたい場合は、$SQLCODE を利用します。
    例) 
    select * from test;
    if [ $SQLCODE -eq $SQL_OK ]; then
       ...
    fi
    
     SQL; のなかで、シェル変数を利用することができます。 但し、fetch into文のinto句のホスト変数部分は、':'とシェル変数名にします。

    例)
    insert into test values($_AA, '$_BB', '$_CC');
    fetch in cur into :_AA, :_BB, :_CC;

◎ exec_sql の実行方法と一時的なオプション
     一時的に各種オプションを付けてSQLを実行したい場合や、データベース情報を表示する場合にexec_sqlを実行します。exec_sqlで指定するオプションは、exec_sql が実行が終了するとクリアされます。

    exec_sql [option] ["SQL"]

  1. SQL文の指定方法
     SQL文は" "の中に記述します。SQL文の最後に';'はあっても無くてもかまいません。SQL文は、単語の切れ目で自由に改行することができます。
      例) exec_sql "select aa,bb,cc from test_table
                              where a>'123' and dd<'999'"            
    
  2. exec_sql コマンドのオプション
       -i        turn on  CGI mode and set DATAs received from server
       --------------------- show infomations ---------------------
       -h item   help {\"SQL\", ALL,OPTION,ERRCODE}
       -v        show PostgreSQL and PGBASH VERSION
       -m        show CONNECTION NAMEs
       -s        show STATUS after executing SQL
       --------------------- temporary options --------------------
       -d conn   set  CONNECTION NAME
       -e        turn on  ECHO  query sent to the backend
       -q        turn on  QUIET system/sql error messages
       -P        turn on  PLAIN format(-P is default in normal mode)
       -H        turn on  HTML  format(-H is default in CGI    mode)
       -X        turn on  EXPANDED  format
       -L        turn on  OUTER_FRAME  of PLAIN text
       -T        turn off TOP_header   print
       -B        turn off BOTTOM_count print
       -A        turn off ALIGNMENT    of PLAIN text(e.g. -PXA) 
       -C cap    set CAPTION of HTML/PLAIN table(e.g. -C 'TITLE')
       -O opt    set OPTION  of HTML table tag(e.g. -O 'BORDER=0')
       -S sep    set SEPARATOR of PLAIN text field (default is '|')
       -N null   set NULL_STRING(e.g. -N '*N*')
       -Z zero   set ZERO_STRINg(e.g. -Z '*0*')
       --------------------- execute function  --------------------
       -x func   execute func(e.g. lo_import, lo_export, lo_unlink)
    

◎ オプション
    exec_sql で指定するオプションは一時的ですが、set 文を使用して全てのSQLに有効なオプションを指定できます。

    set EXEC_SQL_OPTION DEFAULT;
    set EXEC_SQL_OPTION CGI;
    set option_name[=value];

    (1) DEFAULT
    'set EXEC_SQL_OPTION DEFAULT;'は、全てのオプションをデフォルトに戻します。

    (2) CGI
    'set EXEC_SQL_OPTION CGI;'は、シェルスクリプトをCGIモードにします。

    (3) その他のオプション

    例)
    set OPTION_ECHO=TRUE; または set OPTION_ECHO=FALSE;
    set OPTION_SEPARATOR=',';
    set OPTION_NULLSTRING="*N*";

    option_name内容DEFAULT
    value
    OPTION_ECHOturn on/off ECHO query
    sent to the backend
    FALSE
    OPTION_QUIETturn on/off QUIET system/sql
    error messages
    FALSE
    OPTION_HEADERturn on/off TOP_header print
    TRUE
    OPTION_BOTTOMturn on/off BOTTOM_count print
    TRUE
    OPTION_ALIGNMENTturn on/off ALIGNMENT
    of PLAIN text
    TRUE
    OPTION_FRAMEturn on/off OUTER_FRAME
    of PLAIN text
    FALSE
    OPTION_EXPANDEDturn on/off EXPANDED format FALSE
    OPTION_HTMLturn on/off HTML mode FALSE
    OPTION_SEPARATORset SEPARATOR of PLAIN text '|'
    OPTION_NULLSTRINGset NULL string ""
    OPTION_ZEROSTRINGset ZERO string ""
    OPTION_CAPTIONset CAPTION string ""
    OPTION_TABLETAGset OPTION of HTML table tag ""

◎ ヘルプおよびデータベース表示情報について
  1. ヘルプメニュー
    pgbash> ?
       ??        : help pgbash usage
       ??h [SQL] : help SQL(or "SQL") syntax or all SQL reserved words
       ??e       : help SQLCODE (sql ERROR code)
       ??f       : help 'pgbashrc' FUNCTIONs for using a shell script
       ??o       : help 'exec_sql' options
       ...
    

  2. SQL予約語一覧の表示
    pgbash> ??h
       # HELP: Command Name List:
         ABORT                    ALTER GROUP              ALTER TABLE
         ALTER USER               BEGIN                    CHECKPOINT
         CLOSE                    CLUSTER                  CONNECT
         ...
    

  3. SQL文法の表示
    pgbash> ??h "crete table"
      # SQL command: CREATE TABLE
        Description: Creates a new table
        Syntax :
        CREATE [ TEMPORARY | TEMP ] TABLE table_name (
            { column_name type [ column_constraint [ ... ] ]
    	| table_constraint }  [, ... ]
    	) [ INHERITS ( inherited_table [, ... ] ) ]
    	...
    

  4. データベース情報の表示
    pgbash> ?
       ...
       ?u        : list database USERs
       ?l        : list DATABASEs
       ?d  [rel] : list RELATIONs for table/view/index/sequence
       ?d{t|i|v} : list TABLEs/INDEXes/VIEWs
       ?dl       : list LARGE_OBJECTs
       ?dp       : list PERMISSIONs 
       ?ds       : list SEQUENCEs
       ?dA       : list AGGREGATEs
       ?dD [obj] : list DESCRIPTIONs for table/type/function/operator
       ?dF       : list FUNCTIONs
       ?dO       : list OPERATORs
       ?dS       : list SYSTEM_TABLEs
       ?dT       : list data_TYPEs
       ...
    

    シェルスクリプトで使用する場合は、pgbashrc で定義された function を使用します。
    例)
    #!/usr/local/bin/pgbash
    source ~/.pgbashrc
    _list_relations
    _list_relation table_name

    Function nameInteractiveComment
    _list_users ?u list database USERs
    _list_databases ?l list DATABASEs
    _list_relations ?d list RELATIONs
    _list_relation ?d [rel] list RELATION for tbl/view/idx/seq
    _list_tables ?dt list TABLEs
    _list_indexes ?di list INDEXes
    _list_views ?dv list VIEWs
    _list_sequences ?ds list SEQUENCEs
    _list_permissions ?dp list PERMISSIONs
    _list_lobjects ?dl list LARGE_OBJECTs
    _list_aggregates ?dA list AGGREGATEs
    _list_descriptions ?dD list DESCRIPTIONs
    _list_description ?dD [obj] list DESCRIPTION for tbl/typ/func/ope
    _list_functions ?dF list FUNCTIONs
    _list_operators ?dO list OPERATORs
    _list_systables ?dS list SYSTEM_TABLEs
    _list_types ?dT list data_TYPEs
    _lo_import _lo_import large_object_import
    _lo_export _lo_export large_object_export
    _lo_unlink _lo_unlink large_object_unlink

◎ データベースの接続
     pgbashは、CONNECT, DISCONNECT, SET CONNECTION の3つのSQLを独自に実装してます。CONNECTは、接続名(connect_name)を指定してデータベースに接続します。SET CONNECTIONは、カレントのデータベース接続名を指定します。SET CONNECTIONが無い場合は、最後のCONNECTがカレントの接続名になります。そして最後に DISCONNECT によってデータベースの接続を切断します。それぞれの文法は次です。
      ・CONNECT TO dbname[@server[:port]] | DEFAULT  
                         [AS connect_name] [USER user_name [password]];
      ・DISCONNECT connect_name|CURRENT|DEFAULT|ALL;
      ・SET CONNECTION connect_name|DEFAULT;
    
      例) connect to postgres1 as db1 user postgres xxxxxxxx;
          connect to postgres2 as db2 ;   ....ログインのユーザ名が使用される
          set connection db1;
          select * from test1;
          set connection db2;
          select * from test2;
          disconenct all;
    
    もし、CONNECTを実行せずに SELECTなどのSQLを実行した場合は、自動的に"CONNECT TO DEFAULT"が発行されます。これは、psqlをデータベース名を指定せずに実行した場合と同等です。

    connect文で user を指定して password を指定しない場合は、password: プロンプトが表示されパスワード入力待ち状態になります。パスワードを設定していないユーザは、"CONNECT TO データベース名 USER ユーザ名 NULL"のようにパスワードにNULLを指定してください。ログインユーザ名と同じ名前のユーザ名の場合は、"user"以降を記述する必要はありません。

    disconnect all; で全ての接続を切断することができます。また、ログアウトしたりサブシェルを終了すると自動的に全て切断されます。シェルスクリプトは、シェルスクリプトが終了すると自動的に全て切断されます。
◎ データベースの接続状態表示
    exec_sql -m を指定すると、データベースの接続状態を示します。外枠を付ける場合は -L オプションをつけます。対話型環境では、m と入力するだけで exec_sql -mL が実行されます。例えば次のように3つの接続を行い exec_sql -mL としますと以下のように表示されます。
        connect to default;
        connect to postgres@www2.psn.ne.jp:5432  as db1;
        connect to admin@xxx.psn.ne.jp as db2 user admin;
        exec_sql -mL (対話型環境では m )
        # Connected Databases List (C: current database is '*')
        +---+--------------+-----------+------------------------------+
        | C | connect_name | user_name | target_name                  |
        +---+--------------+-----------+------------------------------+
        |   | _DEFAULT_    | postgres  | postgres:5432                |
        |   | db1          | postgres  | postgres@www.psn.ne.jp:5432  |
        | * | db2          | admin     | admin@xxx.psn.ne.jp:5432     |
        +---+--------------+-----------+------------------------------+
        (3 rows)
    
◎ 複数データベースのデータ操作
    複数のデータベースを取り扱う場合は、set connection文もしくは exec_sql -d オプションでデータベース接続名を指定してSQLを実行します。例えば次のように使用します。
      例) connect to postgres1 as db1;
          connect to postgres2 as db2;
          connect to postgres1 as db3;
          set connection db1;    <-------------- db1をカレントに指定
          exec_sql -d db2 "select * from test2" <-- db2の接続
          exec_sql        "select * from test1" <-- db1の接続
          exec_sql -d db3 "select * from test2" <-- db3の接続
          select * from test;                   <-- db1の接続
    
     set connection文は、カレントの接続名を変更します。以後のSQLは、exec_sql -d で変更しない限りカレントの接続名に対してSQLを実行します。それに対して、exec_sql の -d は、一時的に接続名を変えるだけでカレントの接続名は変更されません。

     CONNECT文は、同じデータベースに対して違う接続名で接続することができます。これを使用すると、1データベースに複数ユーザが接続しているテスト環境を容易に作成することができます。
◎ 検索結果のシェル変数への代入
     pgbashは、FETCH INTO文を使用して、検索結果をシェル変数に代入することができます。FETCH INTO文の文法は次です。
      FETCH [FORWARD|BACKWARD] [number|ALL] [IN cursorname]
            [INTO :host_var1 [[INDICATOR] :ind_var1], ...
                  :host_varN [[INDICATOR] :ind_varN]];
    
    INTO句を使用する場合は、number,ALLは不用です。但し、number, ALLを指定しても検索結果が1タプルの場合は、INTO句が有効となりシェル変数に代入されます。検索結果が複数タプルになった場合は、シェル変数には代入されずに標準出力に出力されます。

    (例)
    begin; 
    declare cur cursor for select * from test;
    declares -i x ; let x=0;  while ((x < 10))  
    do
       FETCH IN CUR INTO :code INDICATOR :ind_c,
                         :name:ind_n, :address :ind_a;
        if (( SQLCODE == SQL_OK )); then
            if ((ind_n != SQL_NULL || ind_a != SQL_NULL)); then
                echo "$code, $name, $address"
                let x=x+1
            fi
        else
            if(( SQLCODE == SQL_NOT_FOUND )); then
                    let x=11
            else
                    echo "$SQLERRMC"
                    let x=x+1
            fi
        fi
    done
    end;
    

    ここで、SQLCODEは SQLエラーコードを、$SQLERRMCは SQLエラーメッセージを表すシェル変数です。また、SQL_NULL, SQL_NOT_FOUNDは pgbashが初期設定している値です。(エラーコードを参照)

    FETCH INTO に使用するホスト変数(シェル変数)は、英小文字を使用した方が無難です。なぜなら、pgbashは先頭が SQL, OPTION, POSTGRESQL などの大文字のシェル変数を使用しているからです。

    # (( ))演算式のなかでは、整数型シェル変数の先頭'$'は省略することができます。


◎ 出力書式について
  1. 標準の出力モード
     select 結果の出力モードは、通常は平文モード(PLAIN text)になっています。'set EXEC_SQL_OPTION CGI;' を実行すると CGIモードになりHTML出力<TABLE BORDER=1>が標準状態になります。

  2. 検索結果の表のタイトルの変更

    exec_sql -C 'タイトル' "select * from test;"
    もしくは
    set OPTION_CAPTION='タイトル';
    select * from test;

  3. 平文出力時の外枠罫線の出力

    exec_sql -L "select * from test;"
    もしくは
    set OPTION_FRAME=TRUE;
    select * from test;
    +------+------------+----------+
    | code | name       | address  |
    +------+------------+----------+
    | 111  | sakaida    | kobe     |
    | 222  | haruhiko   | hirosima |
    | 333  | nobu       |          |
    |      | youko      | oosaka   |
    +------+------------+----------+
    (4 rows)
    
  4. テーブルのヘッダーと行数の表示の停止

    exec_sql -TB "select * from test"
    もしくは
    set OPTION_HEADER=FALSE;
    set OPTION_BOTTOM=FALSE;
    select * from test;
    +------+------------+----------+
    | 111  | sakaida    | kobe     |
    | 222  | haruhiko   | hirosima |
    | 333  | nobu       |          |
    |      | youko      | oosaka   |
    +------+------------+----------+
    
  5. NULL値、ゼロ値の表示

    exec_sql -N '*N*' -Z '-0-' "select * from test"
    もしくは
    set OPTION_NULLSTRING="*N*";
    set OPTION_ZEROSTRING="-0-";
    select * from test;
    +------+------------+----------+
    | 111  | sakaida    | kobe     |
    | 222  | haruhiko   | hirosima |
    | 333  | nobu       | -0-      |
    | NULL | youko      | oosaka   |
    +------+------------+----------+
    
◎ COPY命令について
    PostgreSQLの標準機能では、postgresスーパユーザだけがCOPY文においてファイル名を指定することができます。この場合、バックエンドが実際のファイル入出力処理を行います。 これに対して、pgbashは独自のCOPY機能を実装し、一般ユーザであってもファイル名を指定してファイルのコピーを行うことができます。また、列名を指定してコピーすることもできます。COPY文の文法を次に示します。

    COPY table ( [col1[,col2..]] ) {FROM | TO}
    {filename | STDIN | STDOUT}
    [ USING DELIMITERS 'delimiter' ] [ WITH NULL AS 'nullstring' ];

    pgbash独自実装のCOPY文は、テーブル名の後ろに()を付けます。()の中に列名を指定しない場合は、全列のコピーになります。尚、テーブル名の後ろに()が無い場合は、PostgreSQL標準のCOPY文として実行されます。

    (1) データベースへの書きこみ

    copy tbname(col1,col2) from /tmp/oo; のように指定された場合、pgbash内部では次のように変換されて実行されます
      begin;
      insert into tbname(col1,col2) values(読み込まれたデータ1)
      insert into tbname(col1,col2) values(読み込まれたデータ2)
      ...
      end;
    
    書きこみの途中でエラーを起こすと rollback されます。

    (2) データベースからの読み込み

    copy tbname(col1,col2) to /tmp/oo; のように指定された場合、pgbash内部では次のように変換されて実行されます
      begin;
      declare copy_cur00 cursor for select col1,col2 from tbname;
      fetch 300 in copy_cur00 >> /tmp/oo
      fetch 300 in copy_cur00 >> /tmp/oo
      ..
      end;
    

◎ CGI モードの設定とデータの読みこみ
     exec_sql -i を実行すると、HTML出力<TABLE BORDER=1>をデフォルトにします。また GET/POSTメソッドによるWWWサーバからのデータ入力およびHTTP_COOKIEのデータ読込を行います。

  1. CGIスクリプトの記述例
     例えば、次のようなホームページがあるものとします。
    <HTML>
    <FORM METHOD=POST ACTION="pgbash-test.sh">
    <INPUT TYPE=password NAME=passwd >
    <INPUT TYPE=text NAME="MYNAME" VALUE="sakaida">
    <INPUT TYPE=text NAME="ADDRESS" VALUE="Osaka">
    <INPUT TYPE=submit VALUE=submit>
    </HTML>

    このとき、CGIスクリプト(pgbash-test.sh)は、プログラムの先頭で exec 2>&1、Content-typeの指定、enable文および exec_sql -i を指定します。
    #!/usr/local/bin/pgbash
    exec 2>&1 ............ (1)
    echo "Content-type: text/html" ........................ (2)
    echo ""
    set EXEC_SQL_OPTION CGI; ......(3)
    #
    connect to dbname as db1 user nopbody $passwd;
    insert into test values( '$MYNAME','$ADDRESS');
    select * from test order by name limit 100;

    (1) exec 2>&1 は、標準エラー出力を標準出力に出力するための指定です。必須ではありませんが、bashが出力するエラーメッセージをホームページに表示することができます。
    (2) echo "Content-type: text/html"と echo ""は必須です。
    (3) シェルスクリプトを CGIとして実行する場合は、set EXEC_SQL_OPTION CGI; を実行します。これによって、ホームページで入力されたデータをシェル変数に設定し、出力モードをHTMLにします。

  2. GET/POSTメソッドによるデータの読みこみ
    set EXEC_SQL_OPTION CGI; を実行すると、ホームページでのデータ名(上例では passwd, MYNAME, ADDRESS)をそのままシェル変数として扱うことができます。(上記の(4),(5)を参照)

  3. クッキーのデータ読みこみ
    クッキーが設定されている場合は、$HTTP_COOKIE の値を分解して次のシェル変数に代入します。
      $HTTP_NCOOKIE        : クッキーの個数
      ${HTTP_COOKIEKEY[i]} : クッキーのキー名
      ${HTTP_COOKIEVAL[i]} : クッキーの値   
     (但し、i は 0 から HTTP_NCOOKIE-1 までです。)
◎ pgbashが使用するシェル変数
    pgbashは先頭が SQL, OPTION, POSTGRESQL を使用します。いずれも大文字のシェル変数です。ユーザが独自のシェル変数を使用する場合は、英小文字を使用してください。そうすれば、pgbashが自動的に作成するシェル変数と重なることはありません。

  1. SQLの実行状態を表すシェル変数
     pgbashは、SQL実行後の処理結果を次のシェル変数にセットします。
      $SQLOID     :(整数型) 最新のinsertのOIDの値
     $SQLCODE    :(整数型) SQLエラーコード (9.エラーコード参照)
                     0    --- 正常終了          
                     100  --- EOF(Eond Of File)  
                     負値 --- SQLエラー         
      $SQLERRMC   :(文字型) SQLエラーメッセージ(最大70字)
     $SQLERRML   :(整数型) SQL エラーメッセージの長さ(<70)
      $SQLERRD2   :(整数型) 検索結果の行数(PQntuples()の値)
      $SQLERRD3   :(整数型) 検索結果の列数(PQnfields()の値)
      $SQLNTUPLE  :(整数型) SQLERRD2と同じ
      $SQLNFIELD  :(整数型) SQLERRD3と同じ
    
      ${SQLFIELDNAME[i]} : 列名並び(i は 0 から SQLNFIELD-1 まで)
    

  2. オプション変数
    'set option_name[=value]; 'でセットされた値は、pgbash内部の変数とシェル変数に保管されます。
      $OPTION_ECHO       : turn on/off ECHO query  
      $OPTION_QUIET      : turn on/off QUIET mode  
      $OPTION_HEADER     : turn on/off TOP_header  
      $OPTION_BOTTOM     : turn on/off BOTTOM_print
      $OPTION_ALIGNMENT  : turn on/off ALIGNMENT   
      $OPTION_FRAME      : turn on/off OUTER_FRAME 
      $OPTION_EXPANDED   : turn on/off EXPANDED    
      $OPTION_HTML       : turn on/off HTML mode   
      $OPTION_SEPARATOR  : set SEPARATOR character 
      $OPTION_NULLSTRING : set NULL string         
      $OPTION_ZEROSTRING : set NULL string         
      $OPTION_CAPTION    : set NULL string         
      $OPTION_TABLETAG   : set NULL string         
    

  3. エラーコード
     pgbashは、SQLエラーコードを次のシェル変数にセットしています。対話型環境では、'??e'で見ることができます。
      $SQL_OK                 :    0 : normal end. 
      $SQL_NOT_FOUND          :  100 : EOF(End Of File). 
      $SQL_SYSTEM_ERROR       : -200 : system error. 
      $SQL_TOO_MANY_ARGUMENTS : -201 : too many arguments in fetch_stmt. 
      $SQL_TOO_FEW_ARGUMENTS  : -202 : too few  arguments in fetch_stmt. 
      $SQL_CONNECT_ERROR      : -203 : Database connection error. 
      $SQL_INVALID_STMT       : -230 : invalid statements. 
      $SQL_READONLY_SHELLVAR  : -231 : can not set read-only shell variable. 
      $SQL_DB_NOT_OPEN        : -232 : DB not open. 
      $SQL_CNAME_NOT_FOUND    : -233 : connect-name not found. 
      $SQL_CNAME_ALREADY_USE  : -234 : connect-name already exist. 
      $SQL_INVALID_COMMAND    : -235 : invalid command. 
      $SQL_BAD_RESPONSE       : -400 : bad response(backend maybe died)." 
      $SQL_EMPTY_QUERY        : -401 : empty query (backend lost query). 
      $SQL_CONNECTION_BAD     : -402 : connection bad(disconnect backend)" 
      $SQL_FATAL_ERROR        : -403 : query fatal error   (SQL error on backend) 
      $SQL_NONFATAL_ERROR     : -404 : query nonfatal error(SQL error on backend) 
      $SQL_NULL               :   -1 : indicator is NULL. 
    
     エラーコードは、(( ))演算式を利用してシェルスクリプトの中で次のように使用します。
    (例) insert into test values(111,'aaa','bbb');
         if(( SQLCODE < SQL_OK )); then
            echo $SQLERRMC
         fi
    
    また、SQL実行後に'?s'とすると、エラーコードなどを表示することができます。
    (例) pgbash> ?s
         # SQL status 
         SQLCODE   = -403   (SQL error code)
         SQLNTUPLES= 0      (number of tuples)
         SQLNFIELDS= 0      (number of fields)
         SQLERRML  = 38     (length of SQLERRMC)     
         SQLERRMC  = ERROR:  testxxx: Table does not exist.
    
  4. その他のシェル変数

    (1) $SQLNFILED、${SQLFILEDNAME[i]}シェル変数
    select 結果の列数と列名を保管しています。

    (2) $SQLOIDシェル変数
    insertの OIDの値を保管しています。

    (3) $POSTGRESQL_VERSION shell variable
    POSTGRESQL_VERSIONは、PostgreSQLのバージョン番号(例: 6.5.3, 7.0.3, 7.1)を保管しています。
    (例) VER1=${POSTGRESQL_VERSION:0:1}
         VER2=${POSTGRESQL_VERSION:2:1}
         if (( VER1 == 7 && VER2 == 1 )); then
            echo "PostgreSQL version 7.1."
         fi
    
◎ 制約
  1. bashコマンド
     bashの declare、set、selectコマンドは、SQL文の先頭語と同じになります。pgbashでは、SQL文を優先的に取り扱いますので、bashのコマンド名を次のように変更してます。
      bashのdeclareコマンド ==> declares
      bashのsetコマンド     ==> sets
      bashのselectコマンド  ==> selects
    
  2. SQL; の位置
    SQL; は、文の先頭からかもしくは、time [option] のタイムスペックの後ろしか記述できません。if文や while文などの後ろには記述できません。

  3. SQL実行状態を表すシェル変数の利用
    SQLをパイプライン処理( | more など)やバックグランドジョブ(SQL; & )で実行した場合、SQL実行後のシェル変数(例えば、$SQLCODEなど)は参照できません。これは、パイプライン処理とバックグランド処理が、別プロセスで起動されるため、もとのプロセスにシェル変数の値を返せないからです。例えば次のような使い方は正しくありません。

    (1) SQL状態表示

    pgbash> select * from test; | more
    pgbash> ?s ...上のselect文のSQL状態は参照できません。

    (2) バックグランドジョブの fetch into

    fetch in cur into :aa, :bb; & ... $aa,$bbの値を参照できません

  4. ユーザが使用するシェル変数
    Pgbashは英大文字のシェル変数を使用していますので、ユーザが使用するシェル変数は英小文字の方が無難です。

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

Last Modified at 2001/05/01