ALTER TYPE(구조화됨) 명령문
ALTER TYPE문은 사용자 정의 구조화된 유형의 속성이나 메소드 스펙을 추가 또는 삭제하는 데 사용됩니다. 기존 메소드의 특성도 변경될 수 있습니다.
호출
이 명령문은 애플리케이션 프로그램에 임베드되거나 동적 SQL문을 사용하여 실행할 수 있습니다.DYNAMICRULES 실행 동작이 패키지에 영향을 주는 경우에만 동적으로 준비될 수 있는 실행문입니다(SQLSTATE 42509).
권한 부여
- 해당 유형의 스키마에 대한 ALTERIN 특권
- SYSCAT.DATATYPES 카탈로그 뷰의 OWNER 컬럼에서 기록된 대로 유형의 소유자
- 유형의 스키마에 대한 SCHEMAADM 권한
- DBADM 권한
- 데이터베이스에 대한 CREATE_NOT_FENCED_ROUTINE 권한
- DBADM 권한
분리(fenced)될 메소드를 변경하기 위해 추가 권한이나 특권이 필요하지 않습니다.
구문
>>-ALTER TYPE--type-name----------------------------------------> .----------------------------------------------------------. V | >----+-ADD ATTRIBUTE--| attribute-definition |--------------+-+->< | .-RESTRICT-. | +-DROP ATTRIBUTE--attribute-name--+----------+---------+ +-ADD METHOD--| method-specification |-----------------+ | .--------------------. | | V | | +-ALTER--| method-identifier |----| method-options |-+-+ | .-RESTRICT-. | '-DROP--| method-identifier |--+----------+------------' method-identifier |--+-METHOD--method-name--+-------------------------------+-+---| | '-(--+---------------------+--)-' | | | .-,---------. | | | | V | | | | '-(----data-type-+--)-' | '-SPECIFIC METHOD--specific-name-------------------------' method-options |--+-+-FENCED-----+-----+---------------------------------------| | '-NOT FENCED-' | '-+-THREADSAFE-----+-' '-NOT THREADSAFE-'
설명
- type-name
- 변경될 구조화된 유형을 식별합니다. 카탈로그에서 정의된 기존 유형이어야 하며(SQLSTATE 42704), 유형은 구조화된 유형이어야 합니다(SQLSTATE 428DP). 동적 SQL문에서 CURRENT SCHEMA 특수 레지스터는 규정되지 않은 오브젝트 이름의 규정자로서 사용됩니다. 정적 SQL문에서 QUALIFIER 프리컴파일 또는 바인드 옵션은 내재적으로 규정되지 않은 오브젝트 이름의 규정자를 지정합니다.
- ADD ATTRIBUTE
- 기존의 구조화된 유형의 마지막 속성 뒤에 속성을
추가합니다.
- attribute-definition
- 구조화된 유형의 속성을 정의합니다.
- attribute-name
- 속성의 이름을 지정합니다. 이름은 이 구조화된 유형의 다른
어떤 속성이나(상속된 속성 포함) 이 구조화된 유형의 모든
부속 유형과 같을 수 없습니다(SQLSTATE 42711).
술어에서 키워드로 사용되는 많은 이름이 시스템 사용을 위해 예약되며, attribute-name로 사용될 수 없습니다(SQLSTATE 42939). 이름은 SOME, ANY, ALL, NOT, AND, OR, BETWEEN, NULL, LIKE, EXISTS, IN, UNIQUE, OVERLAPS, SIMILAR, MATCH 및 비교 연산자입니다.
- data-type 1
- 속성의 데이터 유형을 지정합니다. XML
이외의 CREATE TABLE 아래에 나열되는 데이터 유형 중 하나입니다(SQLSTATE
42601). 데이터 유형은 기존 데이터 유형을 식별해야 합니다(SQLSTATE
42704). data-type이 스키마 이름 없이
지정되는 경우 유형은 SQL 경로에서 해당 스키마를 검색하여
분석됩니다. 다양한 데이터 유형의 설명이
CREATE TABLE
에서 제공됩니다. 속성 데이터 유형이 참조 유형인 경우, 참조의 대상 유형은 존재하는 구조화된 유형이어야 합니다(SQLSTATE 42704).런타임 시에 유형의 인스턴스가 직접 또는 간접적으로 동일한 유형 또는 그의 부속 유형 중 하나의 다른 인스턴스를 포함하도록 허용하는 유형 정의를 방지하기 위해, 유형이 그의 속성 유형 중 하나가 직접 또는 간접적으로 그 자신을 사용하도록 정의될 수 없다는 제한사항이 있습니다(SQLSTATE 428EP).
문자 및 그래픽 문자열 데이터 유형은 CODEUNITS32의 문자열 단위를 지정할 수 없습니다.
- lob-options
- LOB 유형(또는 LOB 유형을 바탕으로 하는 구별 유형)과 연관된
옵션을 지정합니다. lob-options의 상세한 설명은
CREATE TABLE
을 참조하십시오.
- DROP ATTRIBUTE
- 기존 구조화된 유형의 속성을 삭제합니다.
- attribute-name
- 속성의 이름입니다. 속성은 유형의 속성으로 존재해야 합니다(SQLSTATE 42703).
- RESTRICT
- type-name이 기존 테이블, 뷰, 컬럼, 컬럼의 유형 안에 중첩된 속성 또는 인덱스 확장의 유형으로 사용되는 경우 속성을 삭제할 수 없다는 규칙을 시행합니다.
- ADD METHOD method-specification
- type-name에 의해 식별되는 유형에 메소드 스펙을 추가합니다.
이 메소드는 별도의 CREATE METHOD문이 메소드에 본문을 제공하기 위해 사용될
때가지 사용될 수 없습니다. method-specification에 대한 자세한
정보는
CREATE TYPE(구조화됨)
을 참조하십시오. - ALTER method-identifier
- 변경될 메소드의 인스턴스를 고유하게 식별합니다.
지정된 메소드는 기존 메소드 본문을 갖거나 갖지 않을 수 있습니다.
LANGUAGE SQL로서 선언된 메소드는 변경할 수 없습니다(SQLSTATE 42917).
- method-identifier
-
- METHOD method-name
- 특정 메소드를 식별하고 유형 type-name에 대한 이름 method-name을 가지는 정확하게 하나의 메소드 인스턴스가 있는 경우에만 유효합니다. 식별된 메소드에는 이에 정의된 매개변수 수가 있을 수 있습니다. 이름별 메소드가 유형에 대해 존재하지 않는 경우, 오류(SQLSTATE42704)가 발생합니다. 둘 이상의 유형에 대한 메소드 인스턴스가 있는 경우, 오류(SQLSTATE 42725)가 발생합니다.
- METHOD method-name (data-type,...)
- 고유하게 메소드를 식별하는 메소드 시그니처를
제공합니다. 메소드 해결 알고리즘이 사용되지 않습니다.
- method-name
- 유형 type-name에 대한 메소드의 이름을 지정합니다.
- (data-type,...)
- 값은 CREATE TYPE문에 지정된(해당 위치에서) 데이터 유형과 일치해야 합니다. 데이터 유형의 번호 및 데이터 유형의 논리적 병합이 특정 메소드 인스턴스를 식별하기 위해 사용됩니다.
데이터 유형이 규정되지 않은 경우 유형 이름은 SQL 경로의 스키마를 검색하여 분석됩니다. 이는 REFERENCE 유형에 지정된 데이터 유형 이름에 적용됩니다.
매개변수화된 데이터 유형에 대한 길이, 정밀도 또는 스케일을 지정할 필요가 없습니다. 대신, 데이터 유형 일치를 찾을 때 이러한 속성이 무시된다는 것을 표시하기 위해 비어 있는 괄호 세트가 코드화됩니다.
FLOAT()는 매개변수 값이 다른 데이터 유형(REAL 또는 DOUBLE)을 표시하므로 사용될 수 없습니다(SQLSTATE 42601).
길이, 정밀도 또는 스케일이 코딩되는 경우 값은 CREATE TYPE문에서 지정된 것과 정확하게 일치해야 합니다.
0 < n < 25가 REAL을 의미하고 24 < n < 54가 DOUBLE을 의미하므로 FLOAT의 유형(n)은 n에 정의된 값과 일치할 필요가 없습니다. 유형이 REAL 또는 DOUBLE인지 여부를 기반으로 일치가 발생합니다.
지정된 시그니처를 가진 메소드가 이름 지정되거나 내재된 스키마의 유형에 존재하지 않는 경우, 오류(SQLSTATE 42883)가 발생합니다.
- SPECIFIC METHOD specific-name
- 메소드 작성 시 지정되거나 기본값으로 지정되는 이름을 사용하여 특정 메소드를 식별합니다. 동적 SQL문에서 CURRENT SCHEMA 특수 레지스터는 규정되지 않은 오브젝트 이름의 규정자로서 사용됩니다. 정적 SQL문의 경우, QUALIFIER 프리컴파일 또는 바인드 옵션은 내재적으로 규정되지 않은 오브젝트 이름의 규정자를 지정합니다. specific-name은 이름 지정되거나 내재된 스키마에서 특정 메소드 인스턴스를 식별해야 합니다. 그렇지 않으면, 오류(SQLSTATE 42704)가 발생합니다.
- method-options
- 메소드에 대해 변경될 옵션을 지정합니다.
- FENCED 또는 NOT FENCED
- 메소드가 데이터베이스 관리자 운영 환경의 프로세스나 주소 공간에서 실행하기에
안전한지(NOT FENCED), 그렇지 않은지(FENCED) 여부를 지정합니다. 대부분의 메소드는 FENCED 또는
NOT FENCED로서 실행하는 옵션을 갖습니다.
메소드가 FENCED이도록 변경되는 경우, 데이터베이스 관리자는 내부 자원(예를 들어, 데이터 버퍼)을 메소드에 의한 액세스로부터 격리합니다. 일반적으로, FENCED로서 실행하는 메소드는 NOT FENCED로서 실행하는 것과 비슷하게 수행하지 않습니다.
경고:충분히 코딩, 검토 및 테스트되지 않은 메소드에 대한 NOT FENCED의 사용은 데이터베이스의 무결성을 위협할 수 있습니다. 데이터베이스 엔진은 발생할 수 있는 우연한 실패의 많은 공통 유형에 대해 몇 가지 예방조치를 취하지만, NOT FENCED 메소드가 사용될 때 완전한 무결성을 보증할 수 없습니다.NOT THREADSAFE로서 선언되는 메소드는 NOT FENCED이도록 변경될 수 없습니다(SQLSTATE 42613).
메소드가 AS LOCATOR로 선언된 임의의 매개변수를 갖고 NO SQL 옵션을 갖고 정의된 경우, 해당 메소드는 FENCED이도록 변경될 수 없습니다(SQLSTATE 42613).
이 옵션은 LANGUAGE OLE 메소드에 대해 변경될 수 없습니다(SQLSTATE 42849).
- THREADSAFE 또는 NOT THREADSAFE
- 메소드가 다른 루틴과 동일한 프로세스에서 실행하기에 안전하다고
간주되는지(THREADSAFE) 또는 그렇지 않은지(NOT THREADSAFE) 여부를 지정합니다.
메소드가 OLE 이외의 LANGUAGE를 갖고 정의되는 경우,
- 메소드가 THREADSAFE로서 정의되는 경우, 데이터베이스 관리자는 다른 루틴과 동일한 프로세스에서 해당 메소드를 호출할 수 있습니다. 일반적으로 스레드 안전하려면 메소드가 어떤 전역 또는 정적 데이터 영역도 사용해서는 안됩니다. 대부분의 프로그래밍 참조는 스레드 안전 루틴 쓰기에 대한 논의를 포함합니다. FENCED 및 NOT FENCED 메소드는 둘 다 THREADSAFE일 수 있습니다. 메소드가 LANGUAGE OLE로 정의되는 경우 THREADSAFE는 지정될 수 없습니다(SQLSTATE 42613).
- 메소드가 NOT THREADSAFE로서 정의되는 경우, 데이터베이스 관리자는 절대 다른 루틴과 동일한 프로세스에서 해당 메소드를 호출하지 않습니다. 분리(fenced)된 메소드만 NOT THREADSAFE일 수 있습니다(SQLSTATE 42613).
- DROP method-identifier
- 삭제될 메소드의 인스턴스를 고유하게 식별합니다. 지정된 메소드는 기존 메소드 본문을 가져서는 안됩니다(SQLSTATE 428ER). ALTER TYPE DROP METHOD를 사용하기 전에 DROP METHOD문을 사용하여 메소드 본문을 삭제하십시오. CREATE TYPE문에 의해 내재적으로 생성된 메소드(예: mutator 및 observer)는 삭제할 수 없습니다(SQLSTATE 42917).
- RESTRICT
- 지정된 메소드가 기존 메소드 본문을 갖는 것에 제한을 받음을 표시합니다. ALTER TYPE DROP METHOD를 사용하기 전에 DROP METHOD문을 사용하여 메소드 본문을 삭제하십시오.
규칙
- 속성 추가 또는 삭제는 다음 경우에 type-name 유형에
대해 허용되지 않습니다(SQLSTATE 55043).
- 유형 또는 그의 부속 유형 중 하나가 기존 테이블 또는 뷰의 유형입니다.
- 그의 유형이 직접 또는 간접적으로 type-name을
사용하는 테이블의 컬럼이 존재합니다. 직접적으로 사용 및 간접적으로
사용이란 용어는
구조화된 유형
에서 정의됩니다. - 유형 또는 그의 부속 유형 중 하나가 인덱스 확장에서 사용됩니다.
- 유형이 속성을 추가하여 변경될 수 없지만 유형 또는 그의 부속 유형 중 하나에 대한 속성의 총 수가 4082를 초과합니다(SQLSTATE 54050).
- ADD ATTRIBUTE 옵션:
- ADD ATTRIBUTE는 새 속성에 대한 observer 및 mutator 메소드를
생성합니다. 이들 메소드는 구조화된 유형이 작성될 때 생성되는 메소드와
유사합니다. (
CREATE TYPE(구조화됨)
을 참조하십시오.) 이들 메소드가 임의의 기존 메소드나 함수와 충돌하거나 겹쳐쓰는 경우, ALTER TYPE문이 실패합니다(SQLSTATE 42745). - 유형(또는 그의 부속 유형 중 하나)에 대한 INLINE LENGTH가 사용자에 의해 정확하게 292보다 작은 값을 갖고 지정되고 추가된 속성으로 인해 지정된 인라인 길이가 변경된 유형에 대한 생성자 함수의 결과 크기(32바이트 더하기 속성당 10바이트)보다 작아지는 경우, 오류가 발생합니다(SQLSTATE 42611).
- ADD ATTRIBUTE는 새 속성에 대한 observer 및 mutator 메소드를
생성합니다. 이들 메소드는 구조화된 유형이 작성될 때 생성되는 메소드와
유사합니다. (
- DROP ATTRIBUTE 옵션:
- 기존 수퍼유형으로부터 상속되는 속성은 삭제할 수 없습니다(SQLSTATE 428DJ).
- DROP ATTRIBUTE는 삭제된 속성의 mutator 및 observer 메소드를 삭제하며, 삭제된 메소드에 대한 종속성을 검사합니다.
- DROP METHOD 옵션:
- 다른 메소드에 의해 겹쳐써지는 원래 메소드는 삭제될 수 없습니다(SQLSTATE 42893).
참고
- SYSIBM, SYSFUN, 또는 SYSPROC 스키마에 있는 메소드를 변경할 수 없습니다(SQLSTATE 42832).
- 유형이 속성을 추가 또는 삭제하여 변경될 때, 이 유형 또는 이 유형의 부속 유형을 매개변수나 결과로 사용하는 함수나 메소드에 의존하는 모든 패키지가 무효화됩니다.
- 속성이 구조화된 유형으로부터 추가 또는 삭제될 때,
- 유형의 INLINE LENGTH가 유형이 작성될 때 시스템에 의해 계산된 경우, INLINE LENGTH 값은 변경을 고려하기 위해 변경된 유형 및 그의 모든 부속 유형에 대해 자동으로 수정됩니다. INLINE LENGTH 값은 또한 INLINE LENGTH가 시스템에 의해 계산되었고 유형이 변경된 INLINE LENGTH를 갖는 모든 유형의 속성을 포함하는 모든 구조화된 유형에 대해 자동으로(반복적으로) 수정됩니다.
- 속성 추가 또는 삭제에 의해 영향을 받는 임의 유형의 INLINE LENGTH가 명시적으로 사용자에 의해 지정된 경우, 해당 특정 유형에 대한 INLINE LENGTH는 변경되지 않습니다. 명시적으로 지정된 인라인 길이에 대해서는 특별히 주의해야 합니다. 유형이 나중에 속성이 추가될 가능성이 큰 경우, 해당 유형 또는 컬럼 정의에 있는 그의 부속 유형 중 하나의 모든 사용을 위한 인라인 길이는 인스턴스화된 오브젝트 길이의 증가 가능성을 고려하기에 충분히 커야 합니다.
- 새 속성이 애플리케이션 프로그램에 가시적이 될 경우, 기존 변환 함수가 데이터 유형의 새 구조와 일치하도록 수정되어야 합니다.
- 파티션된 데이터베이스 환경에서, 외부 사용자 정의 함수(UDF) 또는 메소드에서 SQL을 사용하는 것이 지원되지 않습니다(SQLSTATE 42997).
- 특권: 메소드 본문이 CREATE METHOD문을 사용하여 정의될 때까지 ALTER TYPE문에서 명시적으로 지정되는 모든 메소드에 대해 EXECUTE 특권이 제공되지 않습니다. 사용자 정의 유형의 소유자는 ALTER TYPE문을 사용하여 메소드 스펙을 삭제할 능력을 갖고 있습니다.
예
- 예 1: ALTER TYPE문을 사용하여 상호 참조하는
유형 및 테이블의 순환을 허가할 수 있습니다. EMPLOYEE 및 DEPARTMENT라는
상호 참조하는 테이블을 고려하십시오.
다음 시퀀스는 유형 및 테이블이 작성되도록 허용합니다.
CREATE TYPE DEPT ... CREATE TYPE EMP ... (including attribute named DEPTREF of type REF(DEPT)) ALTER TYPE DEPT ADD ATTRIBUTE MANAGER REF(EMP) CREATE TABLE DEPARTMENT OF DEPT ... CREATE TABLE EMPLOYEE OF EMP (DEPTREF WITH OPTIONS SCOPE DEPARTMENT) ALTER TABLE DEPARTMENT ALTER COLUMN MANAGER ADD SCOPE EMPLOYEE다음 시퀀스는 이들 테이블 및 유형이 삭제되도록 허용합니다.
DROP TABLE EMPLOYEE (the MANAGER column in DEPARTMENT becomes unscoped) DROP TABLE DEPARTMENT ALTER TYPE DEPT DROP ATTRIBUTE MANAGER DROP TYPE EMP DROP TYPE DEPT - 예 2: ALTER TYPE문을 사용하여 부속 유형을 참조하는
속성을 갖는 유형을 작성할 수 있습니다.
CREATE TYPE EMP ... CREATE TYPE MGR UNDER EMP ... ALTER TYPE EMP ADD ATTRIBUTE MANAGER REF(MGR) - 예 3: ALTER TYPE문을 사용하여 속성을
추가할 수 있습니다. 다음 명령문은 SPECIAL 속성을 EMP 유형에
추가합니다. 인라인 길이가 원래 CREATE TYPE문에서 지정되지
않았기 때문에, 인라인 길이가 13(새 속성을 위한 10 +
속성 길이 + 비LOB 속성을 위한 2바이트)을 추가하여
다시 계산됩니다.
ALTER TYPE EMP ... ADD ATTRIBUTE SPECIAL CHAR(1) - 예 4: ALTER TYPE문을 사용하여 유형과 연관된
메소드를 추가할 수 있습니다. 다음 명령문은 BONUS라는 메소드를
추가합니다.
ALTER TYPE EMP ... ADD METHOD BONUS (RATE DOUBLE) RETURNS INTEGER LANGUAGE SQL CONTAINS SQL NO EXTERNAL ACTION DETERMINISTIC메소드 본문을 작성하기 위해 CREATE METHOD문이 발행될 때까지 BONUS 메소드를 사용할 수 없음을 주의하십시오. 유형 EMP가 SALARY라는 속성을 포함한다고 가정하는 경우 다음 예는 메소드 본문 정의를 보여줍니다.
CREATE METHOD BONUS(RATE DOUBLE) FOR EMP RETURN CAST(SELF.SALARY * RATE AS INTEGER)
