[Prev] [Menu] [Next]

SQLの指定方法


  • SQLの記述方法

    (1) 記述方法

    [timespec] SQL; [pipeline][redirection][&]
    もしくは
    [timespec] exec_sql [option] "SQL" [pipeline][redirection][&]

     対話型環境およびシェルスクリプトのいずれも、SQL文をそのまま入力(記述)するだけでSQLを実行することができます。 SQL文は、timespec、パイプ、リダイレクション、バックグランドジョブの指定と伴に実行することができます。また、exec_sqlは、一時的なオプションを付けて、SQLを実行することができます。

    SQL; は pgbash内部で exec_sql "SQL"に変換されて実行されます。従いまして、 SQL; と exec_sql "SQL" とは全く同じ意味になります。

    (2) SQLの終端子

    SQL文を直接記述する場合は、SQLの終端子(セミコロン)は必須です。しかし、exec_sql "SQL"と記述した場合、SQLの終端子は有っても無くてもかまいません。

    (3) SQL文の途中の改行

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

    (対話型環境の例)
    pgbash> insert into test values(111,
    > 'aaa','bbb'
    >);

    (シェルスクリプトの例)
    insert into test values(111,
    'aaa','bbb'
    );
    

    (4) シェル変数の利用

     SQL のなかで、シェル変数を利用することができます。シェル変数は、値を参照する場合は頭に $ マークを付けます。

    例)
    _aa='123'
    _bb='name'
    _cc='address'
    insert into test values($_aa, '$_bb', '$_cc');
    COL1='氏名'
    VAL1='鈴木一郎'
    select $COL1, $COL2 from test where $COL1='$VAL1';
    SQL="select * from test"
    exec_sql "$SQL"

    シングルクォート文字データが有る場合、\' で囲む必要があります。

    例)
    DATA="name'123"
    select * from test where name=\'$DATA\';


  • SQLの実行方法

    (1) 対話型環境における実行

    対話型環境においてSQLを入力すると、即座に実行されます。SELECTなどの検索命令は、検索結果が即座に画面に表示されます。
    例)
    select * from test; | more .................. パイプの例
    select * from test; &> /tmp/xx.dat .......... リダイレクションの例
    select * from test; & ....................... バックグランドジョブの例
    time select * from test; .................... timespecの例
    select * from test; &> /tmp/xx.dat & ........ リダイレクションとバックグランドジョブ
    
    exec_sql "select * from test" | more
    exec_sql "select * from test"  &> /tmp/xx.dat 
    
    ここで、| more は、表示行数が多い場合に、画面のサイズに合わせて表示を一旦停止する指定です。また、timespec は、処理時間を表示する場合に使用します。"&>"は、既にファイルが存在していても強制的に上書でファイルを作成します。

    (2) シェルスクリプトにおける実行

    上記の対話型環境と同様の処理を行なうには、次のようにします。

    例)
    シェルスクリプト"sel.bat"
    #!/usr/local/bin/pgbash
    connect to postgres user postgres;
    select * from test;
    disconnect all;  ...... disconnect は無くてもかまいません
    
    pgbash> sel.bat | more .................. パイプの例
    pgbash> sel.bat &> /tmp/xx.dat .......... リダイレクションの例
    pgbash> sel.bat & ....................... バックグランドジョブの例
    pgbash> time sel.bat .................... timespecの例
    pgbash> sel.bat &> /tmp/xx.dat & ........ リダイレクションとバックグランドジョブ
    

    (3) 検索結果の表示の中断

    検索結果が画面に表示されている途中に、その表示をとめたい場合は、Ctrl+C を押します。但し、Ctrl+C を押しても、画面表示はすぐには止まりません。数十行は表示されてしまいます。

    (4) メモリオーバー

    検索結果は、メモリに一時的に保管されますので、あまりに多くの検索結果を表示すると、メモリオーバ−のエラーになる可能性があります。大量の結果を表示する場合は、limit をつけてください。

    例)
    pgbash> select * from test limit 500; | more ............. 最大500行表示
    pgbash> select * from test limit 500 offset 100; | more .. 100行目から最大500行表示


  • SQLの指定方法の制限

    (1) SQLの位置

    SQL; は timespec や 空白 を除いて、行の先頭から記述しなければなりません。if文、while文の後ろに記述することはできません。
    間違いの例 正しい例
      if SQL * from test;
      then
      ...
      fi
      
    select * from test;
    if (( SQLCODE == 0 )); then
       ...
    fi
    

    SQLの実行状態を知りたい場合は、SQLCODE シェル変数を利用します。


    (2) 予約語

    Pgbashは、次の予約語がコマンド並びの先頭もしくは timespecの直後にあった場合、それを SQL文だと判断します。

    (PostgreSQL-8.1の予約語の例)
    ABORT                     CREATE LANGUAGE           DROP VIEW
    ALTER AGGREGATE           CREATE OPERATOR CLASS     END
    ALTER CONVERSION          CREATE OPERATOR           EXECUTE
    ALTER DATABASE            CREATE ROLE               EXPLAIN
    ALTER DOMAIN              CREATE RULE               FETCH
    ALTER FUNCTION            CREATE SCHEMA             GRANT
    ALTER GROUP               CREATE SEQUENCE           INSERT
    ALTER INDEX               CREATE TABLE              LISTEN
    ALTER LANGUAGE            CREATE TABLE AS           LOAD
    ALTER OPERATOR CLASS      CREATE TABLESPACE         LOCK
    ALTER OPERATOR            CREATE TRIGGER            MOVE
    ALTER ROLE                CREATE TYPE               NOTIFY
    ALTER SCHEMA              CREATE USER               PREPARE
    ALTER SEQUENCE            CREATE VIEW               PREPARE TRANSACTION
    ALTER TABLE               DEALLOCATE                REINDEX
    ALTER TABLESPACE          DECLARE                   RELEASE SAVEPOINT
    ALTER TRIGGER             DELETE                    RESET
    ALTER TYPE                DROP AGGREGATE            REVOKE
    ALTER USER                DROP CAST                 ROLLBACK
    ANALYZE                   DROP CONVERSION           ROLLBACK PREPARED
    BEGIN                     DROP DATABASE             ROLLBACK TO SAVEPOINT
    CHECKPOINT                DROP DOMAIN               SAVEPOINT
    CLOSE                     DROP FUNCTION             SELECT
    CLUSTER                   DROP GROUP                SELECT INTO
    COMMENT                   DROP INDEX                SET
    COMMIT                    DROP LANGUAGE             SET CONSTRAINTS
    COMMIT PREPARED           DROP OPERATOR CLASS       SET ROLE
    COPY                      DROP OPERATOR             SET SESSION AUTHORIZATION
    CREATE AGGREGATE          DROP ROLE                 SET TRANSACTION
    CREATE CAST               DROP RULE                 SHOW
    CREATE CONSTRAINT TRIGGER DROP SCHEMA               START TRANSACTION
    CREATE CONVERSION         DROP SEQUENCE             TRUNCATE
    CREATE DATABASE           DROP TABLE                UNLISTEN
    CREATE DOMAIN             DROP TABLESPACE           UPDATE
    CREATE FUNCTION           DROP TRIGGER              VACUUM
    CREATE GROUP              DROP TYPE
    CREATE INDEX              DROP USER
    

    PgbashがSQL文だと判断した場合、セミコロンが現れるまで入力を要求します。

    (3) SQL入力の中断

    SQL入力を途中で中断したい場合は、次のようにしてください。

    a. 1行目の途中であれば、Ctrl+C
    b. 2行目以降の途中であれば、Ctrl+D

    もしくは、セミコロンを入力してSQLを実行させシンタックスエラー終了させます。

    (4) SQL予約語とプログラム名が重なった場合

    もしプログラム名と、上記の予約が重なった場合は、プログラムの実行時にパスを指定します。例えば、"ALTER"という名前のプログラムがあった場合は次です。

    pgbash> ./ALTER ........... カレントの"ALTER"プログラム
    pgbash> /home/admin/ALTER .. /home/adminの"ALTER"プログラム


  • SQL文中のシングルクォート/ダブルクォート

    SQL文では、1個のシングルクォート文字データはシングルクォートを2個並べる必要があります。

    例) insert into test values(111,'aaa''aaa');

    シングルクォート1個をシングルクォート文字データとして取り扱うには、\' で囲まなければなりません。

    例) DATA="aaa'aaa"
    insert into test values(111,\'aaa'aaa\');
    insert into test values(111,\'$DATA\');

    SQL文中のダブルクォートは、pgbash-2.4a.1までは、\" にしなければなりませんでしたが、pgbash-2.4a.2 より、\ は不要になりました。

    例) select aa as "Name", bb as "Tom's Type" from test;

  • SQL文中のコメント

    SQL文中に '#' が現れた場合、'#'から改行までをコメントとみなします。
    例)
    create table member (
    #---------------------------------------------------------------
       userid       int4                     # ユーザコード
                    primary key not null,    # プライマリーキー
    #---------------------------------------------------------------
       kind         varchar(12)              # 会員種別
                    check(kind in ('A','B')),# ('A', or 'B')
    #---------------------------------------------------------------
       name         varchar(32) not null,    # ユーザ名
    
    #---------------------------------------------------------------
       zip          char(8)                  # 郵便番号
                    default '000-0000',
    #---------------------------------------------------------------
       address      varchar(64) not null,    # 住所
    
    #---------------------------------------------------------------
       tel          varchar(16) not null,    # 電話番号
    
    #----------------------------------------------------------------
       email        varchar(64),             # E-mailアドレス
    
    #----------------------------------------------------------------
       up_date      timestamp                # 更新日
                    default 'now'            #(初期値:現在の日時)
    #----------------------------------------------------------------
    );
    

[Prev] [Menu] [Next]