CREATE [OR REPLACE] FUNCTION
사용자 정의 함수를 만들려면 함수 만들기 명령을 사용합니다. 함수 만들기 또는 바꾸기는 함수를 만들거나 같은 이름의 기존 함수를 새 객체 파일, 반환 값, 함수 동작 또는 로깅 수준으로 바꿉니다.
요약
CREATE [OR REPLACE] FUNCTION function_name(argument_types)
RETURNS return_type LANGUAGE CPP PARAMETER STYLE NPSGENERIC
[FENCED | NOT FENCED] [DETERMINISTIC | NOT DETERMINISTIC]
[RETURNS NULL ON NULL INPUT | CALLED ON NULL INPUT]
[MAXIMUM MEMORY mem] [LOGMASK <MASK>]
[NO DEPENDENCIES| DEPENDENCIES deplibs]
[API VERSION [ 1 | 2 ]]
[ENVIRONMENT 'name' = 'value', 'name2' = 'value2']
[TABLE, TABLE FINAL ALLOWED | TABLE ALLOWED | TABLE FINAL ALLOWED]
[PARALLEL ALLOWED | PARALLEL NOT ALLOWED]
[EXTERNAL CLASS NAME 'class_name']
[EXTERNAL HOST OBJECT 'host_object_filename']
[EXTERNAL SPU OBJECT 'SPU_object_filename']
입력
입력 | 설명 |
---|---|
function_name | 만들려는 함수의 이름을 지정합니다. SQL 식에서 함수를 호출하는 데 사용되는 SQL 식별자입니다. 이름은 IBM Netezza 데이터베이스 사용자 가이드에 설명된 키워드 및 식별자에 대한 이름 지정 기준을 충족해야 합니다. 함수가 존재하는 경우 생성 또는 바꾸기 명령을 사용하여 이름을 변경할 수 없습니다. 여러 스키마를 지원하는 시스템의 경우 schema.function 형식으로 이름을 지정하여 현재 데이터베이스의 다른 스키마에 함수를 만들 수 있습니다. 다른 데이터베이스에서는 함수를 만들 수 없습니다. |
인수 유형 | 완전히 지정된 함수 인수 데이터 타입의 목록을 지정합니다. 모든 Netezza Performance Server 데이터 유형이 지원됩니다. 문자열에는 사이즈 또는 일반 사이즈의 경우 ANY가 포함되어야 합니다. 숫자 유형은 정밀도와 눈금을 포함해야 하며, 일반 크기는 아무거나 포함해야 합니다. 사용자가 지원되는 데이터 유형에 대해 최대 64개의 값을 입력할 수 있는 가변 인수 집계를 생성하기 위해 VARARGS 값을 지정할 수도 있습니다. VARARGS는 함께 사용할 수 없으므로 목록의 다른 인수는 지정할 수 없습니다. 인수 목록 또는 크기는 변경할 수 없습니다. 인수 목록에서 VARARGS를 제거하거나 추가할 수 있으며, 그렇지 않으면 이 인수 목록은 비어 있습니다. 이 명령을 사용하여 인수 목록을 변경할 수 없습니다. 함수가 존재하는 경우 CREATE 또는 REPLACE 명령을 사용하여 인수 유형 목록을 변경할 수 없습니다. 예를 들어 문자열의 크기나 숫자 값의 정밀도 및 배율을 변경할 수 있는 등 CREATE 또는 REPLACE를 사용하여 UDF 인수 유형의 일부 측면을 변경할 수도 있습니다. |
반환 반환 유형 | 반환 유형 값은 완전히 지정된 하나의 인수와 유형입니다. Argument_types와 동일한 규칙을 따릅니다. API 버전이 2인 경우 반환 유형은 TABLE(name type, name2 type2, ...)이 될 수도 있습니다 또는 TABLE(ANY)를 사용하여 테이블 함수를 지정할 수 있습니다. |
언어 | 함수에 사용되는 프로그래밍 언어를 지정합니다. 현재 기본값이자 유일하게 지원되는 값은 CPP(C++)입니다. |
매개변수 유형 | 현재 기본값이자 유일하게 지원되는 값은 NPSGENERIC입니다. |
분리 분리되지 않음 |
함수를 보호된 주소 공간(펜스 모드)에서 별도의 프로세스로 실행할지 여부를 지정합니다. 펜스 해제 함수를 만들려면 펜스 해제 관리자 권한이 있어야 합니다. |
[결정론적 | 비결정론적] | 결정론적은 UDF가 동일한 인수 값이 주어지면 항상 같은 값을 반환하고 부작용이 없는 순수 함수임을 나타냅니다. 시스템은 동일한 인수 목록을 가진 결정론적 UDF의 여러 인스턴스를 공통 하위 표현식 제거(CSE)의 후보로 간주할 수 있습니다. 기본값은 결정적입니다. 함수가 결정론적인 경우 다음 중 하나라도 참이면 행당 한 번이 아니라 문 준비 시간에 한 번 호출됩니다:
인수가 SQL 리터럴이거나 행당 한 번이 아니라 문 준비 시 한 번 평가되는 UDF 또는 내장된 결과인 경우 상수입니다. |
[널 입력 시 널 반환 | 널 입력 시 호출] | RETURNS NULL INPUT ON NULL은 인수가 NULL일 때마다 함수가 항상 NULL을 반환함을 나타냅니다. 이 매개변수를 지정하면 NULL 인수가 있는 경우 함수가 실행되지 않고 자동으로 NULL 결과를 가정합니다. 기본값인 NULL 입력 시 호출됨은 일부 인수가 NULL일 때 함수가 정상적으로 호출됨을 나타냅니다. 그런 다음 필요한 경우 NULL 값을 확인하고 적절하게 대응하는 것은 함수 작성자의 책임입니다. 이 설정의 쿼리 최적화 효과에 대한 자세한 내용은 Netezza Performance Server 쿼리 최적화 및 UDX 호출을 참조하세요. |
최대 메모리 | 함수의 잠재적 메모리 사용량 표시를 지정합니다. 크기 값은 빈 값 또는 숫자와 문자 b(바이트), k(킬로바이트), m(메가바이트), g(기가바이트)의 형태로 된 값일 수 있습니다. 예를 들어, 유효한 값은 '0',1k',100k',1g' 또는10m'일 수 있습니다. 기본값은 0입니다. |
로그마스크 마스크 | 함수에 대한 로깅 제어 수준을 지정합니다. 유효한 값은 NONE, DEBUG, TRACE 또는 쉼표로 구분된 DEBUG와 TRACE의 조합입니다. |
종속성 라이브러리 | UDX에 대한 사용자 정의 공유 라이브러리 종속성의 선택적 목록을 지정합니다. 라이브러리 이름을 하나 또는 쉼표로 구분된 목록으로 지정할 수 있습니다. |
API 버전 [1 | 2] | 집계에서 사용하는 UDX 인터페이스의 버전을 지정합니다. API 버전은 호스트 및 SPU용 오브젝트 파일의 컴파일된 버전과 일치해야 합니다. 기본값은 1입니다. 버전 2 컴파일된 객체를 포함하는 경우 API 버전 2를 지정해야 합니다. |
환경 | 함수를 실행할 때 사용할 수 있는 이름-값 쌍을 지정합니다. 쉼표로 구분된 여러 개의 이름-값 쌍을 지정할 수 있습니다. 하나 이상의 환경 쌍의 기존 세트를 변경하려면 모든 환경 설정을 지정해야 합니다. ALTER 명령은 현재 목록을 ALTER 명령에서 지정된 목록으로 대체합니다. |
테이블, 테이블 최종 허용 테이블 허용 테이블 최종 허용 |
사용자 정의 테이블 함수를 호출하는 방법을 제어하는 옵션을 지정합니다.
FINAL은 입력 행이 모두 처리된 후에 테이블 함수가 호출되어 더 많은 행을 출력할 수 있음을 의미합니다. |
병렬 허용 | 옵티마이저의 재량에 따라 사용자 정의 테이블 함수를 호스트 또는 SPU에서 호출할 수 있도록 지정합니다. |
병렬 허용되지 않음 | 옵티마이저의 재량에 따라 테이블 함수가 항상 호스트 또는 선택된 하나의 SPU에서 호출되도록 지정합니다. |
외부 클래스 이름'class_name' | 함수를 구현하는 C++ 클래스의 이름을 지정합니다. 클래스는 Udf 베이스 클래스에서 파생되어야 하며 클래스의 인스턴스를 인스턴스화하는 정적 메서드를 구현해야 합니다. |
외부 호스트 오브젝트'호스트_객체_파일명' | 호스트 실행을 위해 컴파일된 객체의 경로 이름을 지정합니다. |
외부 SPU 객체'SPU_object_파일명' | Linux® SPU의 컴파일된 객체 파일의 경로 이름을 지정합니다. IBM® Netezza® 100 및 Netezza 100 모델에서 Rev10 SPU용 spu10 컴파일된 객체를 지정합니다. |
출력
출력 | 설명 |
---|---|
CREATE FUNCTION | 명령에 성공하면 시스템에서 리턴되는 메시지입니다. |
ERROR: User 'username' is not allowed to create/drop functions. | 사용자 계정에 함수 만들기 권한이 없는 경우 시스템에서 이 메시지를 반환합니다. |
ERROR: Synonym 'name' already exists | 함수에 지정한 이름과 동의어가 있는 경우 시스템이 이 메시지를 반환합니다. |
ERROR: function name already exists with the same signature | 이 오류는 데이터베이스에 동일한 이름과 인수 유형 목록을 가진 함수가 존재하고 CREATE FUNCTION 명령을 실행할 때 반환됩니다. 대신 함수 만들기 또는 바꾸기를 사용합니다. |
ERROR: function name already exists with the same signature | 함수에 지정한 이름을 가진 함수가 있는 경우 시스템에서 이 메시지를 반환합니다. |
NOTICE: FunctionCreate: existing UDX name(argument_types) differs in size of string/numeric arguments | 이 메시지는 이름이 있지만 문자열 또는 숫자 인수에 지정된 크기가 다른 UDX가 존재함을 나타냅니다. 함수 서명을 변경하지 않으려는 경우 서명을 확인하고 올바른지 확인하세요. |
ERROR: lookupLibrary: library libname does not exist | 종속성으로 지정된 사용자 정의 공유 라이브러리를 찾을 수 없는 경우 시스템에서 반환하는 메시지입니다. |
ERROR: ProcedureCreate: Can't use version 2 features without specifying API VERSION 2 for udx_name | 이 메시지는 SQL 명령에 버전 2 옵션을 지정했지만 SQL 명령에 API 버전 2도 지정하지 않았다는 것을 나타냅니다. |
ERROR: Version mismatch for function udx_name. Specified version 2, but provided version 1 object file | 컴파일된 객체 파일은 API 버전 1 지원을 사용하지만 SQL 명령은 버전 2 기능을 사용합니다. 버전 2 컴파일된 객체를 만들거나 명령에서 버전 2 기능을 지정하는 옵션을 제거해야 합니다. |
ERROR: Version mismatch for function udx_name. Specified version 1, but provided version 2 object file | 컴파일된 객체 파일은 API 버전 2 지원을 사용하지만 SQL 명령은 버전 1 기능을 사용합니다. 버전 1 컴파일된 객체를 지정하거나 ALTER 명령을 변경하여 버전 2 구문을 지정해야 합니다. |
ERROR: Environment names can't be empty | 환경 설정의 이름 값은 빈 문자열일 수 없습니다. |
ERROR: type 'type' is not yet defined | 지정한 반환 유형이 알려진 Netezza Performance Server 데이터 유형이 아닙니다. |
설명
함수를 만들 때 함수 서명(즉, 이름과 인수 유형 목록)은 해당 데이터베이스 내에서 고유해야 합니다. 다른 사용자 정의 함수나 집계는 동일한 데이터베이스에서 동일한 이름과 인수 유형 목록을 가질 수 없습니다.
함수 이름이나 인수 유형 목록은 CREATE 또는 REPLACE 명령을 사용하여 변경할 수 없습니다. 인수 유형의 몇 가지 측면은 변경할 수 있습니다. 예를 들어, 문자열의 크기나 숫자 값의 정밀도 및 스케일을 변경합니다. 함수 이름, 인수 유형 목록 또는 둘 다를 변경하려면 함수를 삭제한 다음 새 이름, 인수 유형 목록 또는 둘 다를 사용하여 함수를 만들어야 합니다.
활성 쿼리에서 사용 중인 사용자 정의 함수는 바꿀 수 없습니다. 활성 쿼리 트랜잭션이 완료되면 Netezza Performance Server 시스템이 함수 만들기 또는 바꾸기 명령을 처리하여 함수를 업데이트합니다.
권한 필요
데이터베이스 관리자 사용자이거나 현재 데이터베이스를 소유하고 있거나 여러 스키마를 지원하는 시스템에서 현재 스키마를 소유하고 있어야 합니다. 다른 사용자가 함수 만들기 명령을 사용하려면 함수 만들기 권한이 있어야 합니다. 또한 함수 만들기 또는 바꾸기를 사용하여 UDF를 변경하는 경우 UDF를 변경하려면 함수 만들기 및 변경 권한이 있어야 합니다. 펜스 해제 함수를 만들려면 펜스 해제 관리자 권한이 있어야 합니다.
일반 태스크
새 사용자 정의 함수를 만들고 해당 함수의 소유자가 되려면 CREATE FUNCTION 명령을 사용합니다. 함수 C++ 파일을 생성하고 ' nzudxcompile '을 사용하여 컴파일해야 이 명령을 사용하여 Netezza Performance Server 시스템에 함수를 등록할 수 있습니다. 함수는 현재 데이터베이스의 객체로 정의됩니다.
사용량
- 샘플 함수 ' CustomerName '( 사용자 정의 함수 만들기에 설명되어 있음)을 만들려면 다음과 같이 하세요:
MYDB.SCHEMA(MYUSER)=> CREATE FUNCTION CustomerName(varchar(64000)) RETURNS int4 LANGUAGE CPP PARAMETER STYLE npsgeneric EXTERNAL CLASS NAME 'CCustomerName' EXTERNAL HOST OBJECT '/home/nz/udx_files/customername.o_x86' EXTERNAL SPU OBJECT '/home/nz/udx_files/customername.o_spu10'