- 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' #(初期値:現在の日時)
#----------------------------------------------------------------
);
|