Innovating today, leading tomorrow

OpenSQL_Technical Guide
[OpenSQL] (Interface) TCL

[OpenSQL] (Interface) TCL

TCL개요

TCL란?

Tcl 언어를 사용하여 함수 및 트리거 절차를 생성할 수 있게 해주는 postgres 데이터 베이스 시스템 용 로드 가능한 절차적 언어.

  • Pg 공식 홈페이지-

PL/Tcl은 일부 제한 사항을 제외하고 C 언어에서 함수 작성기가 제공하는 대부분의 기능을 제공 합니다.

좋은 제한은 모든 것이 안전한 Tcl 인터프리터에서 실행된다는 것입니다.
안전한 Tcl의 제한된 명령 세트 외에도 SPI를 통해 데이터베이스에 액세스하고 elog()를 통해 메시지를 생성하는 데 몇 가지 명령만 사용할 수 있습니다.
C와 같이 Postgres 사용자 ID 의 권한으로 데이터베이스 백엔드 내부에 액세스하거나 OS 수준 액세스를 얻을 수 있는 방법이 없습니다 .
따라서 권한이 없는 데이터베이스 사용자는 이 언어를 사용하도록 허용될 수 있습니다.
또 다른 내부 제한 사항은 Tcl 프로시저를 사용하여 새로운 데이터 유형에 대한 입력/출력 기능을 생성할 수 없다는 것입니다.

설치 절차의 구성 단계에서 Tcl/Tk 지원이 지정된 경우 PL/Tcl 호출 처리기에 대한 공유 객체가 자동으로 구축되어 Postgres 라이브러리 디렉터리에 설치됩니다.

테스트 환경

Linux

OSCentOS 7.6
PostgreSQL VersionPostgreSQL 14.2
TCL VersionTCL 8.6.12
Driver Versionpgtcl 2.8.0

지원 범위

License
Free BSD-3

Supported Version
PostgreSQL 9.2 or later

테스트 환경 구축

Linux

#디렉토리 생성 및 압축해제

mkdir -p /hypersql/interface/src
tar xvzf tcl8.6.12-src.tar.gz -C /hypersql/interface/src

#컴파일

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

#디렉토리 생성 및 압축해제
tar xvzf Pgtcl-2.8.0.tar.gz -C /hypersql/interface/src
cd /hypersql/interface/src

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

테스트 프로젝트 생성

pgtcl

vi pgtcl.tcl

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]

tdbc

vi tdbc.tcl

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

테스트 진행 및 결과

tcl binary 디렉토리를 환경변수 PATH 또는 alias에 등록하시면 편합니다.
저는 alias를 사용하는 방식으로 진행하겠습니다.

vi ~/.bash_profile

제일 하단에, 아래의 내용 추가 후 저장

alias tclsh=’/opensql/interface/tcl/tcl-8.6.12/bin/tclsh8.6′

주의사항


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

tclsh pgtcl.tcl
tclsh tdbc.tcl

결과

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}

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

참고 API

TDBC

https://www.tcl-lang.org/man/tcl/TdbcpostgresCmd/contents.htm

pgtcl

https://github.com/flightaware/Pgtcl

https://flightaware.github.io/Pgtcl/html/index.html#AEN3

지금까지 PostgreSQL의 (Interface) TCL에 관해 알아보았습니다

PostgreSQL의 PL/Python3U’을 바로 이어서 확인해보세요!

광고성 정보 수신

개인정보 수집, 활용 목적 및 기간

(주)티맥스티베로의 개인정보 수집 및 이용 목적은 다음과 같습니다.
내용을 자세히 읽어보신 후 동의 여부를 결정해 주시기 바랍니다.

  • 수집 목적: 티맥스티베로 뉴스레터 발송 및 고객 관리
  • 수집 항목: 성함, 회사명, 회사 이메일, 연락처, 부서명, 직급, 산업, 담당업무, 관계사 여부, 방문 경로
  • 보유 및 이용 기간: 동의 철회 시까지

※ 위 개인정보 수집 및 이용에 대한 동의를 거부할 권리가 있습니다.
※ 필수 수집 항목에 대한 동의를 거부하는 경우 뉴스레터 구독이 제한될 수 있습니다.

개인정보의 처리 위탁 정보
  • 업체명: 스티비 주식회사
  • 위탁 업무 목적 및 범위: 광고가 포함된 뉴스레터 발송 및 수신자 관리
 

개인정보 수집 및 이용

개인정보 수집, 활용 목적 및 기간

(주)티맥스티베로의 개인정보 수집 및 이용 목적은 다음과 같습니다. 내용을 자세히 읽어보신 후 동의 여부를 결정해 주시기 바랍니다.

  • 수집 목적: 티맥스티베로 뉴스레터 발송 및 고객 관리
  • 수집 항목: 성함, 회사명, 회사 이메일, 연락처, 부서명, 직급, 산업, 담당업무, 관계사 여부, 방문 경로
  • 보유 및 이용 기간: 동의 철회 시까지

※ 위 개인정보 수집 및 이용에 대한 동의를 거부할 권리가 있습니다.
※ 필수 수집 항목에 대한 동의를 거부하는 경우 뉴스레터 구독이 제한될 수 있습니다.

개인정보의 처리 위탁 정보

  • 업체명: 스티비 주식회사
  • 위탁 업무 목적 및 범위: 광고가 포함된 뉴스레터 발송 및 수신자 관리
  •