SELECT INTO명령문
SELECT INTO문은 최대 하나의 행으로 구성되는 결과 테이블을 생성하며 변수를 호스트하도록 해당 행에 값을 지정합니다.
테이블이 비어 있는 경우 명령문은 +100을 SQLCODE에 지정하고 '02000'을 SQLSTATE에 지정하며 호스트 변수에는 값을 지정하지 않습니다. 둘 이상의 행이 검색 조건을 충족하면, 명령문 처리가 종료되며 오류가 발생합니다(SQLSTATE 21000).
호출
이 명령문은 애플리케이션 프로그램에만 임베드될 수 있습니다. 동적으로 준비될 수 없는 실행문입니다.
권한 부여
- 테이블, 뷰 또는 별칭에 대한 SELECT 특권
- 테이블, 뷰 또는 별칭에 대한 CONTROL 특권
- DATAACCESS 권한
- 모듈에 정의되지 않은 전역 변수에 대한 WRITE 특권
- 모듈에 정의되지 않은 전역 변수의 모듈에 대한 EXECUTE 특권
GROUP 특권에 정적 SELECT INTO문이 있는지 확인하지 않습니다.
SELECT INTO문의 대상이 별칭인 경우, 명령문이 데이터 소스에서 실행될 때까지 데이터 소스의 오브젝트에 대한 특권은 고려되지 않습니다. 이때 데이터 소스를 연결하는 데 사용된 권한 부여 ID에 데이터 소스의 오브젝트에 대한 조작에 필요한 특권이 있어야 합니다. 명령문의 권한 부여 ID는 데이터 소스의 다른 권한 부여 ID에 맵핑될 수 있습니다.
구문
.-,-------------------------. V | >>-select-clause--INTO------| assignment-target |---+-----------> >--from-clause--+--------------+--+-----------------+-----------> '-where-clause-' '-group-by-clause-' >--+---------------+--+-----------------+-----------------------> '-having-clause-' '-order-by-clause-' >--+---------------------------------+--------------------------> '-+---------------+--fetch-clause-' '-offset-clause-' .-FOR READ ONLY-----------------------. >--●--+-------------------------------------+--●----------------> '-FOR UPDATE--+---------------------+-' | .-,-----------. | | V | | '-OF----column-name-+-' >--+------------------+--●------------------------------------->< '-isolation-clause-'
assignment-target >>-+-global-variable-name-------------------+------------------>< +-host-variable-name---------------------+ +-SQL-parameter-name---------------------+ +-SQL-variable-name----------------------+ +-transition-variable-name---------------+ +-array-variable-name--[--array-index--]-+ '-field-reference------------------------'
설명
select-clause, from-clause, where-clause, group-by-clause, having-clause, order-by-clause, offset-clause, fetch-clause 및 isolation-clause에 대한 설명은 subselect의 내용을 참조하십시오.
- INTO assignment-target
- 출력 값 지정을 위해 하나 이상의 대상을 식별합니다.
결과 행의 첫 번째 값이 목록의 첫 번째 대상에 지정되며, 두 번째 값은 두 번째 대상에 지정되는 방식입니다. assignment-target에 대한 각 지정은 목록을 통한 시퀀스로 작성됩니다. 지정에서 오류가 발생하면 assignment-target에 지정된 값이 없습니다.
모든 assignment-target의 데이터 유형이 행 유형이 아닌 경우, assignment-targets가 결과 컬럼 값의 수보다 작으면 값 'W'가 SQLCA의 SQLWARN3 필드로 지정됩니다.
assignment-target의 데이터 유형이 행 유형인 경우, 정확히 하나의 assignment-target이 지정되어야 하며(SQLSTATE 428HR), 컬럼의 수는 행 유형의 필드 수와 일치해야 하고, 페치된 행의 컬럼의 데이터 유형이 행 유형의 해당 필드에 지정 가능해야 합니다(SQLSTATE 42821).
assignment-target의 데이터 유형이 배열 요소인 경우, 정확히 하나의 assignment-target이 지정되어야 합니다.
- global-variable-name
- 지정 대상인 전역 변수를 식별합니다.
- host-variable-name
- 지정 대상인 호스트 변수를 식별합니다. LOB 출력 값의 경우, 대상은 일부 호스트 변수(충분히 큰 경우), LOB 로케이터 변수 또는 LOB 파일 참조 변수일 수 있습니다.
- SQL-parameter-name
- 지정 대상인 매개변수를 식별합니다.
- SQL-variable-name
- 지정 대상인 SQL 변수를 식별합니다. SQL를 사용하기 전에 변수가 선언되어야 합니다.
- transition-variable-name
- 전이 행에서 갱신될 컬럼을 식별합니다. transition-variable-name은 트리거의 주제 테이블에서 컬럼을 식별하며, 선택적으로 새 값을 식별하는 상관 이름으로 규정됩니다.
- array-variable-name
- 은 배열 유형의
SQL 변수, SQL 매개변수 또는 전역 변수를 식별합니다.
- [array-index]
- 지정 대상인 배열의 요소를 지정하는 표현식입니다. 서수 배열의 경우, array-index 표현식은 INTEGER(SQLSTATE 428H1)에 지정 가능해야 하며 널(NULL) 값일 수 없습니다. 값은 1과 배열에 대해 정의된 카디널리티 최대값 사이여야 합니다(SQLSTATE 2202E). 연관 배열의 경우, array-index 표현식은 연관 배열의 인덱스 데이터 유형에 지정 가능해야 하며(SQLSTATE 428H1) 널(NULL) 값일 수 없습니다.
- field-reference
- 지정 대상인 행 유형 값에 있는 필드를 식별합니다. field-reference는 규정자가 필드가 정의된 행 값을 식별하는 규정된 field-name으로 지정되어야 합니다.
- FOR READ ONLY 또는 FOR UPDATE
- 선택된 행에 대한 의도된 사용을 표시합니다. 기본값은 FOR
READ ONLY입니다.
- FOR READ ONLY
- 선택된 행이 갱신을 위해 잠겨 있지 않도록 지정합니다.
- FOR UPDATE
- FOR UPDATE절을 포함하는 커서의 select문에 대한 잠금 완료와 마찬가지로, 기본 테이블에서 선택된 행은 트랜잭션에서 나중에 행 갱신을 용이하게 하기 위해 잠금 설정됩니다.
- SELECT INTO문의 결과 테이블이 읽기 전용인 경우 FOR UPDATE는
지정되지 않아야 합니다(SQLSTATE 42829).
column-name 값이 나열되면 이 컬럼은 갱신 가능해야 합니다(SQLSTATE 42829).
해당 나열 컬럼이 다큐멘터리 효과만을 가지며 다른 컬럼 수정으로부터의 연속 검색된 갱신 명령문을 제한하지 않습니다.
규칙
- 복합 SQL(컴파일된) 명령문을 사용하여 정의되지 않은 트리거, 복합 SQL(컴파일된) 명령문을 사용하여 정의되지 않은 함수, 메소드 또는 복합 SQL(인라인된)문 내에 전역 변수를 지정할 수 없습니다(SQLSTATE 428GX).
참고
- 구문 대체: SQL 쿼리를 사용한 일관성을 위해,
- FOR FETCH ONLY는 FOR READ ONLY 대신 지정할 수 있습니다.
예
- 예 1: 이 C 예에서는 EMP 테이블의 최대 급여를 호스트 변수
MAXSALARY로 입력합니다.
EXEC SQL SELECT MAX(SALARY) INTO :MAXSALARY FROM EMP; - 예 2: 이 C 예에서는 직원 528671의 행(EMP 테이블에서)을
호스트 변수로 입력합니다.
EXEC SQL SELECT * INTO :h1, :h2, :h3, :h4 FROM EMP WHERE EMPNO = '528671'; - 예 3: 이 SQLJ 예에서는 직원 528671의 행(EMP 테이블에서)을
호스트 변수로 입력합니다. 해당 행은 검색된 갱신을 사용하여 나중에 갱신되며
쿼리가 실행될 때 잠김 상태가 되어야 합니다.
#sql { SELECT * INTO :FIRSTNAME, :LASTNAME, :EMPNO, :SALARY FROM EMP WHERE EMPNO = '528671' FOR UPDATE }; - 예 4: 이 C 예에서는 EMP 테이블의 최대 급여를 전역 변수
GV_MAXSALARY로 입력합니다.
EXEC SQL SELECT MAX(SALARY) INTO GV_MAXSALARY FROM EMP;
