CREATE FUNCTION(집계 인터페이스) 명령문

CREATE FUNCTION(집계 인터페이스) 명령문은 현재 서버에서 사용자 정의 집계 함수를 등록하는 데 사용됩니다.

집계 함수는 행 세트의 컬럼에서와 같이 유사 값 세트의 평가 결과인 단일 값을 리턴합니다.

호출

이 명령문은 애플리케이션 프로그램에 임베디드하거나 동적 SQL문에서 실행할 수 있습니다. DYNAMICRULES 실행 동작이 패키지에 영향을 주는 경우에만 동적으로 준비될 수 있는 실행문입니다(SQLSTATE 42509).

권한 부여

명령문의 권한 부여 ID에서 보유하는 특권에는 다음 권한 중 최소한 하나가 포함되어야 합니다.
  • 함수의 스키마 이름이 기존 스키마를 참조하지 않는 경우, 데이터베이스에 대한 IMPLICIT_SCHEMA 권한
  • 함수의 스키마 이름이 기존 스키마를 참조하는 경우 스키마에 대한 CREATEIN 특권
  • DBADM 권한
명령문의 권한 부여 ID가 보유하는 특권은 또한 명령문의 권한 부여 ID에 DATAACCESS 권한이 없는 경우 다음 루틴에 대한 EXECUTE 특권도 포함해야 합니다.
  • INITIATE
  • ACCUMULATE
  • MERGE
  • FINALIZE

그룹 특권(PUBLIC 제외)은 CREATE FUNCTION문에 지정된 종속 오브젝트에서 고려하지 않습니다.

기존 함수를 대체하려면, 명령문의 권한 부여 ID가 기존 함수의 소유자여야 합니다(SQLSTATE 42501).

SECURED 옵션이 지정된 경우, 명령문의 권한 부여 ID는 SECADM 또는 CREATE_SECURE_OBJECT 권한을 포함해야 합니다(SQLSTATE 42501).

구문

Read syntax diagramSkip visual syntax diagram CREATE OR REPLACE FUNCTION function-name ( ,parameter-declaration ) RETURNS data-type2data-type3CAST FROMdata-type4 option-list AGGREGATE WITH (,state-variable-declaration) USING IN MODULEmodule-name INITIALIZE procedure-designator ACCUMULATE procedure-designator MERGE procedure-designator FINALIZE function-designator
parameter-declaration
Read syntax diagramSkip visual syntax diagramINparameter-name data-type1 default-clause
data-type1, data-type2, data-type3, data-type4, data-type5
Read syntax diagramSkip visual syntax diagram built-in-type
built-in-type
Read syntax diagramSkip visual syntax diagramSMALLINTINTEGERINTBIGINTDECIMALDECNUMERICNUM(5,0)( integer,0, integer)FLOAT(53)( integer)REALDOUBLEPRECISIONDECFLOAT(34)(16)CHARACTERCHAR(1)( integerOCTETSCODEUNITS32)VARCHARCHARACTERCHARVARYING( integerOCTETSCODEUNITS32)FOR BIT DATA1CLOBCHARACTERCHARLARGE OBJECT(1M)( integerKMGOCTETSCODEUNITS32)GRAPHIC(1)( integerCODEUNITS16CODEUNITS32)VARGRAPHIC( integerCODEUNITS16CODEUNITS32)DBCLOB(1M)( integerKMGCODEUNITS16CODEUNITS32)NCHARNATIONALCHARCHARACTER(1)( integer)NVARCHARNCHAR VARYINGNATIONALCHARCHARACTERVARYING( integer)NCLOBNCHAR LARGE OBJECTNATIONAL CHARACTER LARGE OBJECT(1M)( integerKMG)BINARY(1)( integer)VARBINARYBINARY VARYING(integer)BLOBBINARY LARGE OBJECT(1M)( integerKMG)DATETIMETIMESTAMP(6)(integer)XMLSYSPROC.DB2SECURITYLABEL23
default-clause
Read syntax diagramSkip visual syntax diagram DEFAULT NULLconstantspecial-registerglobal-variable(expression)
option-list
Read syntax diagramSkip visual syntax diagram SPECIFICspecific-name NOT DETERMINISTICDETERMINISTIC CALLED ON NULL INPUT EXTERNAL ACTIONNO EXTERNAL ACTION NO SCRATCHPAD NO FINAL CALL ALLOW PARALLEL NOT SECUREDSECURED
state-variable-declaration
Read syntax diagramSkip visual syntax diagram state-variable-name data-type5
procedure-designator
Read syntax diagramSkip visual syntax diagram PROCEDUREprocedure-name(,data-type)SPECIFIC PROCEDUREspecific-name
function-designator
Read syntax diagramSkip visual syntax diagram FUNCTIONfunction-name(,data-type)SPECIFIC FUNCTIONspecific-name
Notes:
  • 1 The FOR BIT DATA clause can be specified in any order with the other column constraints that follow. The FOR BIT DATA clause cannot be specified with string units CODEUNITS32 (SQLSTATE 42613).
  • 2 DB2SECURITYLABEL is the built-in distinct type that must be used to define the row security label column of a protected table.
  • 3 For a column of type DB2SECURITYLABEL, NOT NULL WITH DEFAULT is implicit and cannot be explicitly specified (SQLSTATE 42842). The default value for a column of type DB2SECURITYLABEL is the session authorization ID's security label for write access.

설명

OR REPLACE
현재 서버에 존재할 경우 함수에 대한 정의를 대체할 것을 지정합니다. 기존 정의는 새 정의가 카탈로그에서 대체되기 전에 효과적으로 삭제되며, 예외로 함수에 대해 부여된 특권에는 적용되지 않습니다. 이 옵션은 오브젝트의 소유자만 지정할 수 있습니다. 이 옵션은 함수에 대한 정의가 현재 서버에 존재하지 않는 경우에 무시됩니다. 다음 조건이 적용되면 기존 기능은 대체될 수 있습니다.
  • 새 정의의 특정 이름 및 함수 이름은 이전 정의의 특정 이름 및 함수 이름과 동일해야 합니다.
  • 새 정의의 시그니처는 이전 정의의 시그니처와 일치해야 합니다.
그렇지 않으면 새 함수가 작성됩니다.

함수가 행 권한 또는 컬럼 마스크의 정의에서 참조되는 경우, 함수는 대체할 수 없습니다(SQLSTATE 42893).

함수명
정의되는 함수의 이름을 지정합니다. 이는 함수를 지정하는 규정되거나 규정되지 않은 이름입니다. function-name의 규정되지 않은 양식은 SQL ID입니다. 동적 SQL문에서 CURRENT SCHEMA 특수 레지스터는 규정되지 않은 오브젝트 이름의 규정자로서 사용됩니다. 정적 SQL문의 경우, QUALIFIER 프리컴파일 또는 바인드 옵션은 내재적으로 규정되지 않은 오브젝트 이름의 규정자를 지정합니다. 규정된 양식은 마침표와 SQL ID가 뒤따르는 schema-name입니다. 규정된 이름은 첫 번째 매개변수가 구조화된 유형인 경우 첫 번째 매개변수의 데이터 유형과 동일하면 안됩니다.

함수 시그니처는 카탈로그에서 설명된 함수 또는 메소드를 식별할 수 없습니다(SQLSTATE 42723). 이름이 평가될 때 매개변수의 수 및 각 매개변수의 데이터 유형(데이터 유형의 길이, 정밀도 또는 스케일 속성을 고려하지 않음)이 고려됩니다. 매개변수의 수 및 데이터 유형과 함께 규정되지 않은 이름이 해당 스키마 내에서 고유해야 합니다. 그러나 이름은 스키마 전체에서 고유할 필요가 없습니다.

두 파트로 구성된 이름이 지정된 경우 schema-nameSYS로 시작할 수 없습니다(SQLSTATE 42939).

술어에서 키워드로 사용되는 이름 수가 시스템 사용을 위해 예약되고 function-name으로 사용될 수 없습니다(SQLSTATE 42939). 이름은 SOME, ANY, ALL, NOT, AND, OR, BETWEEN, NULL, LIKE, EXISTS, IN, UNIQUE, OVERLAPS, SIMILAR, MATCH 및 비교 연산자입니다.

일반적으로, 함수 시그니처가 다른 경우 둘 이상의 함수에 동일한 이름을 사용할 수 있습니다.

금지되어 있지는 않지만 계획된 겹쳐쓰기가 아닌 경우 집계 인터페이스 함수에 내장 함수와 동일한 이름을 제공하지 마십시오. 해당 함수의 예는 MAX, MIN, AVG입니다. 일관성 있는 인수와 동일한 이름을 가지지만 동작은 다른 사용자 정의 함수를 내장 스칼라 또는 집계 함수로 작성하는 경우 문제가 발생할 수 있습니다. 이에 대한 예는 다음과 같습니다.
  • 동적 SQL문의 문제점
  • 리바인드될 때 정적 SQL 애플리케이션이 실패할 수 있음
  • 애플리케이션은 성공적으로 실행되었다고 표시되지만 다른 결과를 제공할 수 있음
(parameter-declaration, ...)
함수의 입력 매개변수 수를 식별하며 각 매개변수의 모드, 이름, 데이터 유형 및 선택적 기본값을 지정합니다. 함수가 수신할 것으로 예상되는 매개변수마다 목록에 있는 하나의 항목을 지정해야 합니다. 최대 90개의 매개변수를 지정할 수 있습니다(SQLSTATE 54023).
매개변수가 없는 함수를 등록할 수 있습니다. 사이에 데이터 유형 없이 괄호를 코딩해야 합니다. 예를 들면, 다음과 같습니다.
   CREATE FUNCTION WOOFER() ...
동일한 스키마에서 동일한 이름을 가진 두 함수는 모든 해당 매개변수에 대해 동일한 유형을 가질 수 없습니다. 길이, 정밀도 및 스케일은 이 유형 비교에서 고려되지 않습니다. 따라서 CHAR(8) 및 CHAR(35)은 DECIMAL(11,2), DECIMAL(4,3)과 같이 동일한 유형으로 간주됩니다. 매개변수에 지정되는 모호하게 유형 지정된 구별 유형은 구별 유형의 소스 유형과 동일한 데이터 유형으로 간주됩니다. 유니코드 데이터베이스의 경우 CHAR(13) 및 GRAPHIC(8)은 동일한 유형으로 간주됩니다. 이러한 목적으로 추가 번들 유형은 DECIMAL 및 NUMERIC과 같이 동일한 유형으로 취급합니다. 중복되는 서명은 오류를 리턴합니다(SQLSTATE 42723).
IN
매개변수를 함수에 대한 입력 매개변수로 식별합니다. 함수의 매개변수에 대해 변경한 사항은 제어가 리턴될 때 컨텍스트 호출에 사용할 수 없습니다.
parameter-name
매개변수에 대한 선택적 이름을 지정합니다. 이름은 매개변수 목록에서 기타 parameter-name과 동일할 수 없습니다(SQLSTATE 42734).
data-type1
매개변수의 데이터 유형을 지정합니다. 데이터 유형은 내장 데이터 유형이 될 수 있습니다. 각 내장 데이터 유형에 대한 전체 설명은 CREATE TABLE문을 참조하십시오. 데이터 유형은 XML, CLOB, DBCLOB 또는 BLOB이 아니어야 합니다 (SQLSTATE 42815). 데이터 유형은 구별 유형이 아니어야 합니다(SQLSTATE 42611).
기본값
매개변수의 기본값을 지정합니다. 기본값은 상수, 특수 레지스터, 전역 변수, 표현식 또는 키워드 NULL이 될 수 있습니다. 디폴트값으로 지정할 수 있는 특수 레지스터는 컬럼 디폴트값으로 지정할 수 있는 특수 레지스터와 동일합니다 ( CREATE TABLE문default-clause 참조). 기타 특수 레지스터는 표현식을 사용하여 기본값으로 지정될 수 있습니다.

표현식은 표현식에 설명된 유형의 표현식일 수 있습니다. 기본값이 지정되지 않으면, 매개변수에는 기본값이 없고 해당 인수는 프로시저의 호출에서 생략될 수 없습니다. 표현식의 최대 크기는 64KB입니다.

기본 표현식은 SQL 데이터를 수정하지 않아야 합니다(SQLSTATE 428FL 또는 SQLSTATE 429BL). 표현식은 매개변수 데이터 유형에 호환 가능한 지정이어야 합니다(SQLSTATE 42821).

RETURNS
이 필수 절은 함수의 출력을 식별합니다.
data-type2
출력의 데이터 유형을 지정합니다.

이러한 경우 함수 매개변수에 대해 data-type1에서 설명한 것과 동일한 고려사항이 적용됩니다.

데이터 유형은 구별 유형이 아니어야 합니다(SQLSTATE 42611).

data-type3 CAST FROM data-type4
출력의 데이터 유형을 지정합니다.

이 양식의 RETURNS절은 FINALIZE 함수의 함수 코드에서 리턴된 데이터 유형이 아닌 다른 데이터 유형을 명령문 호출로 리턴합니다. 예:

   CREATE FUNCTION GET_HIRE_DATE(CHAR(6))
     RETURNS DATE CAST FROM CHAR(10)
     ...

선행 코드에서 함수 코드는 데이터베이스 관리자로 CHAR(10) 값을 리턴합니다. 그런 다음 데이터베이스 관리자는 이를 날짜로 변환하고 해당 값을 호출 중인 명령문으로 전달합니다. data-type4data-type3 매개변수에 대해 캐스트 가능해야 합니다. 캐스트 가능하지 않은 경우 오류(SQLSTATE 42880)가 리턴됩니다.

data-type3의 길이, 정밀도 또는 스케일을 data-type4에서 유추할 수 있습니다. data-type3의 매개변수화된 유형에 길이, 정밀도 또는 스케일을 지정할 수 있지만 이는 필요하지 않습니다. 대신, 비어 있는 괄호를 사용할 수 있습니다. 예를 들어, VARCHAR()를 사용할 수 있습니다. FLOAT()는 사용할 수 없습니다(SQLSTATE 42601). 왜냐하면, 매개변수 값이 다른 데이터 유형(REAL 또는 DOUBLE)을 나타내기 때문입니다.

구별 유형은 data-type3 또는 data-type4에서 지정된 유형으로 유효하지 않습니다(SQLSTATE 42815).

캐스트 조작도 변환 오류가 발생할 수 있는 런타임 검사의 대상입니다.

내장 유형
내장 데이터 유형에 대한 설명은 CREATE TABLE문 을 참조하십시오.
option-list
SPECIFIC 특정 이름
정의 중인 함수의 인스턴스에 대해 고유한 이름을 제공합니다. 이 특정 이름은 이 함수에 대해 소싱하거나, 함수를 삭제하거나, 함수에 주석을 붙일 때 사용할 수 있습니다. 함수 호출에는 사용할 수 없습니다. specific-name의 규정되지 않은 양식은 SQL ID입니다. 규정된 양식은 마침표와 SQL ID가 뒤따르는 schema-name입니다. 명시적 또는 내재된 규정자를 포함하는 이름은 애플리케이션 서버에 존재하는 다른 함수 인스턴스 또는 메소드 스펙을 식별할 수 없습니다. 그렇지 않으면 오류(SQLSTATE 42710)가 리턴됩니다.

specific-name은 기존 function-name과 동일할 수 있습니다.

규정자를 지정하지 않은 경우, function-name에 사용된 규정자가 사용됩니다. 규정자가 지정되면 이는 function-name의 명시적 또는 내재적 규정자와 동일해야 하거나 오류(SQLSTATE 42882)가 리턴됩니다.

specific-name이 지정되지 않은 경우에는 고유한 이름이 데이터베이스 관리자에 의해 생성됩니다. 고유 이름은 SQL 다음에 문자 시간소인이 따라 나옵니다(SQLyymmddhhmmssxxx).

DETERMINISTIC 또는 NOT DETERMINISTIC
이 선택적 절은 함수가 항상 지정된 인수 값에 대해 동일한 결과를 리턴하는지(DETERMINISTIC) 또는 함수가 결과에 영향을 주는 일부 상태 값에 의존하는지(NOT DETERMINISTIC) 여부를 지정합니다. 즉, DETERMINISTIC 함수는 항상 입력이 같은 연속 호출에서 동일한 결과를 리턴합니다. 동일한 입력은 항상 동일한 결과를 생성한다는 사실을 이용하는 최적화는 NOT DETERMINISTIC을 지정하여 방지할 수 있습니다. NOT DETERMINISTIC 함수의 예는 난수 생성 프로그램입니다. DETERMINISTIC 함수의 예는 입력의 제곱근을 판별하는 함수입니다. DETERMINISTIC이 지정되면 식별되는 INITIALIZE, ACCUMULATE, MERGE, FINALIZE 루틴은 또한 DETERMINISTIC이어야 합니다(SQLSTATE 428IA).
CALLED ON NULL INPUT
CALLED ON NULL INPUT은 항상 집계 인터페이스 함수에 적용됩니다. 즉, 값의 인수 세트가 모두 널(NULL)인지 여부에 상관없이 함수가 호출됩니다. 식별되는 INITIALIZE, ACCUMULATE, MERGE 프로시저는 항상 CALLED ON NULL INPUT입니다. 식별되는 FINALIZE 함수는 또한 CALLED ON NULL INPUT이어야 합니다(SQLSTATE 428IA). 구성요소 루틴의 매개변수는 널(NULL) 값 또는 일반(널(NULL)이 아닌) 값을 리턴할 수 있습니다. 널(NULL) 인수 값을 테스트하기 위한 책임은 구성요소 루틴에 있습니다.
EXTERNAL ACTION 또는 NO EXTERNAL ACTION
함수가 데이터베이스 관리자가 관리하지 않는 오브젝트의 상태를 변경하는 조치를 수행하는지 여부를 지정합니다. 외부 조치의 예는 메시지를 보내거나 레코드를 파일에 쓰는 것입니다. 기본값은 EXTERNAL ACTION입니다.
EXTERNAL ACTION
함수가 데이터베이스 관리자가 관리하지 않는 오브젝트의 상태를 변경하는 조치를 수행함을 지정합니다.

병렬 태스크에 의해 함수가 실행되는 경우 외부 조치가 있는 함수는 올바르지 않은 결과를 리턴할 수 있습니다. 예를 들어, 함수가 함수에 대한 초기 호출 각각에 대한 참고를 보내는 경우, 함수에 대해 한 번 대신 병렬 태스크마다 하나의 참고를 보냅니다.

NO EXTERNAL ACTION
함수가 데이터베이스 관리자가 관리하지 않는 오브젝트의 상태를 변경하는 조치를 수행하지 않음을 지정합니다. 데이터베이스 관리자는 SQL문의 최적화 동안 이 정보를 사용합니다. NO EXTERNAL ACTION이 지정되면 식별되는 INITIALIZE, ACCUMULATE, MERGE, FINALIZE 루틴은 또한 NO EXTERNAL ACTION이어야 합니다(SQLSTATE 428IA).
NO SCRATCHPAD
이 선택적 절은 외부 함수에 대해 스크래치 패드가 제공되는지 여부를 지정하기 위해 사용할 수 있습니다. NO SCRATCHPAD가 집계 인터페이스 함수에 허용됩니다. 식별되는 INITIALIZE, ACCUMULATE, 및 MERGE 프로시저에는 항상 스크래치 패드가 없습니다. 식별되는 FINALIZE 함수는 또한 NO SCRATCHPAD이어야 합니다(SQLSTATE 428IA).
NO FINAL CALL
이 선택적 절은 최종 호출이 외부 함수에 대해 작성되는지 여부를 지정합니다. NO FINAL CALL이 집계 인터페이스 함수에 허용됩니다. 식별되는 INITIALIZE, ACCUMULATE, MERGE 프로시저는 항상 NO FINAL CALL입니다. 식별되는 FINALIZE 함수는 또한 NO FINAL CALL이어야 합니다(SQLSTATE 428IA).
ALLOW PARALLEL
이 선택적 절은 함수에 대한 단일 참조에 대해, 함수 호출이 병렬 처리될 수 있는지 여부를 지정합니다. 집계 인터페이스 함수에 대해 ALLOW PARALLEL만 지원됩니다.
NOT SECURED 또는 SECURED
함수가 행 및 컬럼 액세스 제어에 대해 안전하다고 간주되는지 여부를 지정합니다. 기본값은 NOT SECURED입니다.
NOT SECURED
함수가 보안 상태가 아님을 표시합니다. 함수가 호출될 때 함수의 인수는 컬럼 마스크가 사용되고 컬럼 레벨 액세스 제어가 해당 테이블에 대해 활성화되는 컬럼을 참조하지 않아야 합니다(SQLSTATE 428HA). 이 규칙은 명령문의 어디에서나 호출되는 비보안 사용자 정의 함수(UDF)에 적용됩니다.
SECURED
함수가 보안 상태임을 표시합니다.
AGGREGATE
이 필수 절은 CREATE FUNCTION문을 사용하여 사용자 정의 집계 함수를 등록함을 표시합니다.
WITH
이 절은 집계 함수 처리 단계 사이에 사용할 수 있는 상태 변수를 지정하는 데 사용됩니다. 최소한 하나의 상태 변수가 정의되어 있어야 합니다.
상태 변수 이름
상태 변수의 선택적 이름을 지정합니다. 이름은 이 함수 정의의 상태 변수 목록에서 다른 state-variable-name과 동일할 수 없습니다(SQLSTATE 42734).
data-type5
상태 변수의 데이터 유형을 지정합니다.

함수의 매개변수에 적용되는 고려사항(data-type1에 설명됨)은 함수 매개변수에도 적용됩니다. 그러나 XML, CLOB, DBCLOB 및 BLOB 데이터 유형은 상태 변수 데이터 유형으로 허용되지 않습니다(SQLSTATE 42611). data-type5의 데이터 유형은 구별 유형이 아니어야 합니다(SQLSTATE 42611).

상태 변수의 총 바이트 수는 바이트를 계산하는 데 테이블 행 크기 접근 방법을 사용하는 32677보다 클 수 없습니다(SQLSTATE 42611).

USING
이 필수 절은 집계 함수 처리가 구현되는 방식을 지정합니다. USING절은 집계 함수 처리의 단계를 구현하는 사용자 정의 프로시저 및 사용자 정의 스칼라 함수 세트를 지정합니다.
IN MODULE module-name
이 선택적 절은 INITIALIZE, ACCUMULATE, MERGE 및 FINALIZE절에 지정된 세 개의 프로시저와 하나의 함수가 모듈 module-name에 있음을 지정합니다. 이 절이 지정된 경우 procedure-designatorfunction-designator에 지정된 procedure-name, function-name 또는 specific-name은 규정되지 않은 이름이어야 합니다(SQLSTATE 42601).
INITIALIZE 프로시저 지정자
집계의 초기화 단계를 구현하는 단일 프로시저를 고유하게 식별합니다.

선택되는 프로시저에는 출력 매개변수만 있어야 합니다. 출력 매개변수의 수는 AGGREGATE WITH절에 지정된 상태 변수의 수와 동일해야 합니다(SQLSTATE 428IA). 선택되는 프로시저에서 각 출력 매개변수의 데이터 유형에는 AGGREGATE WITH절에 지정된 해당 데이터 유형과 정확히 동일한 유형이 있어야 합니다(SQLSTATE 428IA).

선택한 프로시저에 대해 다음 옵션 조합을 지정하십시오(SQLSTATE 428IA).
  • LANGUAGE C 및 NO SQL
  • LANGUAGE JAVA 및 NO SQL

AUTO_REVAL 데이터베이스 구성 매개변수가 DEFERRED_FORCE로 설정되지 않은 경우 이 명령문이 실행될 때 프로시저가 있어야 합니다.

ACCUMULATE 프로시저 지정자
집계의 누적 단계를 구현하는 단일 프로시저를 고유하게 식별합니다.
선택되는 프로시저는 다음 기준을 충족시켜야 합니다(SQLSTATE 428IA).
  • 선택되는 프로시저에는 먼저 집계 함수에 지정된 매개변수의 수와 동일한 수의 input-only 매개변수가 있어야 합니다.
  • 선택되는 프로시저에는 AGGREGATE WITH절에 지정된 상태 변수의 수와 동일한 수의 INOUT 매개변수가 있어야 합니다.
선택되는 프로시저에서 각 입력 전용 매개변수의 데이터 유형에는 parameter-declaration에서 지정된 해당 데이터 유형과 동일한 유형이 있어야 합니다(SQLSTATE 428IA). 선택되는 프로시저에서 각 INOUT 매개변수의 데이터 유형에는 AGGREGATE WITH절에 지정된 해당 데이터 유형과 정확히 동일한 유형이 있어야 합니다(SQLSTATE 428IA).
선택한 프로시저에 대해 다음 옵션 조합을 지정하십시오(SQLSTATE 428IA).
  • LANGUAGE C 및 NO SQL
  • LANGUAGE JAVA 및 NO SQL

AUTO_REVAL 데이터베이스 구성 매개변수가 DEFERRED_FORCE로 설정되지 않은 경우 이 명령문이 실행될 때 프로시저가 있어야 합니다.

MERGE 프로시저 지정자
집계의 병합 단계를 구현하는 단일 프로시저를 고유하게 식별합니다.
선택되는 프로시저는 다음 기준을 충족시켜야 합니다(SQLSTATE 428IA).
  • 선택되는 프로시저에는 AGGREGATE WITH절에 지정된 상태 변수의 수와 동일한 수의 입력 전용 매개변수가 있어야 합니다.
  • 선택되는 프로시저에는 AGGREGATE WITH절에 지정된 상태 변수의 수와 동일한 수의 INOUT 매개변수가 있어야 합니다.
선택되는 프로시저에서 각 input-only 매개변수의 데이터 유형에는 AGGREGATE WITH절에 지정된 해당 데이터 유형과 정확히 동일한 데이터 유형이 있어야 합니다(SQLSTATE 428IA). 선택되는 프로시저에서 각 INOUT 매개변수의 데이터 유형에는 AGGREGATE WITH절에 지정된 해당 데이터 유형과 정확히 동일한 유형이 있어야 합니다(SQLSTATE 428IA).
선택한 프로시저에 대해 다음 옵션 조합을 지정하십시오(SQLSTATE 428IA).
  • LANGUAGE C 및 NO SQL
  • LANGUAGE JAVA 및 NO SQL

AUTO_REVAL 데이터베이스 구성 매개변수가 DEFERRED_FORCE로 설정되지 않은 경우 이 명령문이 실행될 때 프로시저가 있어야 합니다.

FINALIZE 함수 지정자
집계의 최종 결과 단계를 구현하는 단일 사용자 정의 스칼라 함수를 고유하게 식별합니다.

선택되는 함수에는 AGGREGATE WITH절에 지정된 상태 변수의 수와 동일한 수의 input-only 매개변수가 있어야 합니다(SQLSTATE 428IA). 선택되는 함수에서 각 input-only 매개변수의 데이터 유형에는 AGGREGATE WITH절에 지정된 해당 데이터 유형과 정확히 동일한 데이터 유형이 있어야 합니다(SQLSTATE 428IA). 선택되는 함수의 출력 데이터 유형에는 RETURNS절에 지정된 출력 데이터 유형과 정확히 동일한 유형이 있어야 합니다(SQLSTATE 428IA).

선택한 프로시저에 대해 다음 옵션 조합을 지정하십시오(SQLSTATE 428IA).
  • LANGUAGE C 및 NO SQL
  • LANGUAGE JAVA 및 NO SQL

AUTO_REVAL 데이터베이스 구성 매개변수가 DEFERRED_FORCE로 설정되지 않은 경우 이 명령문이 실행될 때 함수가 있어야 합니다.

INITIALIZE, ACCUMULATE, MERGE 및 FINALIZE 루틴에 대한 설명에서 정확히 동일한 데이터 유형은 길이, 정밀도, 스케일, 문자열 단위 및 CCSID가 이 유형 비교에서 고려됨을 의미합니다. 따라서 다음 데이터 유형은 다르게 간주됩니다.
  • CHAR(8)과 CHAR(35)
  • VARCHAR(10 OCTETS)와 VARCHAR(10 CODEUNIT32)
  • DECIMAL(11,2)와 DECIMAL (4,3)

모호하게 유형 지정된 구별 유형은 구별 유형의 소스 유형과 다른 데이터 유형으로 간주됩니다. CHAR(13) 및 GRAPHIC(13)은 유니코드 데이터베이스에서도 다른 유형으로 간주됩니다.

프로시저 지정자
PROCEDURE procedure-name
특정 프로시저를 식별하고 스키마에서 procedure-name 이름을 가진 정확하게 하나의 프로시저 인스턴스가 있는 경우에만 유효합니다. 식별된 프로시저에는 이에 정의된 많은 매개변수가 있을 수 있습니다. 동적 SQL문에서 CURRENT SCHEMA 특수 레지스터는 규정되지 않은 오브젝트 이름의 규정자로서 사용됩니다. 정적 SQL문의 경우, QUALIFIER 프리컴파일 또는 바인드 옵션은 내재적으로 규정되지 않은 오브젝트 이름의 규정자를 지정합니다. 이 이름별 프로시저가 이름 지정되거나 내재된 스키마에 존재하지 않는 경우 오류(SQLSTATE 42704)가 리턴됩니다. 이름 지정되거나 내재된 스키마에 둘 이상의 프로시저 인스턴스가 있는 경우 오류(SQLSTATE 42725)가 리턴됩니다. 이 이름별 프로시저가 존재하고 명령문의 권한 부여 ID에 이 프로시저에 대한 EXECUTE 특권이 없는 경우 오류(SQLSTATE 42501)가 리턴됩니다.
PROCEDURE procedure-name (데이터 유형, ...)
고유하게 프로시저를 식별하는 프로시저 시그니처를 제공합니다. 프로시저 분석 알고리즘이 사용되지 않습니다.
procedure-name
프로시저의 이름을 지정합니다. 동적 SQL문에서 CURRENT SCHEMA 특수 레지스터는 규정되지 않은 오브젝트 이름의 규정자로서 사용됩니다. 정적 SQL문의 경우, QUALIFIER 프리컴파일 또는 바인드 옵션은 내재적으로 규정되지 않은 오브젝트 이름의 규정자를 지정합니다.
(data-type,...)
값은 CREATE PROCEDURE문에 지정된(해당 위치에서) 데이터 유형과 일치해야 합니다. 데이터 유형의 수와 데이터 유형의 논리적 병합이 특정 프로시저 인스턴스를 식별하기 위해 사용됩니다.

데이터 유형이 규정되지 않으면 SQL 경로에서 스키마를 검색하여 유형 이름이 해결됩니다.

매개변수화된 데이터 유형에 대한 길이, 정밀도 또는 스케일을 지정할 필요가 없습니다. 대신, 데이터 유형 일치를 찾을 때 이러한 속성이 무시된다는 것을 표시하기 위해 비어 있는 괄호 세트가 코드화됩니다.

매개변수 값이 다른 데이터 유형(REAL 또는 DOUBLE)을 표시하므로 FLOAT()를 사용할 수 없습니다(SQLSTATE 42601).

길이, 정밀도 또는 스케일이 코드화되는 경우, 값은 CREATE PROCEDURE문에 지정된 것과 정확하게 일치해야 합니다. 길이가 문자 및 그래픽 문자열 데이터 유형에 지정될 때, 길이 속성의 문자열 단위는 CREATE PROCEDURE문에 지정된 것과 정확하게 일치해야 합니다.

FLOAT(n)의 유형은 n에 대해 정의된 값과 일치할 필요가 없습니다. 0 < n < 25는 REAL을 의미하고 24 < n < 54는 DOUBLE을 의미합니다. 유형이 REAL 또는 DOUBLE인지 여부에 따라 일치가 발생합니다.

지정된 시그니처를 가진 프로시저가 이름 지정되거나 내재된 스키마에 존재하지 않는 경우 오류(SQLSTATE 42883)가 리턴됩니다.

이 프로시저 시그니처별 프로시저가 존재하고 명령문의 권한 부여 ID에 이 프로시저에 대한 EXECUTE 특권이 없는 경우 오류(SQLSTATE 42501)가 리턴됩니다.

특정 프로시저 specific-name
프로시저 작성 시 지정되거나 기본값으로 지정되는 이름을 사용하여 특정 프로시저를 식별합니다. 동적 SQL문에서 CURRENT SCHEMA 특수 레지스터는 규정되지 않은 오브젝트 이름의 규정자로서 사용됩니다. 정적 SQL문의 경우, QUALIFIER 프리컴파일 또는 바인드 옵션은 내재적으로 규정되지 않은 오브젝트 이름의 규정자를 지정합니다. specific-name은 이름 지정되거나 내재된 스키마에서 특정 프로시저 인스턴스를 식별해야 합니다. 그렇지 않으면, 오류(SQLSTATE 42704)가 리턴됩니다. 이 특정 이름별 프로시저가 존재하고 명령문의 권한 부여 ID에 이 프로시저에 대한 EXECUTE 특권이 없는 경우 오류(SQLSTATE 42501)가 리턴됩니다.
FUNCTION 함수 이름
특정 함수를 식별하고 스키마에서 function-name 이름을 가진 정확하게 하나의 함수 인스턴스가 있는 경우에만 유효합니다. 식별된 함수에는 이에 정의된 많은 매개변수가 있을 수 있습니다. 동적 SQL문에서 CURRENT SCHEMA 특수 레지스터는 규정되지 않은 오브젝트 이름의 규정자로서 사용됩니다. 정적 SQL문의 경우, QUALIFIER 프리컴파일 또는 바인드 옵션은 내재적으로 규정되지 않은 오브젝트 이름의 규정자를 지정합니다. 이 이름별 함수가 이름 지정되거나 내재된 스키마에 존재하지 않는 경우 오류(SQLSTATE 42704)가 리턴됩니다. 이름 지정되거나 내재된 스키마에 둘 이상의 함수 인스턴스가 있는 경우 오류(SQLSTATE 42725)가 리턴됩니다. 이름별 함수가 존재하고 명령문의 권한 부여 ID에 이 함수에 대한 EXECUTE 특권이 없는 경우, 오류(SQLSTATE 42501)가 리턴됩니다.
함수 지정자
FUNCTION 함수 이름 (데이터 유형, ...)
고유하게 함수를 식별하는 함수 시그니처를 제공합니다. 함수 결정 알고리즘이 사용되지 않습니다.
함수명
함수의 이름을 지정합니다. 동적 SQL문에서 CURRENT SCHEMA 특수 레지스터는 규정되지 않은 오브젝트 이름의 규정자로서 사용됩니다. 정적 SQL문의 경우, QUALIFIER 프리컴파일 또는 바인드 옵션은 내재적으로 규정되지 않은 오브젝트 이름의 규정자를 지정합니다.
(data-type,...)
값은 CREATE FUNCTION문에 지정된(해당 위치에서) 데이터 유형과 일치해야 합니다. 데이터 유형의 수와 데이터 유형의 논리적 병합이 특정 함수 인스턴스를 식별하기 위해 사용됩니다.

데이터 유형이 규정되지 않으면 SQL 경로에서 스키마를 검색하여 유형 이름이 해결됩니다.

매개변수화된 데이터 유형에 대한 길이, 정밀도 또는 스케일을 지정할 필요가 없습니다. 대신, 데이터 유형 일치를 찾을 때 이러한 속성이 무시된다는 것을 표시하기 위해 비어 있는 괄호 세트가 코드화됩니다.

매개변수 값이 다른 데이터 유형(REAL 또는 DOUBLE)을 표시하므로 FLOAT()를 사용할 수 없습니다(SQLSTATE 42601).

길이, 정밀도 또는 스케일이 코드화되는 경우, 값은 CREATE FUNCTION문에 지정된 것과 정확하게 일치해야 합니다. 길이가 문자 및 그래픽 문자열 데이터 유형에 지정될 때, 길이 속성의 문자열 단위는 CREATE FUNCTION문에 지정된 것과 정확하게 일치해야 합니다.

FLOAT(n)의 유형은 n에 대해 정의된 값과 일치할 필요가 없습니다. 0 < n < 25는 REAL을 의미하고 24 < n < 54는 DOUBLE을 의미합니다. 유형이 REAL 또는 DOUBLE인지 여부에 따라 일치가 발생합니다.

지정된 시그니처를 가진 함수가 이름 지정되거나 내재된 스키마에 존재하지 않는 경우, 오류(SQLSTATE 42883)가 리턴됩니다.

이 함수 시그니처별 함수가 존재하고 명령문의 권한 부여 ID에 이 함수에 대한 EXECUTE 특권이 없는 경우 오류(SQLSTATE 42501)가 리턴됩니다.

특정 함수 specific-name
함수 작성 시 지정되거나 기본값으로 지정되는 이름을 사용하여 특정 사용자 정의 함수(UDF)를 식별합니다. 동적 SQL문에서 CURRENT SCHEMA 특수 레지스터는 규정되지 않은 오브젝트 이름의 규정자로서 사용됩니다. 정적 SQL문의 경우, QUALIFIER 프리컴파일 또는 바인드 옵션은 내재적으로 규정되지 않은 오브젝트 이름의 규정자를 지정합니다. specific-name은 이름 지정되거나 내재된 스키마에서 특정 함수 인스턴스를 식별해야 합니다. 그렇지 않으면, 오류(SQLSTATE 42704)가 리턴됩니다. specific-name별 함수가 존재하고 명령문의 권한 부여 ID에 이 함수에 대한 EXECUTE 특권이 없는 경우, 오류(SQLSTATE 42501)가 리턴됩니다.

참고

  • 특권: 함수의 정의자가 항상 함수에 대한 EXECUTE 특권을 수신합니다. 함수의 정의자는 또한 함수 삭제(drop)를 위한 권한을 수신합니다. 또한 함수 정의자에 모든 구성요소 루틴에 대한 EXECUTE WITH GRANT OPTION이 있는 경우 함수의 정의자에게 WITH GRANT OPTION이 지정됩니다.

예:

  1. Java 루틴을 사용하여 숫자 값 세트의 평균을 리턴하는 집계 함수를 정의하십시오.
    CREATE OR REPLACE PROCEDURE myavg_initialize(OUT sum DOUBLE, OUT count INT)
       LANGUAGE JAVA PARAMETER STYLE JAVA
       FENCED NO SQL
       EXTERNAL NAME 'myclass!myavg_initialize';
     
    CREATE OR REPLACE PROCEDURE myavg_accumulate(IN input DOUBLE, INOUT sum DOUBLE, INOUT count INT)
       LANGUAGE JAVA PARAMETER STYLE JAVA
       FENCED NO SQL
       EXTERNAL NAME 'myclass!myavg_accumulate';
    
    CREATE OR REPLACE PROCEDURE myavg_merge(IN sum DOUBLE, IN count INT, 
          INOUT mergesum DOUBLE, INOUT mergecount INT)
       LANGUAGE JAVA PARAMETER STYLE JAVA
       FENCED NO SQL
       EXTERNAL NAME 'myclass!myavg_merge';
    
    CREATE OR REPLACE FUNCTION myavg_finalize(sum DOUBLE, count INT)
       RETURNS DECFLOAT(34)
       LANGUAGE JAVA PARAMETER STYLE JAVA
       FENCED NO SQL
       EXTERNAL NAME 'myclass!myavg_finalize';
    
    CREATE OR REPLACE FUNCTION myavg(DOUBLE)
       RETURNS DECFLOAT(34)
       AGGREGATE WITH (sum DOUBLE, count INT)
       USING 
       INITIALIZE PROCEDURE myavg_initialize
       ACCUMULATE PROCEDURE myavg_accumulate
       MERGE PROCEDURE myavg_merge
       FINALIZE FUNCTION myavg_finalize;
  2. 규정되지 않은 프로시저 및 함수 이름으로 집계 함수를 정의하십시오. 스키마 FOO 아래에서 집계 함수를 정의하십시오. 스키마 BAR 아래에서 집계 함수를 호출하십시오.
    SET SCHEMA FOO;
    
    CREATE OR REPLACE FUNCTION myavg(DOUBLE)
       RETURNS DOUBLE
       AGGREGATE WITH (sum DOUBLE, count INT)
       USING
       INITIALIZE PROCEDURE myavg_initialize
       ACCUMULATE PROCEDURE myavg_accumulate
       MERGE PROCEDURE myavg_merge
       FINALIZE FUNCTION myavg_finalize;
    
    SET SCHEMA BAR;
    
    SELECT FOO.myavg(c1) FROM t1;
    데이터베이스 관리자는 FOO.myavg의 호출을 위해 이름이 FOO.myavg_initialize, FOO.myavg_accumulate, FOO.myavg_merge인 프로시저 및 이름이 FOO.myavg_finalize인 함수를 찾습니다.
  3. 규정되지 않은 특정 프로시저 및 함수 이름으로 집계 함수를 정의하십시오. 스키마 FOO 아래에서 집계 함수를 정의하십시오. 스키마 BAR 아래에서 집계 함수를 호출하십시오.
    SET SCHEMA FOO;
    
    CREATE OR REPLACE FUNCTION myavg(DOUBLE)
       RETURNS DOUBLE
       AGGREGATE WITH (sum DOUBLE, count INT)
       USING
       INITIALIZE SPECIFIC PROCEDURE myavg_initialize1
       ACCUMULATE SPECIFIC PROCEDURE myavg_accumulate1
       MERGE SPECIFIC PROCEDURE myavg_merge1
       FINALIZE SPECIFIC FUNCTION myavg_finalize1;
    
    SET SCHEMA BAR;
    
    SELECT FOO.myavg(c1) FROM t1;
    데이터베이스 관리자는 FOO.myavg의 호출을 위해 특정 이름이 FOO.myavg_initialize1, FOO.myavg_accumulate1, FOO.myavg_merge1인 프로시저 및 특정 이름이 FOO.myavg_finalize1인 함수를 찾습니다.
  4. 일부 구성요소 루틴 없이 집계 함수를 정의하십시오. 집계 함수가 유효하지 않게 작성되며 다음 액세스에서 유효성 다시 확인이 호출됩니다.
    UPDATE DB CFG USING AUTO_REVAL DEFERRED_FORCE;
    
    CREATE OR REPLACE PROCEDURE myavg_initialize(OUT sum DOUBLE, OUT count INT)
       LANGUAGE JAVA PARAMETER STYLE JAVA
       FENCED NO SQL
       EXTERNAL NAME 'myclass!myavg_initialize';
     
    CREATE OR REPLACE PROCEDURE myavg_accumulate(IN input DOUBLE, INOUT sum DOUBLE, INOUT count INT)
       LANGUAGE JAVA PARAMETER STYLE JAVA
       FENCED NO SQL
       EXTERNAL NAME 'myclass!myavg_accumulate';
    
    -- component routine merge and finalize are missing, the creation is successful and myavg is invalid:
    CREATE OR REPLACE FUNCTION myavg(DOUBLE)
       RETURNS DOUBLE
       AGGREGATE WITH (sum DOUBLE, count INT)
       USING
       INITIALIZE  PROCEDURE myavg_initialize
       ACCUMULATE PROCEDURE myavg_accumulate
       MERGE PROCEDURE myavg_merge
       FINALIZE FUNCTION myavg_finalize;
    
    CREATE OR REPLACE PROCEDURE myavg_merge(IN sum DOUBLE, IN count INT, 
          INOUT mergesum DOUBLE, INOUT mergecount INT)
       LANGUAGE JAVA PARAMETER STYLE JAVA
       FENCED NO SQL
       EXTERNAL NAME 'myclass!myavg_merge';
    
    CREATE OR REPLACE FUNCTION myavg_finalize(sum DOUBLE, count INT)
       RETURNS DOUBLE
       LANGUAGE JAVA PARAMETER STYLE JAVA
       FENCED NO SQL
       EXTERNAL NAME 'myclass!myavg_finalize';
    
    -- revalidation of myavg will be invoked and it will be successful
    SELECT myavg(c1) FROM t1;
  5. 전역 변수를 해당 매개변수의 기본값으로 사용하여 집계 함수를 정의하십시오. 전역 변수를 삭제하면 함수가 무효화됩니다.
    CREATE VARIABLE gv1 DOUBLE;
    
    -- create all 4 component routines (myavg_initialize, myavg_accumulate, myavg_merge, myavg_finalize) like Example 1
    ...
    ...
    ...
    
    CREATE OR REPLACE FUNCTION myavg(p1 DOUBLE DEFAULT gv1)
       RETURNS DOUBLE
       AGGREGATE WITH (sum DOUBLE, count INT)
       USING
       INITIALIZE SPECIFIC PROCEDURE myavg_initialize
       ACCUMULATE SPECIFIC PROCEDURE myavg_accumulate
       MERGE SPECIFIC PROCEDURE myavg_merge
       FINALIZE SPECIFIC FUNCTION myavg_finalize;
    
    -- the following statement invalidates the function 'myavg'
    DROP VARIABLE gv1;
  6. 구성요소 루틴이 전역 변수를 해당 매개변수의 기본값으로 사용하는 집계 함수를 정의하십시오. 전역 변수를 삭제하면 구성요소 루틴 및 집계 함수가 모두 무효화됩니다.
    CREATE VARIABLE gv1 INT;
    
    CREATE OR REPLACE PROCEDURE myavg_initialize(OUT sum DOUBLE, OUT count INT DEFAULT gv1)
       LANGUAGE JAVA PARAMETER STYLE JAVA
       FENCED NO SQL
       EXTERNAL NAME 'myclass!myavg_initialize';
    
    -- create the remaining 3 component routines (myavg_accumulate, myavg_merge, myavg_finalize) like Example 1
    ...
    ...
    ...
    
    CREATE OR REPLACE FUNCTION myavg(DOUBLE)
       RETURNS DOUBLE
       AGGREGATE WITH (sum DOUBLE, count INT)
       USING
       INITIALIZE SPECIFIC PROCEDURE myavg_initialize
       ACCUMULATE SPECIFIC PROCEDURE myavg_accumulate
       MERGE SPECIFIC PROCEDURE myavg_merge
       FINALIZE SPECIFIC FUNCTION myavg_finalize;
    
    -- the following statement invalidates both the routine 'myavg_initialize' and the function 'myavg'
    DROP VARIABLE gv1;
  7. 집계 함수를 정의한 후 집계 함수를 호출하는 프로시저를 작성하십시오. 그 다음, 구성요소 루틴 중 하나를 삭제(drop)하고 대체하십시오. 조치는 집계 함수와 이를 호출하는 프로시저를 모두 무효화합니다.
    CREATE OR REPLACE PROCEDURE myavg_initialize(OUT sum DOUBLE, OUT count INT)
       LANGUAGE JAVA PARAMETER STYLE JAVA
       FENCED NO SQL 
       EXTERNAL NAME 'myclass!myavg_initialize';
    
    -- create the remaining 3 component routines (myavg_accumulate, myavg_merge, myavg_finalize) like Example 1
    ...
    ...
    ...
    
    CREATE OR REPLACE FUNCTION myavg(DOUBLE)
       RETURNS DOUBLE
       AGGREGATE WITH (sum DOUBLE, count INT)
       USING
       INITIALIZE SPECIFIC PROCEDURE myavg_initialize
       ACCUMULATE SPECIFIC PROCEDURE myavg_accumulate
       MERGE SPECIFIC PROCEDURE myavg_merge
       FINALIZE SPECIFIC FUNCTION myavg_finalize;
    
    CREATE OR REPLACE PROCEDURE myproc (OUT p1 DOUBLE)
    BEGIN
       SET p1 = (SELECT myavg(c1) FROM t1);
    END;
    
    -- drop the component routine
    -- this action invalidates both the 'myavg' aggregation function and the 'myproc' procedure that calls it:
    DROP PROCEDURE myavg_initialize;
     
    -- re-create the component routine
    -- like the DROP statement, this action invalidates both the 'myavg' aggregation function and the 'myproc' procedure that calls it:
    CREATE OR REPLACE PROCEDURE myavg_initialize(OUT sum DOUBLE, OUT count INT)
       LANGUAGE C PARAMETER STYLE C
       FENCED NO SQL
       EXTERNAL NAME 'myclass!myavg_initialize_C_version';
    
    -- revaliation is invoked the next time 'myproc' is accessed
    -- both the 'myavg' aggregation function and the 'myproc' procedure are revalidated
    CALL myproc(?); 
  8. AUTO_REVAL 데이터베이스 구성 매개변수를 사용하여 유효하지 않음 및 유효성 다시 확인 시맨틱을 제어하십시오.
    UPDATE DB CFG USING AUTO_REVAL DEFERRED_FORCE;
    
    -- global variable 'gv1' does not exist; the 'myavg_initialize' procedure can be created, but it is invalid
    CREATE OR REPLACE PROCEDURE myavg_initialize(OUT sum DOUBLE, OUT count INT default gv1)
       LANGUAGE JAVA PARAMETER STYLE JAVA
       FENCED NO SQL
       EXTERNAL NAME 'myclass!myavg_initialize';
    
    -- create the remaining 3 component routines (myavg_accumulate, myavg_merge, myavg_finalize) like Example 1
    ...
    ...
    ...
    
    -- the 'myavg' function can be created, but it is invalid 
    CREATE OR REPLACE FUNCTION myavg(DOUBLE)
       RETURNS mydouble
       AGGREGATE WITH (sum DOUBLE, count INT)
       USING
       INITIALIZE SPECIFIC PROCEDURE myavg_initialize
       ACCUMULATE SPECIFIC PROCEDURE myavg_accumulate
       MERGE SPECIFIC PROCEDURE myavg_merge
       FINALIZE SPECIFIC FUNCTION myavg_finalize;
    
    -- create the global variable 'gv1'
    CREATE VARIABLE gv1 DOUBLE;
    
    -- revalidation of 'myavg' function and 'myavg_initialize' procedure is invoked; revalidation is successful
    SELECT myavg(c1) FROM t1;
    
    -- change the setting of the AUTO_REVAL database configuration parameter to IMMEDAITE
    UPDATE DB CFG USING AUTO_REVAL IMMEDIATE;
    
    -- the CREATE OR REPLACE VARIABLE statement invokes the revalidation for both 'myavg' function and 'myavg_initialize' procedure
    CREATE OR REPLACE VARIABLE gv1 DOUBLE DEFAULT 1.0;