database.sarang.net
UserID
Passwd
Database
DBMS
MySQL
ㆍPostgreSQL
Firebird
Oracle
Informix
Sybase
MS-SQL
DB2
Cache
CUBRID
LDAP
ALTIBASE
Tibero
DB 문서들
스터디
Community
공지사항
자유게시판
구인|구직
DSN 갤러리
도움주신분들
Admin
운영게시판
최근게시물
PostgreSQL Q&A 8921 게시물 읽기
No. 8921
psql \set 명령어
작성자
김상기(ioseph)
작성일
2011-12-28 14:49
조회수
8,672

 오늘 참한 기능 하나 알게 되어 기록을 남겨둡니다. 

 

psql에서, 

\set 명령

그냥 psql에서의 환경 설정 정보를 보거나 저장하는 기능으로만 알고 있있었는데, 

이놈이 세션 단위 변수 설정이 가능하네요. 

(psql 실행환경에 대한 변수 설정은 \pset 명령으로 합니다. 좀 헷갈리게 되어있네요.)  

postgres=# \set
AUTOCOMMIT = 'on'
PROMPT1 = '%/%R%# '
PROMPT2 = '%/%R%# '
PROMPT3 = '>> '
VERBOSITY = 'default'
VERSION = 'PostgreSQL 9.0.5 on x86_64-unknown-linux-gnu, compiled by GCC gcc (GCC) 4.1.2 20080704 (Red Hat 4.1.2-46), 64-bit'
DBNAME = 'postgres'
USER = 'postgres'
HOST = 'localhost'
PORT = '5432'
ENCODING = 'UTF8'
postgres=#

변수 지정은 늘 하는 방식 대로 \set 변수명 '변수값',

변수 사용은 :변수명

postgres=# \set
AUTOCOMMIT = 'on'
PROMPT1 = '%/%R%# '
PROMPT2 = '%/%R%# '
PROMPT3 = '>> '
VERBOSITY = 'default'
VERSION = 'PostgreSQL 9.0.5 on x86_64-unknown-linux-gnu, compiled by GCC gcc (GCC) 4.1.2 20080704 (Red Hat 4.1.2-46), 64-bit'
DBNAME = 'postgres'
USER = 'postgres'
HOST = 'localhost'
PORT = '5432'
ENCODING = 'UTF8'
a = 'select version();'
postgres=# :a
                                                      version
-------------------------------------------------------------------------------------------------------------------
 PostgreSQL 9.0.5 on x86_64-unknown-linux-gnu, compiled by GCC gcc (GCC) 4.1.2 20080704 (Red Hat 4.1.2-46), 64-bit
(1 row)

postgres=#

윗 예제는 select version() 이라는 쿼리를 a 라는 별칭으로 지정하고 사용하는 방법입니다. 

물론 세션 단위에서만 사용가능한 변수가 됩니다. psql 실행할 때마다 미리 지정하고 싶다면 .psqlrc 파일에 등록해 두면 되겠죠.

이와 함께 프로그램의 변수처럼 쿼리 안에서도 그대로 사용할 수 있는데, 값을 지정할 때, 작은 따옴표 안에 있는 모든 문자열이 변수로 그대로 대체됩니다. 

postgres=# \set a 'asdf'
postgres=# select :a, now();
ERROR:  column "asdf" does not exist
LINE 1: select asdf, now();
               ^
postgres=# \set a '''asdf'''
postgres=# select :a, now();
 ?column? |             now
----------+------------------------------
 asdf     | 2011-12-28 14:22:49.47519+09
(1 row)

postgres=#

잘 쓰면 아주 유용하게 쓸 명령이네요. 

해당 변수 삭제는 \unset 변수명

이왕 있는 김에 \prompt 이런 것도 하나 있었으면 좋겠건만.... 이리 생각하고 혹시나 하고 찾아보니, \prompt 명령도 이미 있었네요. 

그런데, 이놈은 sql*plus 처럼 참하질 않네요. 

여튼 지금까지 찾은 방법으로는 psql 실행할 때 사용하는 것 빼고는 그리 쓸모가 없어보입니다. 

-bash-3.2$ cat find_table.sql
\x
\prompt 'Type table name to find: ' tb
select * from pg_class where relname = :tb;
-bash-3.2$ psql -f find_table.sql
Password:
Expanded display is on.
Type table name to find: 'pg_class'
-[ RECORD 1 ]---+--------------
relname         | pg_class
relnamespace    | 11
reltype         | 83
reloftype       | 0
relowner        | 10
relam           | 0
relfilenode     | 0
reltablespace   | 0
relpages        | 7
reltuples       | 253
reltoastrelid   | 0
reltoastidxid   | 0
relhasindex     | t
relisshared     | f
relistemp       | f
relkind         | r
relnatts        | 27
relchecks       | 0
relhasoids      | t
relhaspkey      | f
relhasexclusion | f
relhasrules     | f
relhastriggers  | f
relhassubclass  | f
relfrozenxid    | 655
relacl          | {=r/postgres}
reloptions      |

-bash-3.2$

문서 끝

[Top]
No.
제목
작성자
작성일
조회
8924CLUSTER 질문 [1]
facy
2012-01-06
8038
89237.3버전 자료를 백업해서 8.4버전으로 안옮겨지는 이유는 왜일까요? [2]
송민재
2012-01-04
8093
8922bitmap index scan 질문 [2]
facy
2011-12-28
8700
8921psql \set 명령어
김상기
2011-12-28
8672
8920컬럼 타입 변환 관련 질문입니다. [1]
이종복
2011-12-27
7936
8919index를 이용한 정렬 [6]
facy
2011-12-26
11719
8917Numeric 관련 질문드립니다. [1]
이종복
2011-12-26
8095
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2024 DSN, All rights reserved.
작업시간: 0.020초, 이곳 서비스는
	PostgreSQL v16.2로 자료를 관리합니다