About
home
Tmax OpenSQL
home
💻

54. (Interface) TCL

작성자
KMS

TCL개요

TCL란?
Tcl 언어를 사용하여 함수 및 트리거 절차를 생성할 수 있게 해주는 postgres 데이터 베이스 시스템 용 로드 가능한 절차적 언어.
- Pg 공식 홈페이지- PL/Tcl은 일부 제한 사항을 제외하고 C 언어에서 함수 작성기가 제공하는 대부분의 기능을 제공 합니다.
좋은 제한은 모든 것이 안전한 Tcl 인터프리터에서 실행된다는 것입니다. 
안전한 Tcl의 제한된 명령 세트 외에도 SPI를 통해 데이터베이스에 액세스하고 elog()를 통해 메시지를 생성하는 데 몇 가지 명령만 사용할 수 있습니다. 
C와 같이 Postgres 사용자 ID 의 권한으로 데이터베이스 백엔드 내부에 액세스하거나 OS 수준 액세스를 얻을 수 있는 방법이 없습니다 .
따라서 권한이 없는 데이터베이스 사용자는 이 언어를 사용하도록 허용될 수 있습니다.
또 다른 내부 제한 사항은 Tcl 프로시저를 사용하여 새로운 데이터 유형에 대한 입력/출력 기능을 생성할 수 없다는 것입니다.
설치 절차의 구성 단계에서 Tcl/Tk 지원이 지정된 경우 PL/Tcl 호출 처리기에 대한 공유 객체가 자동으로 구축되어 Postgres 라이브러리 디렉터리에 설치됩니다.

테스트 환경

Linux
OS
CentOS 7.6
PostgreSQL Version
PostgreSQL 14.2
TCL Version
TCL 8.6.12
Driver Version
pgtcl 2.8.0

지원 범위

License
Free BSD-3
Supported Version
PostgreSQL 9.2 or later

테스트 환경 구축

Linux
TCL 설치
TCL-8.6.12 소스 다운로드 아래의 링크에서 tcl8.6.12 소스 다운로드 - TK는 설치하지 않아도 테스트 가능
TCL 컴파일
#디렉토리 생성 및 압축해제 mkdir -p /hypersql/interface/src tar xvzf tcl8.6.12-src.tar.gz -C /hypersql/interface/src
Plain Text
복사
#컴파일 mkdir -p /hypersql/interface/tcl/tcl-8.6.12 cd /hypersql/interface/src chmod 755 tcl8.6.12 -R cd tcl8.6.12 cd unix ./configure --prefix=/hypersql/interface/tcl/tcl-8.6.12 make make install
Plain Text
복사
pgtcl 설치
pgtcl 2.8.0 소스 다운로드 아래의 링크에서 pgtcl 2.8.0 다운로드
pgtcl 컴파일
#디렉토리 생성 및 압축해제 tar xvzf Pgtcl-2.8.0.tar.gz -C /hypersql/interface/src cd /hypersql/interface/src
Plain Text
복사
autoreconf 명령어를 사용하기 위해서는 autoconf 패키지가 필요합니다. 해당 명령어가 없을 시 설치한 후 진행합니다.
yum install autoconf
#컴파일 chmod 755 Pgtcl-2.8.0 -R cd Pgtcl-2.8.0 autoreconf ./configure --prefix=/hypersql/interface/tcl/tcl-8.6.12 --with-postgres-include=/usr/pgsql-14/include --with-postgres-lib=/usr/pgsql-14/lib --with-tcl=/hypersql/interface/tcl/tcl-8.6.12/lib --with-tclinclude=/hypersql/interface/tcl/tcl-8.6.12/include make make install
Plain Text
복사

테스트 프로젝트 생성

pgtcl
vi pgtcl.tcl
JavaScript
복사
pgtcl.tcl
package require Pgtcl proc connectDB { {host "127.0.0.1"} {port "5432"} {db "postgres"} {user "postgres"} {password "1234"} } { set conn [pg_connect $db -host $host -port $port -user $user -password $password] set conninfo [pg_dbinfo status $conn] puts $conninfo return $conn } proc getDBs { conn query } { # datnames is the list to be result set res [pg_exec $conn "$query"] set ntups [pg_result $res -numTuples] for {set i 0} {$i < $ntups} {incr i} { lappend datnames [pg_result $res -getTuple $i] } pg_result $res -clear pg_disconnect $conn return $datnames } puts "host 입력" gets stdin host puts "port 입력" gets stdin port puts "db명 입력" gets stdin db puts "user명 입력" gets stdin user puts "password 입력" gets stdin password set conn [connectDB $host $port $db $user $password] puts "query 입력" gets stdin query puts [getDBs $conn $query]
JavaScript
복사
tdbc
vi tdbc.tcl
JavaScript
복사
tdbc.tcl
package require tdbc::postgres puts "host 입력" gets stdin host puts "port 입력" gets stdin port puts "db명 입력" gets stdin db puts "user명 입력" gets stdin user puts "password 입력" gets stdin password tdbc::postgres::connection create db -host $host -port $port -user $user -password $password -db $db puts "query 입력" gets stdin query db foreach rec $query { puts $rec } db close
JavaScript
복사
테스트 진행 및 결과
tcl binary 디렉토리를 환경변수 PATH 또는 alias에 등록하시면 편합니다.
저는 alias를 사용하는 방식으로 진행하겠습니다.
vi ~/.bash_profile
JavaScript
복사
제일 하단에, 아래의 내용 추가 후 저장
alias tclsh='/opensql/interface/tcl/tcl-8.6.12/bin/tclsh8.6'
JavaScript
복사

주의사항

tdbc의 경우, 쿼리 입력시에 ;(세미콜론)을 입력하게 되면, 오류가 발생합니다.
따라서, 쿼리 입력시에 ;을 넣지 않거나 후처리 하는 방법으로 사용하시면 됩니다.
tclsh pgtcl.tcl tclsh tdbc.tcl
Plain Text
복사

결과

pgtcl.tcl
host 입력 127.0.0.1 port 입력 5432 db명 입력 postgres user명 입력 postgres password 입력 1234 connection_ok query 입력 select * from one limit 5 {1 Kiah Beales kbeales0@nifty.com Female 140.139.182.23 {{"name":"추다진","age":"1","Product":{"pens":1495,"notes":2328}}} 69b40fb60ccb4ad4f781e48130cf6734} {2 Daryle Armall darmall1@umich.edu Male 131.227.113.151 {{"name":"백효리","age":"2","Product":{"pens":1697,"notes":2404}}} 69ae4a5ea38f1f4b4f768390f49a829b} {3 Gare Vacher gvacher2@angelfire.com Male 130.229.128.29 {{"name":"신채예","age":"3","Product":{"pens":2771,"notes":123}}} 13c31690dbaa4ff3bab5ab202a714a50} {4 Elissa Ianilli eianilli3@macromedia.com Female 167.226.206.250 {{"name":"지하소","age":"4","Product":{"pens":1415,"notes":2504}}} 703b975fc6e3d952ff49bda3e75d0492} {5 Danit Romi dromi4@dagondesign.com Female 148.169.97.249 {{"name":"나조승","age":"5","Product":{"pens":1932,"notes":683}}} d650638f5f8ef81903f28cff1049a4ef}
Plain Text
복사
tdbc.tcl
host 입력 127.0.0.1 port 입력 5432 db명 입력 postgres user명 입력 postgres password 입력 1234 query 입력 select * from one limit 5 id 1 first_name Kiah last_name Beales email kbeales0@nifty.com gender Female ip_address 140.139.182.23 info {{"name":"추다진","age":"1","Product":{"pens":1495,"notes":2328}}} en_first_name 69b40fb60ccb4ad4f781e48130cf6734 id 2 first_name Daryle last_name Armall email darmall1@umich.edu gender Male ip_address 131.227.113.151 info {{"name":"백효리","age":"2","Product":{"pens":1697,"notes":2404}}} en_first_name 69ae4a5ea38f1f4b4f768390f49a829b id 3 first_name Gare last_name Vacher email gvacher2@angelfire.com gender Male ip_address 130.229.128.29 info {{"name":"신채예","age":"3","Product":{"pens":2771,"notes":123}}} en_first_name 13c31690dbaa4ff3bab5ab202a714a50 id 4 first_name Elissa last_name Ianilli email eianilli3@macromedia.com gender Female ip_address 167.226.206.250 info {{"name":"지하소","age":"4","Product":{"pens":1415,"notes":2504}}} en_first_name 703b975fc6e3d952ff49bda3e75d0492 id 5 first_name Danit last_name Romi email dromi4@dagondesign.com gender Female ip_address 148.169.97.249 info {{"name":"나조승","age":"5","Product":{"pens":1932,"notes":683}}} en_first_name d650638f5f8ef81903f28cff1049a4ef
Plain Text
복사

참고 API

TDBC
pgtcl
지금까지 PostgreSQL의 (Interface) TCL에 관해 알아보았습니다
PostgreSQL의 PL/Python3U’을 바로 이어서 확인해보세요!

자유롭게 댓글을 남겨주세요