[Prev] [Menu] [Next]
SQLの指定方法
- SQLの記述方法
- 記述方法
[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" とは全く同じ意味になります。
- SQLの終端子
SQL文を直接記述する場合は、SQLの終端子(セミコロン)は必須です。しかし、exec_sql "SQL"と記述した場合、SQLの終端子は有っても無くてもかまいません。
- SQL文の途中の改行
SQL文は単語の切れ目で自由に改行することができます。対話型環境では、改行すると > プロンプトが表示されますので続けてSQL文を入力します。セミコロンが現れた時点でSQLの終了とみなします。
(対話型環境の例) pgbash> insert into test values(111, > 'aaa','bbb' >); (シェルスクリプトの例)
insert into test values(111, 'aaa','bbb' );
- シェル変数の利用
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の実行方法
- 対話型環境における実行
対話型環境において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 は、処理時間を表示する場合に使用します。"&>"は、既にファイルが存在していても強制的に上書でファイルを作成します。
- シェルスクリプトにおける実行
上記の対話型環境と同様の処理を行なうには、次のようにします。
例) シェルスクリプト"sel.bat"pgbash> sel.bat | more .................. パイプの例 pgbash> sel.bat &> /tmp/xx.dat .......... リダイレクションの例 pgbash> sel.bat & ....................... バックグランドジョブの例 pgbash> time sel.bat .................... timespecの例 pgbash> sel.bat &> /tmp/xx.dat & ........ リダイレクションとバックグランドジョブ
#!/usr/local/bin/pgbash connect to postgres user postgres; select * from test; disconnect all; ...... disconnect は無くてもかまいません
- 検索結果の表示の中断
検索結果が画面に表示されている途中に、その表示をとめたい場合は、Ctrl+C を押します。但し、Ctrl+C を押しても、画面表示はすぐには止まりません。数十行は表示されてしまいます。
- メモリオーバー
検索結果は、メモリに一時的に保管されますので、あまりに多くの検索結果を表示すると、メモリオーバ−のエラーになる可能性があります。大量の結果を表示する場合は、limit をつけてください。
例)
pgbash> select * from test limit 500; | more ............. 最大500行表示
pgbash> select * from test limit 500 offset 100; | more .. 100行目から最大500行表示
- SQLの指定方法の制限
- SQLの位置
SQL; は timespec や 空白 を除いて、行の先頭から記述しなければなりません。if文、while文の後ろに記述することはできません。
間違いの例 正しい例 if SQL * from test; then ... fi select * from test; if (( SQLCODE == 0 )); then ... fi
SQLの実行状態を知りたい場合は、SQLCODE シェル変数を利用します。
- 予約語
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文だと判断した場合、セミコロンが現れるまで入力を要求します。
- SQL入力の中断
SQL入力を途中で中断したい場合は、次のようにしてください。
a. 1行目の途中であれば、Ctrl+C
b. 2行目以降の途中であれば、Ctrl+D
もしくは、セミコロンを入力してSQLを実行させシンタックスエラー終了させます。
- 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]