CREATE TRANSFORM — 새 transform 정의
CREATE [ OR REPLACE ] TRANSFORM FOR자료형이름
LANGUAGE언어이름
( FROM SQL WITH FUNCTIONfrom_sql_function_name
[ (argument_type
[, ...]) ], TO SQL WITH FUNCTIONto_sql_function_name
[ (argument_type
[, ...]) ] );
CREATE TRANSFORM
명령은 새 transform을 만든다.
CREATE OR REPLACE TRANSFORM
명령은 새 transform을
만들거나, 해당 transform이 있다면 그 정의를 바꾼다.
transform은 데이터베이스 자료형과 프로시져 언어 사이 연결하는 일을 한다.
예를 들어, hstore
자료형을 PL/Python에서 사용할 때,
그 자료형을 Python 환경에서 어떤 자료형으로 써야 할 것인지를
정의할 수 없다. 기본적으로는 문자열로 일단 넘겨서 다시, 적당한
자료형 변환을 해서 사용했다. 이런 비효율성을 개선하기 위해
transform을 만든다. 예를 들어, 키 이름이 있는 배열, 리스트 자료형
처리를 보다 쉽게 할 수 있게 된다.
하나의 transform에는 두 개의 내부 함수를 지정한다:
SQL 환경에서 해당 언어 환경으로 자료형이 전달 될 때 사용할 “from SQL” 함수. 이 함수는 그 언어로 작성된 함수의 입력 인자 자료형을 처리할 때 사용된다.
해당 언어 환경에서 SQL 환경으로 자료형이 전달 될 때 사용할 “to SQL” 함수. 이 함수는 그 언어로 작성된 함수의 반환 자료형을 처리할 때 사용된다.
반드시 이 두 함수 모두를 지정할 필요는 없다. 어느 한 쪽을 지정하지 않으면, 언어 별 기본 작동 방식에 따라 의미로 형변환을 할 수도 있다. (한 방향으로만 전환하는 transform을 만들 때는, 역방향에서 사용할 함수가 항상 오류가 나도록 만들어 등록하면 된다.)
transform을 만드려면, 해당 자료형과 해당 언어에 대한
소유주 이거나, USAGE
권한이 있어야 한다.
또한 지정하는 from-SQL, to-SQL 함수에 대해서,
EXECUTE
권한도 있어야 한다.
자료형이름
해당 transform에서 처리하는 자료형 이름.
lang_name
해당 transform에서 처리하는 언어 이름.
from_sql_function_name
[(argument_type
[, ...])]
SQL에서 해당 언어로 만들어지는 함수 쪽으로 넘길 대 사용하는 전환
함수. 이 함수의 입력 인자는 internal
,
반환 자료형도 internal
로 구성한다.
실재 인자 값을 해당 자료형으로 쓸 수 있도록 이 함수 내부에서
코딩해야 한다.
(SQL 레벨에서는 입력도 출력도 모두 하나의 internal
형으로 정의해야 한다.)
이 함수의 실 반환 자료형은 그 언어에서 쓸 실재 자료형이 된다.
인자 목록을 지정하지 않고, 함수 이름만 지정한다면,
그 함수는 해당 스키마 안에 하나만 있어야 한다.
to_sql_function_name
[(argument_type
[, ...])]
해당 언어로 만들어지는 함수 내부에서 사용한 해당 자료형을 SQL
쪽으로 반환할 때 사용할 함수. 이 함수의 반환 자료형은
internal
이어야 하며, 그 값은 SQL에서 사용할
해당 자료형이어야 한다. 실재 인자 값은 해당 언어에
처리하는 특정한 것이여야 한다. 이 함수의 인자를 지정하지 않고,
이름을 지정한다면, 그 함수는 해당 스키마 안에 하나만 있어야 한다.
transform을 삭제할 때는 DROP TRANSFORM 명령을 사용한다.
hstore
자료형과 plpythonu
언어 사이 transform을 만드려면, 먼저 각각 등록한다:
CREATE TYPE hstore ...; CREATE EXTENSION plpythonu;
다음 전환 함수를 등록한다:
CREATE FUNCTION hstore_to_plpython(val internal) RETURNS internal LANGUAGE C STRICT IMMUTABLE AS ...; CREATE FUNCTION plpython_to_hstore(val internal) RETURNS hstore LANGUAGE C STRICT IMMUTABLE AS ...;
마지막으로 이들을 이용해서 transform을 만든다.
CREATE TRANSFORM FOR hstore LANGUAGE plpythonu ( FROM SQL WITH FUNCTION hstore_to_plpython(internal), TO SQL WITH FUNCTION plpython_to_hstore(internal) );
이 일련의 작업들은 확장 모듈안에 포함되어 있어, 해당 확장 모듈을 설치하면 된다.
contrib
안에 미리 제공하는 몇 transform
확장 모듈이 있다. 그것으로 예제를 살펴 볼 수 있다.
CREATE TRANSFORM
명령은
PostgreSQL 확장 기능이다. CREATE
TRANSFORM
명령이 SQL 표준에 있지만,
클라이언트 언어를 위한 자료형 연결 용도로,
PostgreSQL에서는 지원하지 않는다.