ID

ID는 이름을 구성하는 데 사용되는 토큰입니다. SQL문의 ID는 SQL ID 또는 호스트 ID입니다.

  • SQL ID

    두 가지 유형의 SQL ID (일반 및 구분 ID) 를 사용할 수 있습니다.

    • 일반 ID는 뒤에 0개이상의 문자가 오는 대문자이며 각 문자는 대문자, 숫자 또는 밑줄 문자입니다. 소문자는 일반 ID를 지정할 때 사용할 수 있지만 처리 시 대문자로 변환됩니다. 일반 ID는 예약어가 될 수 없습니다.
      다음 예제는 일반 ID를 표시합니다.
         WKLYSAL     WKLY_SAL
    • 분리 ID는 큰따옴표로 묶인 하나 이상의 문자 시퀀스입니다. 시퀀스의 앞 공백은 의미가 있습니다. 시퀀스의 뒷 공백은 ID 내부에 저장되더라도 의미가 없습니다. 두 개의 연속 인용 부호는 구분 ID 내에서 하나의 인용 부호를 나타내는 데 사용됩니다. 구분 ID는 문자 시퀀스가 일반 ID를 규정하지 않는 경우 사용될 수 있습니다. 이러한 방식으로 ID가 소문자를 포함할 수 있습니다.
      다음 예제는 일련의 구분 ID를 표시합니다.
         "WKLY_SAL"     "WKLY SAL"     "UNION"     "wkly_sal"

    2바이트 코드 페이지에서 작성되었지만 복수 바이트 코드 페이지에서 애플리케이션 또는 데이터베이스가 사용하는 ID의 문자 변환에는 특별한 고려가 필요할 수 있습니다. 예를 들어, 이러한 ID는 변환 후 ID의 길이 한계를 초과할 수 있습니다.

  • 호스트 ID

    호스트 ID는 호스트 프로그램에 선언된 이름입니다. 호스트 ID를 구성하는 규칙은 호스트 언어의 규칙입니다. 호스트 ID의 최대 길이는 255바이트이며 SQL 또는 DB2(대문자 또는 소문자)로 시작해서는 안됩니다.

이름 지정 규칙 및 내재된 오브젝트 이름 자격

데이터베이스 오브젝트 이름을 구성하는 규칙은 이름으로 지정된 오브젝트의 유형에 따라 다릅니다. 이름은 단일 SQL ID로 구성되거나 오브젝트를 보다 구체적으로 식별하는 하나 이상의 ID로 규정될 수 있습니다. 각 ID는 마침표로 구분해야 합니다.

구문 다이어그램은 이름 유형마다 다른 이름을 사용합니다. 다음 목록은 이들 용어를 정의합니다.

alias-name
별명을 지정하는 스키마 규정 이름
attribute-name
구조화된 데이터 유형의 속성을 지정하는 ID
array-type-name
사용자 정의 배열 유형을 지정하는 규정되거나 규정되지 않은 이름. array-type-name의 규정되지 않은 양식은 SQL ID입니다. SQL문의 규정되지 않은 배열 유형 이름은 내재적으로 규정됩니다. 내재된 규정자는 array-type-name이 나타나는 컨텍스트로 판별되는 스키마 이름 또는 모듈 이름입니다. 규정된 양식은 schema-name과 그 뒤의 마침표와 SQL ID 또는 module-name(schema-name으로도 규정될 수 있음)과 그 뒤의 마침표와 SQL ID입니다. 배열 유형이 모듈에서 정의되고 동일한 모듈 외부에서 사용되는 경우 module-name으로 규정되어야 합니다.
authorization-name
사용자, 그룹 또는 역할을 지정하는 ID. 사용자 또는 그룹의 경우:
  • 사용 가능한 문자는 'A'부터 'Z', 'a'부터 'z', '0'부터 '9', '#', '@', '$', '_', '!', '('', ')'', '{'; '}', '-', '.', '^'입니다.
  • 명령줄 처리기를 통해 입력할 때 다음 문자들은 따옴표로 묶어야 합니다: '!'; '('; ')'; '{'; '}'; '-'; '.'; 및 '^'.
  • 이름은 문자 'SYS', 'IBM' 또는 'SQL'로 시작하면 안됩니다.
  • 'ADMINS', 'GUESTS', 'LOCAL', 'PUBLIC' 또는 'USERS'는 이름이 될 수 없습니다.
  • 구분된 권한 부여 ID는 소문자를 포함해서는 안됩니다.
bufferpool-name
버퍼 풀을 지정하는 ID
컬럼 이름
테이블 또는 뷰의 컬럼을 지정하는 규정되거나 규정되지 않은 이름. 규정자는 테이블 이름, 뷰 이름, 별칭 또는 상관 이름입니다.
component-name
보안 레벨 구성요소를 지정하는 ID
condition-name
조건을 지정하는 규정되거나 규정되지 않은 이름. SQL문의 규정되지 않은 조건 이름은 컨텍스트에 따라 내재적으로 규정됩니다. 조건이 모듈에서 정의되고 동일한 모듈 외부에서 사용되는 경우 module-name으로 규정되어야 합니다.
constraint-name
참조 상수, 기본 키 제한조건, 고유 제한조건 또는 테이블 검사 제한조건을 지정하는 ID
correlation-name
결과 테이블을 지정하는 ID
커서 이름
SQL 커서를 지정하는 ID. 호스트 호환성을 위해 이름에 하이픈 문자를 사용할 수 있습니다.
cursor-type-name
사용자 정의 커서 유형을 지정하는 규정되거나 규정되지 않은 이름. cursor-type-name의 규정되지 않은 양식은 SQL ID입니다. SQL문의 규정되지 않은 cursor-type-name은 컨텍스트에 따라 내재적으로 규정됩니다. 내재된 규정자는 cursor-type-name이 나타나는 컨텍스트로 판별되는 스키마 이름 또는 모듈 이름입니다. 규정된 양식은 schema-name과 그 뒤의 마침표와 SQL ID 또는 module-name(schema-name으로도 규정될 수 있음)과 그 뒤의 마침표와 SQL ID입니다. 커서 유형이 모듈에서 정의되고 동일한 모듈 외부에서 사용되는 경우 module-name으로 규정되어야 합니다.
cursor-variable-name
커서 유형의 전역 변수, 로컬 변수 또는 SQL 매개변수를 지정하는 규정되거나 규정되지 않은 이름. SQL문의 규정되지 않은 커서 변수 이름은 컨텍스트에 따라 내재적으로 규정됩니다.
data-source-name
데이터 소스를 지정하는 ID. 이 ID는 세 파트 원격 오브젝트 이름의 첫 번째 파트입니다.
db-partition-group-name
데이터베이스 파티션 그룹을 지정하는 ID
descriptor-name
콜론과 SQL 디스크립터 영역(SQLDA)을 지정하는 그 뒤의 호스트 ID. 호스트 ID에 대한 설명은 호스트 변수에 대한 참조를 참조하십시오. 디스크립터 이름에는 표시기 변수가 포함되지 않습니다.
distinct-type-name
구별 유형을 지정하는 규정되거나 규정되지 않은 이름. distinct-type-name의 규정되지 않은 양식은 SQL ID입니다. SQL문의 규정되지 않은 구별 유형 이름은 내재적으로 규정됩니다. 내재된 규정자는 distinct-type-name이 나타나는 컨텍스트로 판별되는 스키마 이름 또는 모듈 이름입니다. 규정된 형식은 마침표와 SQL ID가 뒤에 오는 스키마 이름이거나 마침표와 SQL ID가 뒤에 오는 모듈 이름(스키마 이름으로도 규정되는 이름)입니다. 구별 유형이 모듈에서 정의되고 동일한 모듈의 외부에서 사용되는 경우 module-name으로 규정되어야 합니다.
event-monitor-name
이벤트 모니터를 지정하는 ID
function-mapping-name
함수 맵핑을 지정하는 ID
function-name
함수를 지정하는 규정되거나 규정되지 않은 이름. function-name의 규정되지 않은 양식은 SQL ID입니다. SQL문의 규정되지 않은 함수 이름은 내재적으로 규정됩니다. 내재된 규정자는 함수가 나타나는 컨텍스트로 판별되는 스키마 이름입니다. 규정된 양식은 schema-name과 그 뒤의 마침표와 SQL ID 또는 module-name과 그 뒤의 마침표와 SQL ID가 될 수 있습니다. 함수가 모듈에서 발행되고 동일한 모듈의 외부에서 사용되는 경우 module-name으로 규정되어야 합니다.
global-variable-name
전역 변수를 지정하는 규정되거나 규정되지 않은 이름. global-variable-name의 규정되지 않은 양식은 SQL ID입니다. SQL문의 규정되지 않은 전역 변수 이름은 내재적으로 규정됩니다. 내재된 규정자는 global-variable-name이 나타나는 컨텍스트로 판별되는 스키마 이름 또는 모듈 이름입니다. 규정된 양식은 schema-name과 그 뒤의 마침표와 SQL ID 또는 module-name(schema-name으로도 규정될 수 있음)과 그 뒤의 마침표와 SQL ID입니다. 전역 변수가 모듈에서 정의되고 동일한 모듈 외부에서 사용되는 경우 module-name으로 규정되어야 합니다.
group-name
구조화된 유형에 정의된 변환 그룹을 지정하는 규정되지 않은 ID
host-variable
호스트 변수를 지정하는 토큰 시퀀스. 호스트 변수에는 호스트 변수에 대한 참조에 설명된 하나 이상의 호스트 ID가 포함됩니다.
index-name
인덱스 또는 인덱스 스펙을 지정하는 스키마 규정 이름
레이블
SQL 프로시저에서 레이블을 지정하는 ID
method-name
메소드를 지정하는 ID. 메소드의 스키마 컨텍스트는 메소드 주제 유형(또는 주제 유형의 종속 유형)의 스키마로 판별됩니다.
module-name
모듈을 지정하는 규정되거나 규정되지 않은 이름. SQL문의 규정되지 않은 module-name은 내재적으로 규정됩니다. 내재된 규정자는 module-name이 나타나는 컨텍스트로 판별되는 스키마 이름입니다. 규정된 양식은 마침표와 SQL ID가 뒤에 오는 schema-name입니다.
별칭
테이블 또는 뷰에 대한 페더레이티드 서버 참조를 지정하는 스키마 규정 이름
패키지 이름
패키지를 지정하는 규정되거나 규정되지 않은 이름
parameter-name
프로시저, 사용자 정의 함수(UDF), 메소드 또는 인덱스 확장에서 참조될 수 있는 매개변수를 지정하는 ID
partition-name
파티션된 테이블에서 데이터 파티션을 지정하는 ID
period-name
기간을 지정하는 ID. SYSTEM_TIME 및 BUSINESS_TIME은 지원되는 유일한 기간 이름입니다.
procedure-name
프로시저를 지정하는 규정되거나 규정되지 않은 이름. procedure-name의 규정되지 않은 양식은 SQL ID입니다. SQL문의 규정되지 않은 프로시저 이름은 내재적으로 규정됩니다. 내재된 규정자는 프로시저가 나타나는 컨텍스트로 판별되는 스키마 이름입니다. 규정된 양식은 schema-name과 그 뒤의 마침표와 SQL ID 또는 module-name과 그 뒤의 마침표와 SQL ID입니다. 프로시저가 모듈에서 정의되고 동일한 모듈 외부에서 사용되는 경우 module-name으로 규정되어야 합니다.
remote-authorization-name
데이터 소스 사용자를 지정하는 ID. 권한 부여 이름에 대한 규칙은 데이터 소스마다 다릅니다.
remote-function-name
데이터 소스 데이터베이스에 등록된 항목를 지정하는 이름
remote-object-name
데이터 소스 테이블 또는 뷰를 지정하고 테이블 또는 뷰가 있는 데이터 소스를 식별하는 세 파트 이름. 이 이름의 각 파트는 data-source-name, remote-schema-name, remote-table-name입니다.
remote-schema-name
데이터 소스 테이블 또는 뷰가 속하는 스키마를 지정하는 이름. 이 이름은 세 파트 원격 오브젝트 이름의 두 번째 파트입니다.
remote-table-name
데이터 소스에서 테이블 또는 뷰를 지정하는 이름. 이 이름은 세 파트 원격 오브젝트 이름의 세 번째 파트입니다.
remote-type-name
데이터 소스 데이터베이스가 지원하는 데이터 유형. 내장 유형에는 긴 형식을 사용하지 마십시오. 예를 들어, CHARACTER 대신 CHAR를 사용하십시오.
role-name
역할을 지정하는 ID
row-type-name
사용자 정의 행 유형을 지정하는 규정되거나 규정되지 않은 이름. row-type-name의 규정되지 않은 양식은 SQL ID입니다. SQL문의 규정되지 않은 row-type-name은 내재적으로 규정됩니다. 내재된 규정자는 row-type-name이 나타나는 컨텍스트로 판별되는 스키마 이름 또는 모듈 이름입니다. 규정된 양식은 schema-name과 그 뒤의 마침표와 SQL ID 또는 module-name(schema-name으로도 규정될 수 있음)과 그 뒤의 마침표와 SQL ID입니다. 행 유형이 모듈에서 정의되고 동일한 모듈 외부에서 사용되는 경우 module-name으로 규정되어야 합니다.
savepoint-name
세이브포인트를 지정하는 ID
스키마명
SQL 오브젝트에 대한 논리적 그룹화를 제공하는 ID. 오브젝트 이름의 규정자로 사용되는 스키마 이름은 다음과 같이 내재적으로 판별될 수 있습니다.
  • CURRENT SCHEMA 특수 레지스터 값에서
  • QUALIFIER 프리컴파일/바인드 옵션 값에서
  • CURRENT PATH 특수 레지스터를 사용하는 분석 알고리즘을 기반으로
  • 동일한 SQL문에서 다른 오브젝트의 스키마 이름을 기반으로

문제 방지를 위해 이름 SESSION은 선언된 전역 임시 테이블의 스키마(반드시 스키마 이름 SESSION을 사용해야 함)를 제외하고는 스키마로 사용하지 않는 것이 좋습니다.

security-label-name
보안 레이블을 지정하는 규정되거나 규정되지 않은 이름. SQL문의 규정되지 않은 보안 레이블 이름은 적용 가능한 security-policy-name(적용되는 경우)으로 내재적으로 규정됩니다. 내재적으로 적용 가능한 security-policy-name이 없으면 이름이 규정되어야 합니다.
security-policy-name
보안 정책을 지정하는 ID
sequence-name
시퀀스를 지정하는 ID
서버 이름
애플리케이션 서버를 지정하는 ID. 페더레이티드 시스템에서 서버 이름은 또한 데이터 소스의 로컬 이름을 지정합니다.
specific-name
특정 이름을 지정하는 규정되거나 규정되지 않은 이름. SQL문의 규정되지 않은 특정 이름은 컨텍스트에 따라 내재적으로 규정됩니다.
SQL-variable-name
SQL 프로시저 명령문에서 로컬 변수의 이름. SQL 변수는 호스트 변수 이름이 허용되는 다른 SQL문에서 사용할 수 있습니다. 이름은 SQL 변수를 선언한 복합 명령문의 레이블로 규정될 수 있습니다.
statement-name
준비된 SQL문을 지정하는 ID
storagegroup-name
스토리지 그룹을 지정하는 ID
supertype-name
유형의 하위 유형을 지정하는 규정되거나 규정되지 않은 이름. SQL문의 규정되지 않은 하위 유형 이름은 컨텍스트에 따라 내재적으로 규정됩니다.
테이블 이름
테이블을 지정하는 스키마 규정 이름
table-reference
테이블을 지정하는 규정되거나 규정되지 않은 이름. 공통 테이블 표현식에서 규정되지 않은 테이블 참조는 기본 스키마에 의해 내재적으로 규정됩니다.
tablespace-name
테이블스페이스를 지정하는 ID
trigger-name
트리거를 지정하는 스키마 규정 이름
type-mapping-name
데이터 유형 맵핑을 지정하는 ID
type-name
유형을 지정하는 규정되거나 규정되지 않은 이름. SQL문의 규정되지 않은 유형 이름은 컨텍스트에 따라 내재적으로 규정됩니다.
typed-table-name
유형이 지정된 테이블을 지정하는 스키마 규정 이름
typed-view-name
유형이 지정된 뷰를 지정하는 스키마 규정 이름
usage-list-name
사용 목록을 지정하는 스키마 규정 이름
user-defined-type-name
사용자 정의 데이터 유형을 지정하는 규정되거나 규정되지 않은 이름. user-defined-type-name의 규정되지 않은 양식은 SQL ID입니다. SQL문의 규정되지 않은 user-defined-type-name은 내재적으로 규정됩니다. 내재된 규정자는 user-defined-type-name이 나타나는 컨텍스트로 판별되는 스키마 이름 또는 모듈 이름입니다. 규정된 형식은 마침표와 SQL ID가 뒤에 오는 스키마 이름이거나 마침표와 SQL ID가 뒤에 오는 모듈 이름(스키마 이름으로도 규정되는 이름)입니다. 사용자 정의 데이터 유형이 모듈에서 정의되고 동일한 모듈 외부에서 사용되는 경우 module-name으로 규정되어야 합니다.
view-name
뷰를 지정하는 스키마 규정 이름
wrapper-name
랩퍼를 지정하는 ID
XML-schema-name
XML 스키마를 지정하는 규정되거나 규정되지 않은 이름
xsrobject-name
XML 스키마 저장소에서 오브젝트를 지정하는 규정되거나 규정되지 않은 이름

데이터베이스 오브젝트의 별명

별명은 SQL 오브젝트의 대체 이름으로 생각할 수 있습니다. 따라서 SQL 오브젝트는 SQL문에서 이름 또는 별명으로 찹조될 수 있습니다.

공용 별명은 이름을 스키마 이름으로 규정하지 않고 항상 참조될 수 있는 별명입니다. 공용 별명의 내재된 규정자는 SYSPUBLIC이며 명시적으로도 지정될 수 있습니다.

별명은 동의어라고도 합니다.

별명은 기반이 되는 오브젝트를 사용할 수 있을 때마다 사용할 수 있습니다. 별명은 오브젝트가 존재하지 않는 경우에도 작성될 수 있습니다. 그러나 참조하는 명령문이 컴파일될 때까지는 오브젝트가 존재해야 합니다. 별명은 별명 체인을 따라 순환적으로 또는 반복적으로 참조하지 않는 경우 다른 별명을 참조할 수 있습니다. 별명은 모듈, 별칭, 시퀀스, 테이블, 뷰 또는 동일한 데이터베이스 내부의 다른 별명만 참조할 수 있습니다. 별명 이름은 새 오브젝트 이름이 예상되는 경우(예: CREATE TABLE 또는 CREATE VIEW문) 사용할 수 없습니다. 예를 들어, 테이블 별명 이름 PERSONNEL이 작성된 경우, 다음 명령문(예: CREATE TABLE PERSONNEL)은... 오류를 리턴합니다.

별명으로 오브젝트를 참조하는 옵션은 고문 다이어그램에 명시적으로 표시되거나 SQL문의 설명에서 언급되지 않습니다.

지정된 오브젝트 유형의 규정되지 않은 새 별명은 시퀀스를 설명하며 해당 오브젝트 유형의 기존 오브젝트와 동일한 완전한 이름을 가질 수 없습니다. 예를 들어, 시퀀스 별칭 ORDERID는 시퀀스 KANDIL.ORDERID에 대해 KANDIL 스키마에서 정의될 수 없습니다.

SQL문에서 별명을 사용하는 효과는 텍스트 대체의 효과와 유사합니다. SQL문이 컴파일될 때까지 정의되어야 하는 별칭은 명령문 컴파일 시간에 규정된 오브젝트 이름으로 대체됩니다. 예를 들어, PBIRD.SALES가 DSPN014.DIST4_SALES_148의 별명인 경우 컴파일 시간에서
   SELECT * FROM PBIRD.SALES
다음과 같이 나타납니다.
   SELECT * FROM DSPN014.DIST4_SALES_148

권한 부여 ID 및 권한 부여 이름

권한 부여 ID는 데이터베이스 관리자와 애플리케이션 프로세스 또는 프로그램 준비 프로세스 간에 연결이 설정될 때 데이터베이스 관리자가 얻게 되는 문자열입니다. 이 ID는 특권 세트를 지정합니다. 사용자 또는 사용자 그룹을 지정할 수도 있지만 이 특성은 데이터베이스 관리자가 제어하지 않습니다.

권한 부여 ID는 데이터베이스 관리자가 다음을 제공하기 위해 사용합니다.
  • SQL문의 권한 부여 검사
  • QUALIFIER 사전 컴파일/바인드 옵션과 CURRENT SCHEMA 특수 레지스터의 기본값. 권한 부여 ID는 또한 기본 CURRENT PATH 특수 레지스터과 FUNCPATH 사전 컴파일/바인드 옵션에서 포함됩니다.
권한 부여 ID는 모든 SQL문에 적용됩니다. 정적 SQL문에 적용되는 권한 부여 ID는 프로그램 바인딩 중에 사용되는 권한 부여 ID입니다. 동적 SQL문에 적용되는 권한 부여 ID는 바인드 시간에 제공되는 DYNAMICRULES 옵션과 동적 SQL문을 실행하는 패키지에 대한 현재 런타임 환경을 기반으로 합니다.
  • 바인드 동작이 있는 패키지에서, 사용되는 권한 부여 ID는 패키지 소유자의 권한 부여 ID입니다.
  • 정의 동작이 있는 패키지에서, 사용되는 권한 부여 ID는 해당 루틴 정의자의 권한 부여 ID입니다.
  • 실행 동작이 있는 패키지에서, 사용되는 권한 부여 ID는 패키지를 실행하는 사용자의 현재 권한 부여 ID입니다.
  • 호출 동작이 있는 패키지에서, 사용되는 권한 부여 ID는 루틴이 호출될 때 현재 유효한 권한 부여 ID입니다. 이 ID는 런타임 권한 부여 ID입니다.
자세한 정보는 런타임 시 동적 SQL 특성을 참조하십시오.

SQL문에 지정된 권한 부여 이름과 명령문의 권한 부여 ID를 혼동해서는 안됩니다. 권한 부여 이름은 다양한 SQL문에서 사용되는 ID입니다. 권한 부여 이름은 CREATE SCHEMA문에서 스키마 소유자를 지정하는 데 사용됩니다. 권한 부여 이름은 GRANT 및 REVOKE문에서 권한 부여 또는 권한 취소 조작의 대상을 지정하는 데 사용됩니다. X에 특권을 부여하는 것은 X(또는 그룹 또는 역할 X의 멤버)가 결과적으로 해당 특권이 필요한 명령문의 권한 부여 ID가 됨을 의미합니다.

예:

  • SMITH가 사용자 ID이자 애플리케이션 프로세스와의 연결이 설정될 때 데이터베이스 관리자가 획득한 권한 부여 ID인 것으로 가정합니다. 다음 명령문은 대화식으로 실행됩니다.
       GRANT SELECT ON TDEPT TO KEENE
    SMITH는 명령문의 권한 부여 ID입니다. 따라서 동적 SQL문의 경우 CURRENT SCHEMA 특수 레지스터의 기본값은 SMITH이고 정적 SQL문의 경우 QUALIFIER 프리컴파일/바인드 옵션의 기본값이 SMITH입니다. 명령문을 실행할 수 있는 권한은 SMITH에 대해 검사되며 SMITH는 이름 지정 규칙 및 내재된 오브젝트 이름 규정에 설명된 규정 규칙을 기반으로 하는 table-name 내재된 규정자입니다.

    KEENE은 명령문에서 지정된 권한 부여 이름입니다. KEENE에는 SMITH.TDEPT에 대한 SELECT 특권이 부여됩니다.

  • SMITH가 관리 권한을 가지며 세션 중에 SET SCHEMA문이 실행되지 않는 다음 동적 SQL문의 권한 부여 ID인 것으로 가정합니다.
       DROP TABLE TDEPT
    SMITH.TDEPT 테이블을 제거합니다.
       DROP TABLE SMITH.TDEPT
    SMITH.TDEPT 테이블을 제거합니다.
       DROP TABLE KEENE.TDEPT
    KEENE.TDEPT 테이블을 제거합니다. KEENE.TDEPT와 SMITH.TDEPT는 다른 테이블입니다.
       CREATE SCHEMA PAYROLL AUTHORIZATION KEENE
    KEENE은 PAYROLL 스키마를 작성하는 명령문에 지정된 권한 부여 이름입니다. KEENE은 PAYROLL 스키마의 소유자이며 CREATEIN, ALTERIN, DROPIN 특권이 부여됩니다. 또한 이 특권을 다른 사람에게 부여할 수 있습니다.

런타임의 동적 SQL 특성

BIND 옵션 DYNAMICRULES는 동적 SQL문이 처리될 때 권한을 검사하는 데 사용되는 권한 부여 ID를 판별합니다. 또한 이 옵션은 규정되지 않은 오브젝트 참조에 사용되는 내재된 규정자, 특정 SQL문을 동적으로 호출할 수 있는지 여부와 같은 기타 동적 SQL 속성을 제어합니다.

권한 부여 ID 및 기타 동적 SQL 속성에 대한 값 세트를 동적 SQL문 동작이라고 합니다. 네 가지 가능한 동작은 실행, 바인드, 정의, 호출입니다. 다음 표에 나와 있는 것처럼 DYNAMICRULES BIND 옵션 값과 런타임 환경의 조합이 사용되는 동작을 판별합니다. 실행 동작을 나타내는 DYNAMICRULES RUN이 기본값입니다.

표 1. DYNAMICRULES 및 런타임 환경이 동적 SQL문 동작을 판별하는 방법
DYNAMICRULES 값 독립형 프로그램 환경의 동적 SQL문 동작 루틴 환경의 동적 SQL문 동작
BIND 바인드 동작 바인드 동작
실행 실행 동작 실행 동작
DEFINEBIND 바인드 동작 정의 동작
DEFINERUN 실행 동작 정의 동작
INVOKEBIND 바인드 동작 호출 동작
INVOKERUN 실행 동작 호출 동작
실행 동작
패키지를 실행하는 사용자의 권한 부여 ID(처음에 데이터베이스에 연결된 ID)는 동적 SQL문의 권한 부여 검사 값으로 사용됩니다. 이 권한 부여 ID는 동적 SQL문 내부에서 규정되지 않은 오브젝트 참조의 내재적 자격을 위한 초기값으로도 사용됩니다.
바인드 동작
런타임에 권한 부여와 자격을 위해 정적 SQL에 적용되는 모든 규칙이 사용됩니다. 패키지 소유자의 권한 부여 ID는 동적 SQL문의 권한 부여 검사를 위한 값으로 사용됩니다. 패키지 기본 규정자는 동적 SQL문 내부에서 규정되지 않은 오브젝트 참조의 내재적 자격에 사용됩니다.
정의 동작
정의 동작은 동적 SQL문이 루틴 컨텍스트 내부에서 실행되는 패키지에 있고 패키지가 DYNAMICRULES DEFINEBIND 또는 DYNAMICRULES DEFINERUN과 바인드된 경우에만 적용됩니다. 루틴 정의자(루틴의 패키지 바인더가 아닌)의 권한 부여 ID는 동적 SQL문의 권한 부여 검사를 위한 값으로 사용됩니다. 이 권한 부여 ID는 해당 루틴의 동적 SQL문 내부에서 규정되지 않은 오브젝트 참조의 내재적 자격에도 사용됩니다.
호출 동작
호출 동작은 동적 SQL문이 루틴 컨텍스트 내부에서 실행되는 패키지에 있고 패키지가 DYNAMICRULES INVOKEBIND 또는 DYNAMICRULES INVOKERUN과 바인드된 경우에만 적용됩니다. 루틴이 호출될 때 유효한 명령문 권한 부여 ID는 동적 SQL의 권한 부여 검사를 위한 값으로 사용됩니다. 이 권한 부여 ID는 해당 루틴의 동적 SQL문 내부에서 규정되지 않은 오브젝트 참조의 내재적 자격에도 사용됩니다. 이 내용은 다음 표에 요약되어 있습니다.
호출 환경 사용된 ID
정적 SQL 루틴을 호출하는 SQL이 가져온 패키지 OWNER의 내재적 또는 명시적 값
뷰 또는 트리거 정의에서 사용됨 뷰 또는 트리거의 정의자
바인드 동작 패키지의 동적 SQL 루틴을 호출하는 SQL이 가져온 패키지 OWNER의 내재적 또는 명시적 값
실행 동작 패키지의 동적 SQL 데이터베이스에 처음 연결하는 데 사용되는 ID
정의 동작 패키지의 동적 SQL 루틴을 호출하는 SQL이 가져온 패키지를 사용하는 루틴의 정의자
호출 동작 패키지의 동적 SQL 루틴을 호출하는 현재 권한 부여 ID
실행 동작이 적용되지 않는 경우 제한적 문자열
바인드, 정의 또는 호출 동작이 유효한 경우에는 동적 SQL문(GRANT, REVOKE, ALTER, CREATE, DROP, COMMENT, RENAME, SET INTEGRITY, SET EVENT MONITOR STATE) 또는 별칭을 참조하는 쿼리를 사용할 수 없습니다.
DYNAMICRULES 옵션 관련 고려사항
CURRENT SCHEMA 특수 레지스터는 바인드, 정의 또는 호출 동작 패키지에서 실행되는 동적 SQL문 내부에서 규정되지 않은 오브젝트 참조를 규정하는 데 사용할 수 없습니다. 이는 CURRENT SCHEMA 특수 레지스터를 변경하기 위해 SET CURRENT SCHEMA문을 실행한 후에도 해당됩니다. 레지스터 값은 변경되지만 사용되지는 않습니다.

단일 연결 중에 여러 패키지가 참조되는 경우, 해당 패키지로 준비된 모든 동적 SQL문은 패키지가 사용되는 환경과 해당 특정 패키지에 대해 DYNAMICRULES 옵션으로 지정되는 동작을 나타냅니다.

패키지가 바인드 동작을 나타내는 경우 패키지 바인더가 패키지 사용자가 받아서는 안되는 권한을 부여해서는 안됩니다. 동적 명령문은 패키지 소유자의 권한 부여 ID를 사용하기 때문입니다. 마찬가지로, 패키지가 정의 동작을 나타내는 경우 루틴 정의자가 패키지 사용자가 받아서는 안되는 권한을 부여해서는 안됩니다.

권한 부여 ID 및 명령문 준비

VALIDATE BIND 옵션이 바인드 시간에 지정되지 않은 경우 테이블과 뷰를 조작하는 데 필요한 특권이 바인드 시간에도 존재해야 합니다. 이러한 특권 또는 참조된 오브젝트가 존재하지 않고 SQLERROR NOPACKAGE 옵션이 유효하면 바인드 조작이 실패합니다. SQLERROR CONTINUE 옵션이 지정되면 바인드 조작이 성공하며 모든 오류 명령문에 플래그가 지정됩니다. 이러한 명령문을 실행하려고 시도하면 오류가 발생합니다.

VALIDATE RUN 옵션으로 패키지가 바인드되는 경우 모든 일반 바인드 처리는 완료되지만 애플리케이션에서 참조되는 테이블과 뷰를 사용하는 데 필요한 특권은 아직 존재하지 않아도 됩니다. 바인드 시간에 필수 특권이 존재하지 않으면 애플리케이션에서 명령문이 처음 실행될 때마다 증분 바인드 조작이 수행되며 명령문에 필요한 모든 특권이 존재해야 합니다. 필수 특권이 존재하지 않으면 명령문 실행이 실패합니다.

런타임의 권한 부여 검사는 패키지 소유자의 권한 부여 ID를 사용하여 수행됩니다.

컬럼 이름

컬럼 이름의 의미는 해당 컨텍스트에 따라 다릅니다. 컬럼 이름은 다음과 같은 용도로 사용될 수 있습니다.
  • CREATE TABLE문에서와 같이 컬럼의 이름을 선언합니다.
  • CREATE INDEX문에서와 같이 컬럼을 식별합니다.
  • 다음 컨텍스트에서와 같이 컬럼 값을 지정합니다.
    • 집계 함수에서 컬럼 이름은 함수가 적용되는 그룹 또는 중간 결과 테이블 내 컬럼의 모든 값을 지정합니다. 예를 들어, MAX(SALARY)는 MAX 함수를 그룹 내 SALARY 컬럼의 모든 값에 적용합니다.
    • GROUP BY 또는 ORDER BY 절의 경우 컬럼 이름은 절이 적용되는 중간 결과 테이블에서 모든 값을 지정합니다. 예를 들어, ORDER BY DEPT는 컬럼 DEPT의 값을 기준으로 중간 결과 테이블을 정렬합니다.
    • 표현식, 검색 조건 또는 스칼라 함수의 경우 컬럼 이름은 구문이 적용되는 각 행 또는 그룹에 대한 값을 지정합니다. 예를 들어, 검색 조건 CODE = 20이 일부 행에 적용되는 경우 컬럼 이름 CODE로 지정된 값은 해당 행에서 컬럼 CODE의 값입니다.
  • FROM절에서 table-referencecorrelation-clause처럼 일시적으로 컬럼의 이름을 바꿉니다.

규정된 컬럼 이름

컬럼의 규정자는 테이블, 뷰, 별칭, 별명 또는 상관 이름이 될 수 있습니다.

컬럼 이름이 규정될 수 있는지 여부는 해당 컨텍스트에 따라 다릅니다.
  • COMMENT ON문의 양식에 따라 단일 컬럼 이름을 규정해야 할 수 있습니다. 복수 컬럼 이름은 규정되어야 합니다.
  • 컬럼 이름이 컬럼의 값을 지정하는 경우 사용자가 원하는 대로 규정될 수 있습니다.
  • UPDATE문의 지정 절에서 사용자 선택에 따라 규정될 수 있습니다.
  • 다른 모든 컨텍스트에서는 컬럼 이름이 규정되어서는 안됩니다.

규정자가 선택적인 경우 두 가지 목적을 가질 수 있습니다. 모호성을 방지하기 위한 컬럼 이름 규정자상관 참조의 컬럼 이름 규정자아래에 설명되어 있습니다.

상관 이름

상관 이름은 쿼리의 FROM절과 UPDATE 또는 DELETE문의 첫 번째 절에서 정의될 수 있습니다. 예를 들어, 절 FROM X.MYTABLE Z는 Z를 X.MYTABLE의 상관 이름으로 설정합니다.
   FROM X.MYTABLE Z

X.MYTABLE의 상관 이름으로 Z가 정의된 경우, 해당 SELECT문에서 X.MYTABLE의 해당 인스턴스 컬럼에 대한 참조를 규정하려면 Z만 사용할 수 있습니다.

상관 이름은 정의된 컨텍스트 내의 테이블, 뷰, 별칭, 별명, 중첩된 테이블 표현식, 테이블 함수 또는 데이터 변경 테이블 참조와 연관됩니다. 따라서 다른 명령문의 다른 용도로 또는 동일한 명령문의 다른 절에 동일한 상관 이름이 정의될 수 있습니다.

규정자로서, 상관 이름은 모호성을 피하거나 상관 참조를 설정하기 위해 사용할 수 있습니다. 테이블 참조의 단축 이름으로만 사용될 수도 있습니다. 예에서 Z는 X.MYTABLE을 여러 번 입력하지 않아도 되도록 방지하기 위한 목적으로만 사용되었을 수 있습니다.

테이블, 뷰, 별칭 또는 별명 이름에 대해 상관 이름이 지정된 경우, 테이블, 뷰, 별칭 또는 별명의 해당 인스턴스 컬럼에 대한 규정된 참조는 테이블, 뷰, 별칭 또는 별명 이름이 아닌 상관 이름을 사용해야 합니다. 예를 들어, 다음 예에서 EMPLOYEE.PROJECT에 대한 참조는 올바르지 않습니다. EMPLOYEE에 대한 상관 이름이 지정되었기 때문입니다.

                                                                                          
   FROM EMPLOYEE E                                        
     WHERE EMPLOYEE.PROJECT='ABC'      * incorrect*             
대신 PROJECT에 대한 규정된 참조는 다음 예와 같이 상관 이름 E를 사용해야 합니다.
   FROM EMPLOYEE E
     WHERE E.PROJECT='ABC'
FROM절에서 지정된 이름은 노출되거나 또는 노출되지 않습니다. 상관 이름이 지정되지 않는 경우 테이블, 뷰, 별칭 또는 별명 이름이 FROM절에서 노출됩니다. 상관 이름은 항상 노출된 이름입니다. 예를 들어, 다음 FROM절의 경우 상관 이름이 EMPLOYEE에는 지정되고 DEPARTMENT에는 지정되지 않으므로 DEPARTMENT는 노출된 이름이지만 EMPLOYEE는 노출된 이름이 아닙니다.
   FROM EMPLOYEE E, DEPARTMENT

FROM절에 노출되는 테이블, 뷰, 별칭 또는 별명 이름은 해당 FROM절에 호출되는 다른 테이블 이름, 뷰 이름 또는 별칭이나 FROM절의 상관 이름과 동일할 수 있습니다. 이 경우 오류를 리턴하는 앰비규어스 컬럼 이름 참조가 나타날 수 있습니다(SQLSTATE 42702).

다음 목록에 표시되는 처음 두 FROM절은 올바른 절입니다. 각 절에 노출된 EMPLOYEE에 대한 참조가 여러 개 포함되기 때문입니다.
  1. FROM절이 있는 경우:
       FROM EMPLOYEE E1, EMPLOYEE

    EMPLOYEE.PROJECT와 같은 규정된 참조가 FROM절에서 EMPLOYEE의 두 번째 인스턴스의 컬럼을 나타냅니다. EMPLOYEE의 첫 번째 인스턴스에 대한 규정된 참조는 상관 이름 E1(E1.PROJECT)을 사용해야 합니다.

  2. FROM절이 있는 경우:
       FROM EMPLOYEE, EMPLOYEE E2

    EMPLOYEE.PROJECT와 같은 규정된 참조가 FROM절에서 EMPLOYEE의 첫 번째 인스턴스의 컬럼을 나타냅니다. EMPLOYEE의 두 번째 인스턴스에 대한 규정된 참조는 상관 이름 E2(E2.PROJECT)를 사용해야 합니다.

  3. FROM절이 있는 경우:
       FROM EMPLOYEE, EMPLOYEE

    이 절에 포함된 두 가지 노출된 테이블 이름(EMPLOYEE 및 EMPLOYEE)은 동일합니다. 이는 허용되지만 특정 컬럼 이름에 대한 참조가 모호해집니다(SQLSTATE 42702).

  4. 다음 명령문의 경우:
       SELECT *                                               
         FROM EMPLOYEE E1, EMPLOYEE E2             * incorrect *
         WHERE EMPLOYEE.PROJECT = 'ABC'

    규정된 참조 EMPLOYEE.PROJECT는 올바르지 않습니다. FROM절의 EMPLOYEE 인스턴스가 둘 다 상관 이름을 갖기 때문입니다. 대신 PROJECT에 대한 참조는 둘 중 하나의 상관 이름(E1.PROJECT 또는 E2.PROJECT)으로 규정되어야 합니다.

  5. FROM절이 있는 경우:
       FROM EMPLOYEE, X.EMPLOYEE

    두 번째 EMPLOYEE 인스턴스에서 컬럼에 대한 참조는 X.EMPLOYEE (X.EMPLOYEE.PROJECT)를 사용해야 합니다. X가 동적 SQL의 CURRENT SCHEMA 특수 레지스터 값 또는 정적 SQL의 QUALIFIER 프리컴파일/바인드 옵션인 경우에는 컬럼이 참조될 수 없습니다. 이러한 참조는 모호해지기 때문입니다.

FROM절에서 상관 이름을 사용하는 경우 컬럼 이름 목록을 지정하는 옵션이 결과 테이블의 컬럼과 연관될 수도 있습니다. 상관 이름의 경우처럼, 나열된 이 컬럼 이름은 쿼리 전체에서 컬럼에 대한 참조에 사용되어야 하는 컬럼의 노출된 이름이 됩니다. 컬럼 이름 목록이 지정된 경우 기본 테이블의 컬럼 이름이 노출되지 않습니다.

FROM절이 있는 경우:

   FROM DEPARTMENT D (NUM,NAME,MGR,ANUM,LOC)

D.NUM과 같은 규정된 참조는 테이블에 정의된 DEPARTMENT 테이블의 첫 번째 컬럼을 DEPTNO로 나타냅니다. 컬럼 이름 DEPTNO는 비노출 컬럼 이름이므로 이 FROM절을 사용한 D.DEPTNO에 대한 참조는 올바르지 않습니다.

모호성을 방지하기 위한 컬럼 이름 규정자

함수, GROUP BY 절, ORDER BY 절, 표현식 또는 검색 조건 컨텍스트에서 컬럼 이름은 테이블, 뷰, 별칭, 중첩된 테이블 표현식 또는 테이블 함수의 컬럼 값을 참조합니다. 컬럼을 포함할 수 있는 테이블, 뷰, 별칭, 중첩된 테이블 표현식, 테이블 함수를 컨텍스트의 오브젝트 테이블이라고 합니다. 두 개 이상의 오브젝트 테이블에 이름이 같은 컬럼이 포함될 수 있습니다. 컬럼 이름을 규정하는 한 가지 이유는 컬럼의 테이블을 지정하는 것입니다. 컬럼 이름의 규정자는 또한 SQL 프로시저에서 SQL문에 사용되는 SQL 변수 이름과 컬럼 이름을 구분하는 데 유용합니다.

중첩된 테이블 표현식 또는 테이블 함수는 FROM절에서 앞에 있는 table-references를 오브젝트 테이블로 간주합니다. 뒤에 나오는 table-references는 오브젝트 테이블로 간주되지 않습니다.

테이블 지정자

특정 오브젝트 테이블을 지정하는 규정자를 테이블 지정자라고 합니다. 오브젝트 테이블을 식별하는 절은 또한 테이블의 테이블 지정자를 설정합니다. 예를 들어, SELECT절에 있는 표현식의 오브젝트 테이블은 뒤에 오는 FROM절에서 이름이 지정됩니다.
   SELECT CORZ.COLA, OWNY.MYTABLE.COLA
     FROM OWNX.MYTABLE CORZ, OWNY.MYTABLE
FROM절의 테이블 지정자는 다음과 같이 설정됩니다.
  • 테이블, 뷰, 별칭, 별명, 중첩된 테이블 표현식 또는 테이블 함수 뒤에 오는 이름은 상관 이름이자 테이블 지정자입니다. 따라서 CORZ는 테이블 지정자입니다. CORZ는 선택 목록에서 첫 번째 컬럼 이름을 규정하는 데 사용됩니다.
  • 노출된 테이블, 뷰 이름, 별칭 또는 별명은 테이블 지정자입니다. 따라서 OWNY.MYTABLE은 테이블 지정자입니다. OWNY.MYTABLE은 선택 목록에서 두 번째 컬럼 이름을 규정하는 데 사용됩니다.

테이블 지정자의 노출된 테이블 이름으로 컬럼을 규정하는 경우, 노출된 테이블 이름의 규정되거나 규정되지 않은 양식을 사용할 수 있습니다. 규정된 양식을 사용하는 경우 규정자는 노출된 테이블 이름의 기본 규정자와 동일해야 합니다.

예를 들어, 현재 스키마가 CORPDATA인 것으로 가정합니다.
SELECT CORPDATA.EMPLOYEE.WORKDEPT FROM EMPLOYEE
FROM절에서 참조되는 EMPLOYEE 테이블이 WORKDEPT 컬럼의 규정자와 일치하는 CORPDATA.EMPLOYEE로 완전히 규정되므로 유효합니다.
SELECT EMPLOYEE.WORKDEPT, REGEMP.WORKDEPT
  FROM CORPDATA.EMPLOYEE, REGION.EMPLOYEE REGEMP
첫 번째 선택 목록 컬럼이 FROM절에 있는 규정되지 않은 노출된 테이블 지정자 CORPDATA.EMPLOYEE를 참조하고 두 번째 선택 목록 컬럼이 역시 FROM절에 있는 테이블 오브젝트 REGION.EMPLOYEE의 상관 이름 REGEMP를 참조하므로 유효합니다.
이제 현재 스키마가 REGION인 것으로 가정합니다.
SELECT CORPDATA.EMPLOYEE.WORKDEPT FROM EMPLOYEE
FROM절에서 참조되는 EMPLOYEE 테이블이 REGION.EMPLOYEE를 완전히 규정하고 WORKDEPT 컬럼의 규정자가 CORPDATA.EMPLOYEE 테이블을 나타내므로 유효하지 않습니다.

각 테이블 지정자가 특정 FROM절에서 고유해야 컬럼에 대한 모호한 참조 가능성을 방지할 수 있습니다.

정의되지 않거나 모호한 참조 방지

컬럼 이름이 컬럼의 값을 참조하는 경우 정확히 하나의 오브젝트 테이블에 해당 이름을 사용하는 컬럼이 포함되어야 합니다. 다음 상황은 오류로 간주됩니다.
  • 지정된 이름의 컬럼을 포함하는 오브젝트 테이블이 없습니다. 참조는 정의되지 않습니다.
  • 컬럼 이름은 테이블 지정자로 규정되지만 지정된 테이블에는 지정된 이름의 컬럼이 포함되지 않습니다. 이 경우에도 참조는 정의되지 않습니다.
  • 이름이 규정되지 않고 여러 테이블에 해당 이름을 사용하는 컬럼이 포함됩니다. 참조가 모호합니다.
  • 컬럼 이름이 테이블 지정자로 규정되지만 지정된 테이블이 FROM절에서 고유하지 않으며 지정된 테이블의 두 어커런스에 모두 컬럼이 포함됩니다. 참조가 모호합니다.
  • 컬럼 이름은 TABLE 키워드가 앞에 오지 않는 중첩된 테이블 표현식이나 완전 외부 조인 또는 전체 외부 조인의 오른쪽 피연산자인 중첩된 테이블 표현식 또는 테이블 함수에 있으며 컬럼 이름은 중첩된 테이블 표현식의 fullselect 내부에 있는 table-reference의 컬럼을 참조하지 않습니다. 참조는 정의되지 않습니다.

컬럼 이름을 고유하게 정의된 테이블 지정자로 규정하여 모호한 참조는 피해야 합니다. 컬럼이 이름이 다른 여러 오브젝트 테이블에 포함되는 경우에는 테이블 이름이 지정자로 사용될 수 있습니다. 상관 이름 뒤의 컬럼 이름 목록을 사용하여 오브젝트 테이블 중 하나의 컬럼에 고유한 이름을 부여함으로써 테이블 지정자를 사용하지 않고 모호한 참조를 피할 수도 있습니다.

테이블 지정자의 노출된 테이블 이름으로 컬럼을 규정하는 경우, 노출된 테이블 이름의 규정되거나 규정되지 않은 양식을 사용할 수 있습니다. 그러나 테이블 이름, 뷰 이름 또는 별칭과 테이블 지정자를 완전히 규정한 후에는 사용된 규정자와 사용된 테이블이 동일해야 합니다.
  1. 명령문의 권한 부여 ID가 CORPDATA인 경우:
       SELECT CORPDATA.EMPLOYEE.WORKDEPT
         FROM EMPLOYEE

    위 명령문은 유효한 명령문입니다.

  2. 명령문의 권한 부여 ID가 REGION인 경우:
       SELECT CORPDATA.EMPLOYEE.WORKDEPT
         FROM EMPLOYEE                           * incorrect *

    EMPLOYEE가 테이블 REGION.EMPLOYEE를 나타내지만 WORKDEPT의 규정자가 다른 테이블, CORPDATA.EMPLOYEE를 나타내므로 유효하지 않습니다.

상관 참조의 컬럼 이름 규정자

fullselect는 다양한 SQL문의 구성요소로 사용될 수 있는 쿼리 양식입니다. 명령문의 검색 조건 내에서 사용되는 fullselect를 서브쿼리라고 합니다. 단일 값을 명령문 내부의 표현식으로 검색하는 데 사용되는 fullselect를 스칼라 fullselect 또는 스칼라 서브쿼리라고 합니다. 쿼리의 FROM절에서 사용되는 fullselect를 중첩된 테이블 표현식이라고 합니다. 검색 조건의 서브쿼리, 스칼라 서브쿼리, 중첩된 테이블 표현식을 이 주제의 나머지 부분 전체에서 서브쿼리라고 합니다.

서브쿼리에는 자체 서브쿼리가 포함될 수 있으며 이러한 서브쿼리에도 서브쿼리가 포함될 수 있습니다. 따라서 SQL문에는 서브쿼리 계층 구조가 포함될 수 있습니다. 서브쿼리를 포함하는 계층 구조의 해당 요소는 서브쿼리에 포함된 서브쿼리보다 높은 레벨에 있을 수 있습니다.

계층 구조의 모든 요소에는 하나 이상의 테이블 지정자가 포함됩니다. 서브쿼리는 계층 구조에서 해당 레벨에 식별된 테이블의 컬럼뿐 아니라 계층 구조에서 계층 구조의 최상위 레벨까지 이전에 식별된 테이블의 컬럼 또한 참조할 수 있습니다. 상위 레벨에서 식별된 테이블의 컬럼에 대한 참조를 상관 참조라고 합니다.

기존 SQL 표준과의 호환성을 위해, 규정된 컬럼 이름과 규정되지 않은 컬럼 이름 모두 상관 참조로 허용됩니다. 그러나 서브쿼리에서 사용되는 모든 컬럼 참조를 규정하는 것이 좋습니다. 그렇지 않으면 동일한 컬럼 이름으로 인해 원하지 않는 결과가 나타날 수 있습니다. 예를 들어, 계층 구조의 테이블이 상관 참조와 동일한 컬럼 이름을 포함하도록 변경되고 명령문이 다시 준비되면 변경된 테이블에 참조가 적용됩니다.

서브쿼리의 컬럼 이름이 규정된 경우, 규정된 컬럼 이름이 나타나는 서브쿼리와 동일한 서브쿼리부터 계층 구조의 상위 레벨까지 계속하여 규정자와 일치하는 테이블 지정자가 나타날 때까지 계층 구조의 각 레벨을 검색합니다. 해당 테이블 지정자를 찾으면 테이블에 지정된 컬럼이 포함되어 있는 것입니다. 테이블이 컬럼 이름을 포함하는 레벨보다 상위 레벨에 있는 경우에는 테이블 지정자가 있는 레벨에 대한 상관 참조입니다. 중첩된 테이블 표현식의 fullselect의 상위 계층 구조를 검색하려면 중첩된 테이블 표현식 앞에 선택적 TABLE 키워드가 와야 합니다.

서브쿼리의 컬럼 이름이 규정되지 않은 경우, 컬럼 이름이 나타나는 서브쿼리와 동일한 서브쿼리부터 계층 구조의 상위 레벨까지 계속하여 일치하는 컬럼 이름이 나타날 때까지 계층 구조의 각 레벨에서 참조되는 테이블을 검색합니다. 컬럼이 컬럼 이름을 포함하는 레벨보다 상위 레벨의 테이블에 있는 경우에는 컬럼을 포함하는 테이블이 있는 레벨에 대한 상관 참조입니다. 컬럼 이름이 특정 레벨의 여러 테이블에 있는 경우에는 참조가 모호하여 오류로 간주됩니다.

이 경우, 다음 예에서 사용된 T는 컬럼 C가 들어 있는 테이블 지정자를 참조합니다. 컬럼 이름 T.C(여기서, T는 내재적 또는 명시적 규정자를 나타냄)는 이러한 조건을 충족시킬 경우에만 상관 참조가 됩니다.
  • T.C가 서브쿼리 표현식에서 사용됩니다.
  • T가 서브쿼리의 FROM절에서 사용되는 테이블을 지정하지 않습니다.
  • T가 서브쿼리를 포함하는 계층 구조의 상위 레벨에서 사용되는 테이블을 지정합니다.

동일한 테이블, 뷰 또는 별칭이 많은 레벨에서 식별될 수 있으므로 고유 상관 이름이 테이블 지정자로 권장됩니다. T가 여러 레벨의 테이블을 지정하는 데 사용되는 경우 (T는 테이블 이름 자체이거나 중복 상관 이름임) T.C는 T가 사용되고 T.C를 포함하는 서브쿼리를 가장 직접적으로 포함하는 레벨을 나타냅니다. 상위 레벨에 대한 상관이 필요한 경우 고유 상관 이름을 사용해야 합니다.

상관 참조 T.C는 두 개 검색 조건(서브쿼리의 조건 1과 상위 레벨의 조건 2)이 적용되는 T 그룹의 행에서 C 값을 식별합니다. 조건 2가 WHERE절에서 사용되는 경우 조건 2가 적용되는 각 행에 대해 서브쿼리가 평가됩니다. 조건 2가 HAVING절에서 사용되는 경우에는 조건 2가 적용되는 각 그룹에 대해 서브쿼리가 평가됩니다.

예를 들어, 다음 명령문에서 상관 참조 X.WORKDEPT(마지막 행에 있음)는 첫 번째 FROM절의 레벨에 있는 EMPLOYEE 테이블의 WORKDEPT 값을 참조합니다. 해당 절은 X를 EMPLOYEE의 상관 이름으로 설정합니다. 명령문은 해당 부서의 평균 급여보다 급여가 적은 직원을 나열합니다.
   SELECT EMPNO, LASTNAME, WORKDEPT
     FROM EMPLOYEE X
     WHERE SALARY < (SELECT AVG(SALARY)
                       FROM EMPLOYEE
                       WHERE WORKDEPT = X.WORKDEPT)
다음 예는 THIS를 상관 이름으로 사용합니다. 명령문은 직원이 없는 부서의 행을 삭제합니다.
   DELETE FROM DEPARTMENT THIS
      WHERE NOT EXISTS(SELECT *
                         FROM EMPLOYEE
                         WHERE WORKDEPT = THIS.DEPTNO)

변수에 대한 참조

SQL문의 변수는 SQL문이 실행될 때 변경될 수 있는 값을 지정합니다. SQL문에서 사용되는 변수는 다음과 같은 여러 가지 유형이 있습니다.

호스트 변수
호스트 변수는 호스트 언어의 명령문으로 정의됩니다. 호스트 변수를 참조하는 방법에 대한 자세한 정보는 호스트 변수에 대한 참조를 참조하십시오.
전이 변수
전이 변수는 트리거에서 정의되며 컬럼의 이전 값 또는 새 값을 참조합니다. 전이 변수를 참조하는 방법에 대한 자세한 정보는 CREATE TRIGGER문을 참조하십시오.
SQL 변수
SQL 변수는 SQL 함수, SQL 메소드, SQL 프로시저, 트리거 또는 동적 SQL문에서 SQL 복합 명령문으로 정의됩니다. SQL 변수에 대한 자세한 정보는 SQL 매개변수, SQL 변수 및 전역 변수에 대한 참조를 참조하십시오.
전역 변수
전역 변수는 CREATE VARIABLE문으로 정의됩니다. 전역 변수에 대한 자세한 정보는 CREATE VARIABLESQL 매개변수, SQL 변수 및 전역 변수에 대한 참조를 참조하십시오.
모듈 변수
모듈 변수는 ADD VARIABLE 또는 PUBLISH VARIABLE 조작을 사용하는 ALTER MODULE문으로 정의됩니다. 모듈 변수에 대한 자세한 정보는 ALTER MODULE문을 참조하십시오.
SQL 매개변수
SQL 매개변수는 CREATE FUNCTION, CREATE METHOD 또는 CREATE PROCEDURE문으로 정의됩니다. SQL 매개변수에 대한 자세한 정보는 SQL 매개변수, SQL 변수 및 전역 변수에 대한 참조를 참조하십시오.
매개변수 표시문자
매개변수 표시문자는 명령문이 정적 SQL문인 경우 호스트 변수가 지정되는 동적 SQL문에서 지정됩니다. SQL 디스크립터 또는 매갭녀수 바인딩은 동적 SQL문 처리 중에 값과 매개변수 표시문자를 연관시키는 데 사용됩니다. 매개변수 표시문자에 대한 자세한 정보는 매개변수 표시문자를 참조하십시오.

호스트 변수에 대한 참조

호스트 변수는 다음 중 하나입니다.
  • 호스트 언어의 변수(예: C 변수, C++ 변수, COBOL 데이터 항목, FORTRAN 변수 또는 Java™ 변수)
또는
  • SQL문에서 참조되는 SQL 확장을 사용하여 선언된 변수에서 SQL 프리컴파일러에서

생성된 호스트 언어 구문. 호스트 변수는 호스트 언어에서 명령문으로 직접 정의되거나 SQL 확장을 사용하여 간접적으로 정의됩니다.

SQL문의 호스트 변수는 호스트 변수 선언 규칙에 따라 프로그램에서 선언된 호스트 변수를 식별해야 합니다.

SQL문에 사용되는 모든 호스트 변수는 REXX를 제외한 모든 호스트 언어로 SQL DECLARE 섹션에 선언되어야 합니다. SQL DECLARE 섹션 내부에서 선언된 변수와 이름이 같은 SQL DECLARE 섹션 외부에서는 변수가 선언되지 않을 수 있습니다. SQL DECLARE 섹션은 BEGIN DECLARE SECTION으로 시작되고 END DECLARE SECTION으로 끝납니다.

메타 변수 host-variable은 구문 다이어그램에서 사용되는 것처럼 호스트 변수에 대한 참조를 보여줍니다. SET 변수 명령문이나 FETCH, SELECT INTO 또는 VALUES INTO문의 INTO절의 대상 변수인 host-variable은 행 또는 표현식의 컬럼 값이 지정되는 호스트 변수를 식별합니다. 다른 모든 컨텍스트에서는 호스트 변수가 애플리케이션 프로그램에서 데이터베이스 관리자로 전달될 값을 지정합니다.

메타 변수 host-variable은 일반적으로 다음과 같이 확장될 수 있습니다.

Read syntax diagramSkip visual syntax diagram:host-identifierINDICATOR:host-identifier

host-identifier는 소스 프로그램에서 선언되어야 합니다. 두 번째 호스트 ID로 지정된 변수의 데이터 유형은 작은 정수여야 합니다.

첫 번째 호스트 ID는 기본 변수를 지정합니다. 연산에 따라 데이터베이스 관리자에 값을 제공하거나 데이터베이스 관리자에서 값이 제공됩니다. 입력 호스트 변수는 런타임 애플리케이션 코드 페이지에서 값을 제공합니다. 출력 호스트 변수에는 필요한 경우 데이터가 출력 애플리케이션 변수에 복사될 때 런타임 애플리케이션 코드 페이지로 변환되는 값이 제공됩니다. 지정된 호스트 변수는 동일한 프로그램에서 입력 및 출력 변수 역할을 모두 할 수 있습니다.

두 번째 호스트 ID는 해당 표시기 변수를 지정합니다. 표시기 변수는 일반 표시기 변수와 확장 표시기 변수의 두 가지 양식으로 나타납니다.

일반 표시기 변수의 용도는 다음과 같습니다.
  • 널(NULL)이 아닌 값을 지정합니다. 영(0) 또는 표시기 변수의 양수 값은 연관된 첫 번째 호스트 IDRK 이 호스트 변수 참조 값을 제공하는 것으로 지정합니다.
  • 널(NULL) 값을 지정합니다. 표시기 변수의 음수 값은 널(NULL) 값을 지정합니다.
  • 출력에서 dft_sqlmathwarn 데이터베이스 구성 매개변수가 로 설정되는 경우(또는 정적 SQL문의 바인딩 중에 로 설정된 경우) 숫자 변환 오류(예: 0으로 나누기 또는 오버플로우)가 발생했음을 표시합니다. 표시기 변수의 값이 -2인 경우 숫자 자르기 또는 친숙한 산술 경고로 인한 널(NULL) 결과를 나타냅니다.
  • 출력 시 잘린 문자열의 원래 길이를 보고합니다(값의 소스가 큰 오브젝트 유형이 아닌 경우).
  • 출력 시 호스트 변수에 대한 지정에서 시간이 잘리면 시간의 초 부분을 보고합니다.
확장 표시기 변수는 호스트 변수 입력으로 제한됩니다. 확장 표시기 변수의 용도는 다음과 같습니다.
  • 널(NULL)이 아닌 값을 지정합니다. 영(0) 또는 양수 값은 연관된 첫 번째 호스트 IDRK 이 호스트 변수 참조 값을 제공하는 것으로 지정합니다.
  • 널(NULL) 값을 지정합니다. -1, -2, -3, -4 또는 -6 값은 널(NULL) 값을 지정합니다.
  • 기본값을 지정합니다. -5 값은 이 호스트 변수의 대상 컬럼이 기본값으로 설정되는 것으로 지정합니다.
  • 지정되지 않은 값을 지정합니다. -7 값은 이 호스트 변수의 대상 컬럼이 명령문에서 지정되지 않은 것처럼 처리되는 것으로 지정합니다.

확장 표시기 변수는 요청된 경우에만 사용할 수 있으며 모든 표시기 변수는 일반 표시기 변수입니다. 일반 표시기 값과 비교하여, 확장 표시기 변수는 널(NULL) 값 및 널이 아닌 값을 사용할 수 있는 위치에 대한 추가 제한사항이 없습니다. 호스트 구조와 표시기 구조의 확장 표시기 변수 값을 사용하는 데는 제한사항이 없습니다. 확장 표시기 변수값 default 및 unassigned가 허용되는 위치에 대한 제한사항은 해당 값이 호스트 애플리케이션에 나타나는 방식에 관계 없이 균등하게 적용됩니다. 기본 및 지정되지 않은 확장 표시기 변수 값은 제한적인 지정된 용도에만 나타날 수 있습니다. 이러한 값은 단일 호스트 변수 또는 명시적으로 캐스트되는(컬럼에 지정되는)호스트 변수만을 포함하는 표현식에 나타날 수 있습니다. 출력 표시기 변수 값은 확장 표시기 변수가 아닙니다.

확장 표시기 변수를 사용할 수 있는 경우에는 영(0) 또는 양의 표시기 변수값 사용에 대한 제한사항이 없습니다. 그러나 -1에서 -7까지의 범위를 벗어나는 음수 표시기 변수값은 입력이 아니어야 합니다(SQLSTATE 22010). 사용 가능한 경우, default 및 unassigned 확장 표시기 변수값은 지원되지 않는 컨텍스트에 나타나서는 안됩니다(SQLSTATE 22539).

확장 표시기 변수를 사용할 수 있는 경우, 확장 표시기 값이 음수인 호스트 변수의 경우에는 지정 및 비교의 데이터 유형 유효성 검증을 위한 규칙이 엄격하게 적용되지 않습니다. 널(NULL) 값, 기본값 또는 지정되지 않은 값을 갖는 호스트 변수에는 데이터 유형 지정 및 비교 유효성 검증 규칙이 강제 실행되지 않습니다.

예를 들어, 삽입 또는 갱신 값을 지정하기 위해 :HV1:HV2가 사용되고 HV2가 음수인 경우 지정된 값은 널(NULL) 값입니다. HV2가 음수가 아니면 지정된 값은 HV1의 값입니다.

마찬가지로, :HV1:HV2가 FETCH, SELECT INTO 또는 VALUES INTO문의 INTO절에 지정되고 리턴된 값이 널(NULL)이면 HV1이 변경되지 않고 HV2가 음수 값으로 설정됩니다. dft_sqlmathwarn이(가) 예로 설정된 상태에서(또는 정적 SQL문의 바인딩 중) 데이터베이스가 구성된 경우, HV2는 -2가 될 수 있습니다. HV2가 -2인 경우, HV1의 숫자 유형으로의 변환 오류 또는 HV1의 값을 판별하는 데 사용되는 연산식 평가 오류로 인해 HV1의 값이 리턴될 수 없습니다. 리턴된 값이 널(NULL)이 아닌 경우 해당 값은 HV1에 지정되고 HV2는 영(0)으로 설정됩니다. 단, HV1에 지정하기 위해 비LOB 문자열 자르기가 필요한 경우는 예외이며 이 경우 HV2가 문자열의 원래 길이로 설정됩니다. 지정 시 시간의 초 파트를 잘라야 하는 경우에는 HV2가 초를 나타내는 숫자로 설정됩니다.

두 번째 호스트 ID가 생략되면 host-variable가 표시기 값을 갖지 않습니다. 호스트 변수 참조 :HV1로 지정된 값은 항상 HV1의 값이므로 변수에 널(NULL) 값이 지정될 수 없습니다. 따라서 해당 컬럼에 널(NULL) 값이 포함될 수 있는 경우에는 INTO절에서 이 양식을 사용해서는 안됩니다. 이 양식을 사용하고 컬럼에 NULL 값이 포함되는 경우 데이터베이스 관리자가 런타임에 오류를 생성합니다.

호스트 변수를 참조하는 SQL문은 해당 호스트 변수의 선언 범위 내에 있어야 합니다. 커서의 SELECT문에서 참조되는 호스트 변수의 경우 해당 규칙은 DECLARE CURSOR문이 아닌 OPEN문에 적용됩니다.

PROJECT 테이블을 사용하여 호스트 변수 PNAME (VARCHAR(26))을 프로젝트 이름(PROJNAME)으로, 호스트 변수 STAFF (DECIMAL(5,2))를 평균 직원 수준(PRSTAFF)으로, 호스트 변수 MAJPROJ (CHAR(6))을 프로젝트(PROJNO) 'IF1000'의 기본 프로젝트(MAJPROJ)로 설정합니다. 컬럼 PRSTAFF 및 MAJPROJ에는 널(NULL) 값이 포함될 수 있으므로 표시기 변수 STAFF_IND (SMALLINT) 및 MAJPROJ_IND (SMALLINT)를 제공합니다.
  SELECT PROJNAME, PRSTAFF, MAJPROJ
    INTO :PNAME, :STAFF :STAFF_IND, :MAJPROJ :MAJPROJ_IND
    FROM PROJECT
    WHERE PROJNO = 'IF1000'
MBCS 고려사항: 호스트 변수 이름에서 멀티바이트 문자를 사용할 수 있는지 여부는 호스트 언어에 따라 다릅니다.

동적 SQL의 값

동적 SQL문에서는 호스트 변수 대신 매개변수 표시문자가 사용됩니다. 매개변수 표시문자는 동적 SQL문에서 애플리케이션이 값을 제공하는 위치(즉, 명령문 문자열이 정적 SQL문인 경우 호스트 변수가 있는 위치)를 나타냅니다. 다음 예는 호스트 변수를 사용하는 정적 SQL문을 보여줍니다.
   INSERT INTO DEPARTMENT
     VALUES (:HV_DEPTNO, :HV_DEPTNAME, :HV_MGRNO, :HV_ADMRDEPT)
다음 예는 unnamed 매개변수 표시문자를 사용하는 동적 SQL문을 보여줍니다.
   INSERT INTO DEPARTMENT VALUES (?, ?, ?, ?)
이 예는 이름 지정된 매개변수 표시문자를 사용하는 동적 SQL문을 보여줍니다.
   INSERT INTO DEPARTMENT 
     VALUES (:DEPTNO, :DEPTNAME, :MGRNO, :ADMRDEPT)
이름 지정된 매개변수 표시문자를 사용하여 동적 명령문의 가독성을 향상시킬 수 있습니다. 이름 지정된 매개변수 표시문자가 호스트 변수처럼 보이더라도 이름 지정된 매개변수 표시문자에 연관된 값이 없으므로 명령문이 실행될 때 매개변수 표시문자에 값이 제공되어야 합니다. 이름 지정된 매개변수 마커를 사용하는 INSERT문이 준비되고 DYNSTMT의 준비된 명령문 이름이 지정된 경우 다음 명령문을 사용하여 매개변수 마커에 대한 값이 제공될 수 있습니다.
   EXECUTE DYNSTMT 
     USING :HV_DEPTNO, :HV_DEPTNAME :HV_MGRNO, :HV_ADMRDEPT
이름 지정되지 않은 매개변수 마커를 사용하는 INSERT문이 준비되고 DYNSTMT의 준비된 명령문 이름이 지정된 경우 이와 동일한 EXECUTE문이 사용될 수 있습니다.

LOB 변수에 대한 참조

일반 BLOB, CLOB및 DBCLOB 변수, LOB 로케이터 변수 ( LOB 로케이터 변수에 대한 참조참조) 및 LOB 파일 참조 변수 ( LOB 파일 참조 변수에 대한 참조참조) 는 모든 호스트 언어로 정의할 수 있습니다. LOB가 허용되는 경우, 구문 다이어그램의 용어 host-variable은 일반 호스트 변수, 로케이터 변수 또는 파일 참조 변수를 나타낼 수 있습니다. 원시(native) 데이터 유형이 아니므로 SQL 확장이 사용되며 프리컴파일러는 각 변수를 나타내는 데 필요한 호스트 언어 구문을 생성합니다. REXX의 경우, LOB은 문자열에 맵핑됩니다.

때때로 큰 오브젝트 유형 값 전체를 보유할 수 있을 정도로 큰 변수를 정의할 수 있습니다. 이러한 경우 또한 서버로부터의 지연된 데이터 전송으로 얻을 수 있는 성능상의 이점이 없는 경우에는 로케이터가 필요하지 않습니다. 그러나 특정 시점에 임시 스토리지에 전체 대형 오브젝트(LOB)를 저장하는 데 또는 성능상의 이점으로 인해 호스트 언어 또는 공백 제한사항이 적용되는 경우가 많으므로 로케이터를 통해 대형 오브젝트(LOB)가 참조되거나 한 번에 대형 오브젝트(LOB)의 한 부분만 포함하는 호스트 변수에서 해당 오브젝트의 일부가 갱신되거나 선택될 수 있습니다.

LOB 로케이터 변수에 대한 참조

로케이터 변수는 애플리케이션 서버에서 LOB 값을 나타내는 로케이터를 포함하는 호스트 변수입니다.

SQL문의 로케이터 변수는 로케이터 변수 선언 규칙에 따라 프로그램에서 선언된 로케이터 변수를 식별해야 합니다. 이는 항상 SQL문을 통해 간접적으로 수행됩니다.

로케이터 변수라는 용어는 구문 다이어그램에서 사용되는 것처럼 로케이터 변수에 대한 참조를 보여줍니다. 메타 데이터 locator-variablehost-variable과 같이 host-identifier를 포함하도록 확장될 수 있습니다.

다른 모든 호스트 변수와 같이, 대형 오브젝트(LOB) 로케이터 변수가 연관된 표시기 변수를 가질 수 있습니다. 대형 오브젝트(LOB) 로케이터 호스트 변수의 표시기 변수는 다른 데이터 유형의 표시기 변수와 같은 방식으로 작동합니다. 데이터베이스에서 널(NULL) 값이 리턴되면 표시기 변수가 설정되고 로케이터 호스트 변수가 변경되지 않습니다. 이는 로케이터가 널(NULL) 값을 가리킬 수 없음을 의미합니다.

현재 값을 나타내지 않는 locator-variable이 참조되는 경우 오류가 발생합니다(SQLSTATE 0F001).

트랜잭션 커미트 또는 트랜잭션 종료 시 해당 트랜잭션에서 얻은 모든 로케이터가 해제됩니다.

LOB 파일 참조 변수에 대한 참조

BLOB, CLOB, DBCLOB 파일 참조 변수는 LOB에 대한 직접 파일 입력 및 출력에 사용되며 모든 호스트 언어에서 정의될 수 있습니다. 원시(native) 데이터 유형이 아니므로 SQL 확장이 사용되며 프리컴파일러는 각 변수를 나타내는 데 필요한 호스트 언어 구문을 생성합니다. REXX의 경우, LOB은 문자열에 맵핑됩니다.

LOB 로케이터가 LOB 바이트를 포함한다기 보다는 나타내는 것처럼 파일 참조 변수는 파일을 포함한다기 보다는 파일을 나타냅니다. 데이터베이스 쿼리, 갱신, 삽입은 단일 컬럼 값을 저장하거나 검색하기 위한 파일 참조 변수를 사용할 수 있습니다.

파일 참조 변수는 다음 특성을 갖습니다.
데이터 유형
BLOB, CLOB 또는 DBCLOB. 이 특성은 변수가 선언될 때 지정됩니다.
방향
런타임에 애플리케이션 프로그램으로 지정되어야 합니다(파일 옵션 값의 일부로). 방향은 다음 중 하나입니다.
  • 입력(EXECUTE문, OPEN문, UPDATE문, INSERT문 또는 DELETE문에서 데이터 소스로 사용됨)
  • 출력(FETCH문 또는 SELECT INTO문에서 데이터 대상으로 사용됨)
파일 이름
런타임에 애플리케이션 프로그램으로 지정되어야 합니다. 다음 중 하나입니다.
  • 파일의 전체 경로 이름(권장됨)
  • 상대적 파일 이름. 상대적 파일 이름이 제공되는 경우, 클라이언트 프로세스의 현재 경로에 추가됩니다.

애플리케이션 내부에서는 하나의 파일 참조 변수에서만 파일이 참조되어야 합니다.

파일 이름 길이
런타임에 애플리케이션 프로그램으로 지정되어야 합니다. 파일 이름의 길이(바이트)입니다.
파일 옵션
애플리케이션은 여러 옵션 중 하나를 파일 참조 변수에 지정해야 해야 해당 변수를 사용할 수 있습니다. 옵션은 파일 참조 변수 구조에서 필드의 INTEGER 값으로 설정됩니다. 각 파일 참조 변수에 대해 다음 값 중 하나가 지정되어야 합니다.
  • 입력(클라이언트에서 서버로)
    SQL_FILE_READ
    열기, 읽기 및 닫기가 가능한 일반 파일입니다. 옵션은 COBOL의 경우 SQL-FILE-READ, FORTRAN의 경우 sql_file_read, REXX의 경우 READ입니다.
  • 출력(서버에서 클라이언트로)
    SQL_FILE_CREATE
    새 파일을 작성합니다. 파일이 이미 있으면 오류가 리턴됩니다. 옵션은 COBOL의 경우 SQL-FILE-CREATE, FORTRAN의 경우 sql_file_create, REXX의 경우 CREATE입니다.
    SQL_FILE_OVERWRITE(겹쳐쓰기)
    지정된 이름을 사용하는 기존 파일이 있으면 파일을 겹쳐쓰고 그렇지 않으면 새 파일이 작성됩니다. 옵션은 COBOL의 경우 SQL-FILE-OVERWRITE, FORTRAN의 경우 sql_file_overwrite, REXX의 경우 OVERWRITE입니다.
    SQL_FILE_APPEND
    지정된 이름을 사용하는 기존 파일이 있으면 출력이 추가되고 그렇지 않으면 새 파일이 작성됩니다. 옵션은 COBOL의 경우 SQL-FILE-APPEND, FORTRAN의 경우 sql_file_append, REXX의 경우 APPEND입니다.
데이터 길이
입력 시에는 사용되지 않습니다. 출력 시, 구현은 데이터 길이를 파일에 기록된 새 데이터의 길이로 설정합니다. 길이는 바이트 단위입니다.

다른 모든 호스트 변수와 같이, 파일 참조 변수가 연관된 표시기 변수를 가질 수 있습니다.

출력 파일 참조 변수 예(C)

선언 섹션이 다음과 같이 코딩되는 경우:
   EXEC SQL BEGIN DECLARE SECTION
      SQL TYPE IS CLOB_FILE  hv_text_file;
      char  hv_patent_title[64];
   EXEC SQL END DECLARE SECTION
선행 처리에 따른 결과는 다음과 같습니다.
   EXEC SQL BEGIN DECLARE SECTION
      /* SQL TYPE IS CLOB_FILE  hv_text_file; */
      struct {
          unsigned long  name_length; //  File Name Length
          unsigned long  data_length; //  Data Length
          unsigned long  file_options; // File Options
          char           name[255];   // File Name
      } hv_text_file;
      char  hv_patent_title[64];
   EXEC SQL END DECLARE SECTION
그런 후 다음 코드를 사용하여 데이터베이스의 CLOB 컬럼에서 :hv_text_file로 참조된 새 파일로 선택할 수 있습니다.
   strcpy(hv_text_file.name, "/u/gainer/papers/sigmod.94");
   hv_text_file.name_length = strlen("/u/gainer/papers/sigmod.94");
   hv_text_file.file_options = SQL_FILE_CREATE;

   EXEC SQL SELECT content INTO :hv_text_file from papers
        WHERE TITLE = 'The Relational Theory behind Juggling';

입력 파일 참조 변수 예(C)

이전과 동일한 선언 섹션이 제공되는 경우 다음 코드를 사용하여 :hv_text_file로 참조된 일반 파일의 데이터를 CLOB 컬럼에 삽입할 수 있습니다.
   strcpy(hv_text_file.name, "/u/gainer/patents/chips.13");
   hv_text_file.name_length = strlen("/u/gainer/patents/chips.13");
   hv_text_file.file_options = SQL_FILE_READ:
   strcpy(:hv_patent_title, "A Method for Pipelining Chip Consumption");

   EXEC SQL INSERT INTO patents( title, text )
            VALUES(:hv_patent_title, :hv_text_file);

구조화된 유형 호스트 변수에 대한 참조

구조화 유형 변수는 FORTRAN, REXX 및 Java를 제외한 모든 호스트 언어로 정의될 수 있습니다. 원시(native) 데이터 유형이 아니므로 SQL 확장이 사용되며 프리컴파일러는 각 변수를 나타내는 데 필요한 호스트 언어 구문을 생성합니다.

다른 모든 호스트 변수와 같이, 구조화된 유형 변수가 연관된 표시기 변수를 가질 수 있습니다. 구조화된 유형 호스트 변수의 표시기 변수는 다른 데이터 유형의 표시기 변수와 같은 방식으로 작동합니다. 데이터베이스에서 널(NULL) 값이 리턴되면 표시기 변수가 설정되고 구조화된 유형 호스트 변수가 변경되지 않습니다.

구조화된 유형의 실제 호스트 변수는 내장 데이터 유형으로 정의됩니다. 구조화된 유형과 연관된 내장 데이터 유형은 다음과 같이 지정해야 합니다.
  • 프리컴파일 명령의 지정된 TRANSFORM GROUP 옵션으로 정의된 것처럼 구조화된 유형에 대한 FROM SQL 변환 함수의 결과에서
  • 프리컴파일 명령의 지정된 TRANSFORM GROUP 옵션으로 정의된 것처럼 구조화된 유형에 대한 TO SQL 변환 함수의 매개변수로

호스트 변수 대신 매개변수 표시문자를 사용하는 경우 SQLDA에 적절한 매개변수 유형 특성이 지정되어야 합니다. 이 경우 SQLDA에 SQLVAR 구조의 이중 세트가 필요하며 2차 SQLVAR의 SQLDATATYPE_NAME 필드를 구조화된 유형의 스키마 및 유형 이름으로 채워야 합니다. SQLDA 구조에서 스키마가 생략되면 오류가 발생합니다(SQLSTATE 07002).

호스트 변수 hv_polyhv_point(내장 유형 BLOB(1048576)을 사용하는 POLYGON 유형)를 C 프로그램으로 정의합니다.
   EXEC SQL BEGIN DECLARE SECTION;
         static SQL
            TYPE IS POLYGON AS BLOB(1M)
            hv_poly, hv_point;
   EXEC SQL END DECLARE SECTION;

SQL 경로

SQL 경로는 스키마 이름의 순서 지정된 목록입니다. 데이터베이스 관리자는 SQL 경로를 사용하여 CREATE, DROP, COMMENT, GRANT 또는 REVOKE문의 기본 오브젝트와 다른 컨텍스트에 나타나는 규정되지 않은 데이터 유형 이름(내장 유형과 구별 유형 둘 다), 전역 변수 이름, 모듈 이름, 함수 이름, 프로시저 이름의 스키마 이름을 분석합니다. 세부사항은 규정되지 않은 오브젝트 이름의 자격을 참조하십시오.

예를 들어, SQL 경로가 SYSIBM인 경우입니다. SYSFUN, SYSPROC, SYSIBMADM, SMITH, XGRAPHICS2 및 규정되지 않은 구별 유형 이름 MYTYPE이 지정되면 데이터베이스 관리 프로그램은 스키마 SYSIBM에서 첫 번째로, 그 다음은 SYSFUN, SYSPROC, SYSIBMADM, SMITH, XGRAPHICS2 순으로 MYTYPE을 찾습니다.

사용된 SQL 경로는 다음과 같이 SQL문에 따라 다릅니다.
  • 정적 SQL문의 경우(CALL 변수 명령문 제외)의 경우 사용된 SQL 경로는 포함 패키지, 프로시저, 함수, 트리거 또는 뷰가 작성될 때 지정된 SQL 경로입니다.
  • 동적 SQL문의 경우(또한 CALL 변수 명령문의 경우) SQL 경로는 CURRENT PATH 특수 레지스터의 값입니다. CURRENT PATH는 SET PATH문으로 설정될 수 있습니다.
SQL 경로가 명시적으로 지정되지 않은 경우, SQL 경로는 명령문의 권한 부여 ID가 뒤에 오는 시스템 경로입니다.

규정되지 않은 오브젝트 이름의 자격

규정되지 않은 오브젝트 이름은 내재적으로 규정됩니다. 이름을 규정하는 규칙은 이름이 식별하는 오브젝트 유형에 따라 다릅니다.

규정되지 않은 별명, 인덱스, 패키지, 시퀀스, 테이블, 트리거, 뷰 이름

규정되지 않은 별명, 인덱스, 패키지, 시퀀스, 테이블, 트리거, 뷰 이름은 기본 스키마에 의해 내재적으로 규정됩니다.

정적 SQL문의 경우 기본 스키마는 포함 함수, 패키지, 프로시저 또는 트리거가 작성될 때 지정된 기본 스키마입니다.

동적 SQL문의 경우 기본 스키마는 애플리케이션 프로세스에 대해 지정된 기본 스키마입니다. 기본 스키마는 SET SCHEMA문을 사용하여 애플리케이션 프로세스에 대해 지정될 수 있습니다. 기본 스키마가 명시적으로 지정되지 않은 경우 기본 스키마는 명령문의 권한 부여 ID입니다.

규정되지 않은 사용자 정의 유형, 함수, 프로시저, 특정, 전역 변수 및 모듈 이름

데이터 유형(내장 유형 및 구별 유형 둘 다), 전역 변수, 모듈, 함수, 프로시저, 특정 이름의 자격은 규정되지 않는 이름이 나타나는 SQL문에 따라 다릅니다.
  • 규정되지 않은 이름이 CREATE, ALTER, COMMENT, DROP, GRANT 또는 REVOKE문의 기본 오브젝트인 경우, 이름은 규정되지 않은 테이블 이름을 규정하는 것과 동일한 규칙을 사용하여 내재적으로 규정됩니다 ( 규정되지 않은 별명, 인덱스, 패키지, 시퀀스, 테이블, 트리거 및 뷰 이름참조). ALTER MODULE문의 ADD, COMMENT, DROP 또는 PUBLISH 조작의 기본 오브젝트는 규정자 없이 지정되어야 합니다.
  • 참조 컨텍스트가 모듈 내에 있는 경우, 데이터베이스 관리자는 일치를 찾기 위해 오브젝트 유형에 대한 적절한 분석을 적용하여 오브젝트 모듈을 검색합니다. 일치를 찾지 못하면 다음 글머리 기호에 지정된 대로 검색이 계속 진행됩니다.
  • 그렇지 않으면 내재적 스키마 이름이 다음과 같이 판별됩니다.
    • 구별 유형 이름의 경우, 데이터베이스 관리자는 SQL 경로를 검색하고 데이터 유형이 스키마에 존재하도록 SQL 경로에서 첫 번째 스키마를 선택합니다.
    • 전역 변수의 경우, 데이터베이스 관리자는 SQL 경로를 검색하고 전역 변수가 스키마에 존재하도록 SQL 경로에서 첫 번째 스키마를 선택합니다.
    • 프로시저 이름의 경우, 데이터베이스 관리자는 프로시저 결정과 함께 SQL 경로를 사용합니다.
    • 함수 이름의 경우, 데이터베이스 관리자는 함수 결정과 함께 SQL 경로를 사용합니다.
    • 타 소스 기반(sourced) 함수에 지정된 특정 이름은 CREATE FUNCTION(Sourced)을 참조하십시오.

새 SYSIBM 함수가 규정되지 않은 사용자 정의 함수(UDF)를 동일한 이름으로 겹쳐씀

기존 사용자 정의 함수(UDF) 또는 사용자 정의 프로시저는 새 내장 함수 또는 SQL 관리 루틴과 이름 및 서명이 같을 수 있습니다. 이러한 경우, 동적 SQL문에서 해당 함수 또는 루틴에 대한 규정되지 않은 참조는 사용자 정의 함수(UDF) 또는 루틴 대신 내장 함수 또는 SQL 관리 루틴을 실행합니다.

기본 SQL 경로에는 USER 특수 레지스터 값인 스키마 이름 앞에 SYSIBM, SYSFUN, SYSPROC, SYSIBMADM 스키마가 포함됩니다. 이러한 시스템 스키마는 SET PATH문 또는 FUNCPATH 바인드 옵션으로 명시적으로 설정되는 경우 SQL 경로에도 포함됩니다. 함수 결정 및 프로시저 결정 과정에서 SYSIBM, SYSFUN, SYSPROC, SYSIBMADM 스키마의 내장 함수와 SQL 관리 루틴은 사용자 정의 함수(UDF)와 사용자 정의 프로시저 앞에 나타납니다.

이 변경사항은 패키지의 정적 SQL 또는 뷰, 트리거, SQL 함수와 같은 SQL 오브젝트에 영향을 주지 않습니다. 이러한 경우 사용자 정의 함수(UDF) 또는 프로시저는 패키지의 명시적 바인드 또는 SQL 오브젝트 삭제(drop) 및 작성까지 계속 실행됩니다.

동일한 이름을 사용하는 새 SYSIBM 함수 대신 규정되지 않은 사용자 정의 루틴을 실행하려면 사용자 정의 루틴 이름을 바꾸고 실행하기 전에 이름을 규정합니다. 또는 SQL 경로에서 사용자 정의 루틴이 있는 스키마를 내장 함수 및 SQL 관리 루틴이 있는 스키마 앞에 배치합니다. 그러나 SLQ 경로에서 스키마를 승격시키면 시스템 스키마를 먼저 고려하므로 모든 내장 함수와 SQL 관리 루틴에 대한 분석 시간이 증가합니다.

규정된 오브젝트 이름 분석

모듈에서 정의되고 해당 모듈 외부에서 사용 가능한 오브젝트는 해당 모듈 이름으로 규정되어야 합니다. 모듈은 내재적으로 규정될 수도 있는 스키마 오브젝트이므로 발행된 모듈 오브젝트는 규정되지 않은 모듈 이름 또는 스키마 규정 모듈 이름을 사용하여 규정될 수 있습니다. 규정되지 않은 모듈 이름을 사용하는 경우 모듈 오브젝트에 대한 참조는 모듈에 포함되지 않는 스키마 규정 오브젝트와 동일하게 나타납니다. 복합 SQL문과 같은 특정 범위 내에서 두 파트 ID는 다음과 같을 수도 있습니다.
  • 테이블 이름으로 규정되는 컬럼 이름
  • 변수 이름으로 규정되는 행 필드 이름
  • 레이블로 규정되는 변수 이름
  • 루틴 이름으로 규정되는 루틴 매개변수 이름
이러한 오브젝트는 스키마 오브젝트 또는 모듈 오브젝트를 고려하기 전에 해당 범위 내에서 분석됩니다. 다음 프로세스는 스키마 오브젝트 또는 모듈 오브젝트가 될 수 있는 두 파트를 갖는 오브젝트를 분석하는 데 사용됩니다.
  • 참조 컨텍스트가 모듈 내에 있고 규정자가 모듈 이름과 일치하는 경우 데이터베이스 관리자는 오브젝트의 유형에 적합한 분석을 적용하여 발행 및 미발행된 모듈 오브젝트에서 일치를 찾음으로써 모듈에서 오브젝트를 검색합니다. 일치를 찾지 못하면 다음 글머리 기호에 지정된 대로 검색이 계속 진행됩니다.
  • 규정자가 스키마 이름인 것으로 가정하고 스키마가 존재하는 경우 스키마의 오브젝트를 분석합니다.
  • 규정자가 기존 스키마가 아니거나 스키마에서 규정자에 일치하는 오브젝트를 찾을 수 없고 규정자가 컨텍스트 모듈 이름에 일치하지 않은 경우에는 SQL 경로에서 스키마의 규정자에 일치하는 첫 번째 모듈을 검색합니다. 일치하는 모듈에 대해 권한이 부여되면 발행된 모듈 오브젝트만 고려하여 해당 모듈의 오브젝트로 분석하십시오.
  • SQL 경로에서 모듈로서 규정자를 찾을 수 없으며 규정자가 컨텍스트 모듈 이름에 일치하지 않은 경우에는 규정자에 일치하는 모듈 공용 동의어를 확인하십시오. 발견되는 경우, 발행된 모듈 오브젝트만 고려하여 모듈 공용 동의어에서 식별된 모듈의 오브젝트를 분석하십시오.

예약된 패키지 이름

특정 패키지 이름 세트가 시스템 사용을 위해 명시적으로 예약되었습니다. 이러한 이름을 시스템에서 사용하지 못하도록 방지하려면 애플리케이션에서 이러한 패키지 이름을 사용하지 않는 것이 좋습니다.

예약되어 있는 패키지 이름 세트가 다음 기준 중 하나를 충족합니다.
  • 패키지 스키마가 예약된 스키마입니다.
  • 패키지 스키마는 NULLID이고 패키지 이름이 예약된 패키지 이름과 일치하거나 예약된 패키지 이름 접두어와 일치하는 접두어가 있습니다.
다음 패키지 이름은 NULLID 스키마 내에서 예약되어 있습니다.
  • AGGDISC
  • PRINTSG
  • TUPLEWRT
다음 패키지 이름 접두부는 NULLID 스키마 내에 예약되어 있습니다.
  • AOT
  • ATS
  • CADM
  • CLI
  • DB2
  • POLY
  • REVA
  • SPIM
  • SPUT
  • SQL
  • SYS
  • TOOL