EXECUTE명령문

EXECUTE문은 준비된 SQL문을 실행합니다.

호출

이 명령문은 애플리케이션 프로그램에서만 임베디드될 수 있습니다. 동적으로 준비할 수 없는 실행문입니다.

권한 부여

USING 절에서 표현식으로 사용되거나 array-index의 표현식에서 사용된 각 전역 변수의 경우, 명령문의 권한 부여 ID가 보유한 특권에 다음 권한 중 최소 하나를 포함해야 합니다.
  • 모듈에 정의되지 않은 전역 변수에 대한 READ 특권
  • 모듈에 정의되지 않은 전역 변수의 모듈에 대한 EXECUTE 특권
  • 모듈에 정의된 전역 변수의 모듈을 포함하고 있는 스키마에 대한 EXECUTEIN 특권
  • 모듈에 정의된 전역 변수의 모듈을 포함하고 있는 스키마에 대한 스키마 DATAACCESS 권한
assignment-target으로 사용된 각 전역 변수의 경우, 명령문의 권한 부여 ID가 보유한 특권에 다음 권한 중 최소 하나를 포함해야 합니다.
  • 모듈에 정의되지 않은 전역 변수에 대한 WRITE 특권
  • 모듈에 정의되지 않은 전역 변수의 모듈에 대한 EXECUTE 특권
  • 모듈에 정의된 전역 변수의 모듈을 포함하고 있는 스키마에 대한 EXECUTEIN 특권
  • 모듈에 정의된 전역 변수의 모듈을 포함하고 있는 스키마에 대한 스키마 DATAACCESS 권한

권한 부여 검사가 명령문 실행 시간에서 수행되는 명령문의 경우(DDL, GRANT 및 REVOKE문), 명령문의 권한 부여 ID가 보유한 특권에 PREPARE문에 의하여 지정된 SQL문을 실행하기 위해 필요한 특권이 있어야 합니다. 명령문의 권한 부여 ID는 DYNAMICRULES 바인드 옵션의 영향을 받을 수 있습니다.

권한 부여 검사가 명령문 준비 시간에서 수행되는 명령문의 경우(DML), PREPARE문에 의하여 지정된 SQL문에 대하여 추가적인 권한 부여 검사가 수행되지 않습니다.

구문

구문 도표 읽기시각적 구문 도표 생략
>>-EXECUTE--statement-name-------------------------------------->

>--+----------------------------------------------+------------->
   |         .-,-----------------.                |   
   |         V                   |                |   
   '-INTO--+---assignment-target-+--------------+-'   
           '-DESCRIPTOR--result-descriptor-name-'     

>--+----------------------------------------------+------------->
   |          .-,-----------------------.         |   
   |          V                         |         |   
   '-USING--+---+-input-host-variable-+-+-------+-'   
            |   |            (1)      |         |     
            |   '-expression----------'         |     
            '-DESCRIPTOR--input-descriptor-name-'     

>--+---------------------------------+-------------------------><
   '-FOR--+-host-variable----+--ROWS-'   
          '-integer-constant-'           

assignment-target

|--+-global-variable-name-------------------+-------------------|
   +-host-variable-name---------------------+   
   +-SQL-parameter-name---------------------+   
   +-SQL-variable-name----------------------+   
   +-transition-variable-name---------------+   
   +-array-variable-name--[--array-index--]-+   
   '-field-reference------------------------'   

참고:
  1. host-variable이 아닌 표현식은 EXECUTE문이 복합 SQL문(컴파일됨) 내에서 사용되는 경우에만 사용될 수 있습니다.

설명

statement-name
실행할 준비된 명령문을 식별합니다. statement-name은 이전에 준비되었고 준비된 명령문이 SELECT문일 수 없는 명령문을 식별해야 합니다.
INTO
준비된 명령문에 있는 출력 매개변수 표시문자의 값을 수신하기 위해 사용되는 대상의 목록을 소개합니다. 대상에의 각 지정은 목록을 통해 시퀀스에서 이루어집니다. 지정 중 오류가 발생한 경우, 해당 값은 대상에 지정되지 않으며 값이 더 이상 대상에 지정되지 않습니다. 이미 대상에 지정된 값은 지정된 상태로 남습니다.

동적 CALL문의 경우, 프로시저에 OUT 및 INOUT 인수가 나타나는 매개변수 표시문자는 출력 매개변수 표시문자입니다. 출력 매개변수 표시문자가 명령문에 나타나면 INTO 절을 지정해야 합니다(SQLSTATE 07007).

assignment-target
출력 값의 지정에 대해 하나 또는 여러 대상을 식별합니다. 결과 행의 첫 번째 값은 목록의 첫 번째 대상에 지정되고 두 번째 값은 두 번째 대상에 지정되는 식입니다.

assignment-target의 데이터 유형이 행 유형이면 지정된 하나의 assignment-target이 확실히 존재해야 하며(SQLSTATE 428HR), 컬럼 수는 행 유형의 필드 수와 일치해야 하고, 페치된 행 컬럼의 데이터 유형은 행 유형의 해당 필드에 지정될 수 있어야 합니다(SQLSTATE 42821).

assignment-target의 데이터 유형이 배열 요소인 경우, 정확히 하나의 assignment-target이 지정되어야 합니다.

global-variable-name
지정 대상인 전역 변수를 식별합니다.
host-variable-name
지정 대상인 호스트 변수를 식별합니다. 대형 오브젝트 출력 값이 충분히 큰 경우, 대상은 일반 호스트 변수, 대형 오브젝트 로케이터 변수 또는 대형 오브젝트 파일 참조 변수가 될 수 있습니다.
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으로 지정되어야 합니다.
DESCRIPTOR result-descriptor-name
호스트 변수의 유효한 설명을 포함해야 하는 출력 SQLDA를 식별합니다.
EXECUTE문이 처리되기 전에 사용자는 출력 SQLDA의 다음 필드를 설정해야 합니다.
  • SQLN을 SQLDA에서 제공되는 SQLVAR 어커런스의 수를 표시하도록 설정
  • SQLDABC를 SQLDA에 할당된 스토리지의 바이트 수를 표시하도록 설정
  • SQLD를 명령문 처리 중인 경우 SQLDA에 사용되는 변수의 수를 표시하도록 설정
  • SQLVAR 어커런스를 변수의 속성을 표시하도록 설정

SQLDA에는 모든 SQLVAR 어커런스를 포함할 만큼 충분한 스토리지가 있어야 합니다. 그러므로, SQLDABC의 값은 16 + SQLN*(N)보다 커야 합니다. 여기서 N은 SQLVAR 어커런스의 길이입니다.

대형 오브젝트 또는 구조화된 데이터 유형 출력 데이터를 수용해야 하는 경우, 모든 출력 매개변수 표시문자에 두 SQLVAR 엔트리가 있어야 합니다.

SQLD는 영(0) 이상이고 SQLN 이하인 값으로 설정해야 합니다.

USING
값이 준비된 명령문의 입력 매개변수 표시문자에 대치되는 변수 또는 표현식의 목록을 소개합니다.
동적 CALL문의 경우, 프로시저에 IN 및 INOUT 인수가 나타나는 매개변수 표시문자는 입력 매개 변수 표시문자입니다. 다른 모든 동적문의 경우, 모든 매개변수 표시문자는 입력 매개변수 표시문자입니다. 입력 매개변수 표시문자가 명령문에 나타나면 USING 절을 지정해야 합니다(SQLSTATE 07004).
input-host-variable, ...
호스트 변수 선언 규칙에 따라 프로그램에 선언되는 호스트 변수를 식별합니다. 변수 번호는 준비된 명령문에 있는 입력 매개변수 표시문자의 수와 동일해야 합니다. 준비된 명령문의 n 번째 매개변수 표시문자에 해당하는 n 번째 변수입니다. 로케이터 변수 및 파일 참조 변수입니다. 해당하는 경우, 매개변수 표시문자에 대한 값의 소스로 제공될 수 있습니다.
expression
준비된 명령문에 있는 해당 입력 매개변수 표시문자에 대한 입력으로 사용될 표현식을 식별합니다. host-variable이 아닌 표현식은 EXECUTE문이 복합 SQL문(컴파일됨) 내에서 발행되는 경우에만 지정될 수 있습니다.
DESCRIPTOR input-descriptor-name
호스트 변수의 유효한 설명을 포함해야 하는 출력 SQLDA를 식별합니다.
EXECUTE문이 처리되기 전에 사용자는 출력 SQLDA의 다음 필드를 설정해야 합니다.
  • SQLN을 SQLDA에서 제공되는 SQLVAR 어커런스의 수를 표시하도록 설정
  • SQLDABC를 SQLDA에 할당된 스토리지의 바이트 수를 표시하도록 설정
  • SQLD를 명령문 처리 중인 경우 SQLDA에 사용되는 변수의 수를 표시하도록 설정
  • SQLVAR 어커런스를 변수의 속성을 표시하도록 설정

SQLDA에는 모든 SQLVAR 어커런스를 포함할 만큼 충분한 스토리지가 있어야 합니다. 그러므로, SQLDABC의 값은 16 + SQLN*(N)보다 커야 합니다. 여기서 N은 SQLVAR 어커런스의 길이입니다.

대형 오브젝트 또는 구조화된 데이터 유형 입력 데이터를 수용해야 하는 경우, 모든 매개변수 표시문자에 두 SQLVAR 엔트리가 있어야 합니다.

SQLD는 영(0) 이상이고 SQLN 이하인 값으로 설정해야 합니다.

FOR host-variable 또는 integer-constant ROWS

소스 데이터의 행 수를 지정합니다. 삽입 및 병합 연산에 대한 값은 USING 절에 지정됩니다.

host-variable 또는 integer-constant는 필수 값 k로 지정됩니다. host-variable가 지정되는 경우 정수 또는 short 유형이어야 하며 표시기 변수에 포함되지 않아야 합니다. k는 2 - 32767 범위여야 합니다. FOR host-variable 또는 integer-constant ROWS가 제공되지 않으면 크기 1의 배열로 SQL이 실행됩니다.

참고

  • 준비된 명령문을 실행하기 전에, 각 입력 매개변수 표시문자가 해당 변수 또는 표현식의 값으로 효과적으로 대체됩니다. 유형이 지정된 매개변수 표시문자의 경우, 변수나 표현식의 속성이 CAST 스펙으로 지정됩니다. 유형이 지정되지 않은 매개변수 표시문자의 경우, 변수나 표현식의 속성이 매개변수 표시문자의 컨텍스트에 따라 판별됩니다.
    V가 매개변수 표시문자 P에 해당하는 입력 변수 또는 표현식을 표시하도록 합니다. V의 값을 컬럼에 지정하기 위한 규칙에 따라 P에 대한 대상 변수에 지정됩니다. 따라서,
    • V는 대상과 호환 가능해야 합니다.
    • V가 문자열인 경우, 그 길이는 대상의 길이 속성보다 크지 않아야 합니다.
    • V가 숫자인 경우, 통합 파트의 절대값은 대상의 통합 파트의 최대 절대값보다 크지 않아야 합니다.
    • V의 속성이 대상의 속성과 동일하지 않은 경우, 값은 대상의 속성을 준수하도록 변환됩니다.

    준비된 명령문을 실행할 때, P의 위치에서 사용되는 값은 P의 대상 변수의 값이거나 P의 대상 표현식의 결과입니다. 예를 들어, V가 CHAR(6)이고 대상이 CHAR(8)인 경우, P의 위치에 사용되는 값은 두 공백으로 패드된 V의 값입니다.

  • 동적 CALL문의 경우, 준비된 명령문을 실행한 후, 각 OUT 및 INOUT 인수의 리턴된 값이 인수에 사용된 출력 매개변수 표시문자에 해당하는 지정 대상에 지정됩니다. 유형이 지정된 매개변수 표시문자의 경우, 대상 변수의 속성이 CAST 스펙으로 지정됩니다. 유형이 지정되지 않은 매개변수 표시문자의 경우, 대상 변수의 속성이 프로시저의 매개변수 정의에 의해 지정됩니다.
    V가 프로시저의 인수 A에 사용된 매개변수 표시문자 P에 해당하는 출력 지정 대상을 표시하도록 합니다. A의 값은 컬럼에서 값을 검색하는 규칙에 따라 V에 지정됩니다. 따라서,
    • V는 A와 호환 가능해야 합니다.
    • V가 문자열인 경우, 그 길이는 A의 길이보다 작지 않아야 합니다. 그렇지 않으면 A의 값이 잘립니다.
    • V가 숫자인 경우, 통합 파트의 최대 절대값은 A의 통합 파트의 최대 절대값 보다 작지 않아야 합니다.
    • V의 속성이 A의 속성과 동일하지 않은 경우, A의 값은 V의 속성을 준수하도록 변환됩니다.
  • 동적 SQL문 캐싱: 동적 및 정적 SQL문을 실행하는 데에 필요한 정보는 정적 또는 동적 SQL문이 먼저 참조됨에 따라 각 데이터베이스 패키지 캐시에 있습니다. 이 정보는 유효하지 않게 되거나, 다른 명령문에 캐시 공간이 필요하거나, 데이터베이스가 종료되지 않는 한 패키지 캐시에 있습니다.

    SQL문이 실행 또는 준비되는 경우, 요청을 발행하는 애플리케이션과 관련된 패키지 정보는 시스템 카탈로그에서 패키지 캐시로 로드됩니다. 개별적 SQL문에 실제로 실행할 수 있는 섹션은 캐시 안에도 있습니다. 정적 SQL 섹션은 시스템 카탈로그에서 읽을 수 있으며 명령문이 먼저 참조된 경우에는 패키지 캐시에 있습니다. 동적 SQL 섹션은 작성 직후 캐시에 위치합니다. 동적 SQL 섹션은 PREPARE 또는 EXECUTE IMMEDIATE와 같은 명시적 명령문으로 작성할 수 있습니다. 한 번 작성되면, 원래 섹션이 공간 관리 이유로 인해 삭제되거나 환경 변경으로 인하여 유효하지 않게 되는 경우, 동적 SQL문의 섹션이 시스템에 의하여 명령문의 내재된 준비에 의해 다시 작성될 수도 있습니다.

    각 SQL문은 데이터베이스 레벨에서 캐시되며 애플리케이션 사이에 공유될 수 있습니다. 정적 SQL문은 동일한 패키지를 통해 애플리케이션 사이에서 공유됩니다. 동적 SQL문은 동일한 컴파일 환경과 정확한 동일 명령문 텍스트를 통해 애플리케이션 사이에서 공유됩니다. 애플리케이션이 발행한 각 SQL문의 텍스트는 내재된 준비가 필요한 경우 애플리케이션 내에 로컬로 캐시되어 사용됩니다. 애플리케이션 프로그램의 각 PREPARE문은 하나의 명령문을 캐시할 수 있습니다. 애플리케이션 프로그램의 모든 EXECUTE IMMEDIATE문은 동일한 공간을 공유하며 모든 EXECUTE IMMEDIATE문에 대하여 명령문은 한 번에 하나만 캐시됩니다. 동일한 PREPARE 또는 EXECUTE IMMEDIATE문이 매번 다른 SQL문과 함께 여러 번 발행된 경우, 마지막 명령문만 캐시되어 재사용됩니다. 캐시의 최적의 사용법은 애플리케이션 시작 시에 여러 가지 PREPARE문을 발행한 후, 필요한 경우 EXECUTE 또는 OPEN문을 발행하는 것입니다.

    동적 SQL문이 캐시되면 패키지에 준비한 SQL문을 KEEPDYNAMIC NO 옵션과 함께 바인드하지 않는 경우 명령문을 다시 준비할 필요없이 여러 작업 단위에서 재사용 할 수 있습니다. 필요한 경우 환경 변경이 발생할 때 시스템은 명령문을 다시 컴파일합니다.

    다음 이벤트는 다음 PREPARE, EXECUTE, EXECUTE IMMEDIATE 또는 OPEN 요청에 대해 내재적으로 준비될 캐시된 동적 명령문을 야기하는 환경 또는 데이터 오브젝트 변경의 예입니다.
    • ALTER FUNCTION
    • ALTER METHOD
    • ALTER NICKNAME
    • ALTER PROCEDURE
    • ALTER SERVER
    • ALTER TABLE
    • ALTER TABLESPACE
    • ALTER TYPE
    • CREATE FUNCTION
    • CREATE FUNCTION MAPPING
    • CREATE INDEX
    • CREATE METHOD
    • CREATE PROCEDURE
    • CREATE TABLE
    • CREATE TEMPORARY TABLESPACE
    • CREATE TRIGGER
    • CREATE TYPE
    • DROP(모든 오브젝트)
    • 테이블 또는 인덱스의 RUNSTATS
    • 뷰가 작동 불능 상태가 되도록 하는 조치
    • 시스템 카탈로그 테이블에 있는 통계의 UPDATE
    • SET CURRENT DEGREE
    • SET PATH
    • SET QUERY OPTIMIZATION
    • SET SCHEMA
    • SET SERVER OPTION
    다음 목록은 캐시된 동적 SQL문에서 예상되는 동작을 간략히 설명합니다.
    • PREPARE 요청: 동일한 명령문을 연속적으로 준비하면 섹션이 유효한 상태인 경우 명령문 컴파일 비용이 발생하지 않습니다. 비용 및 카디널리티는 리턴된 현재 캐시 섹션을 추정합니다. 이 값은 동일한 SQL문의 이전 PREPARE에서 리턴된 값과 다를 수 있습니다. 명령문이 KEEPDYNAMIC NO와 바인드된 패키지와 연결된 경우, COMMIT 또는 ROLLBACK문에 PREPARE문을 연속적으로 발행할 필요가 없습니다.
    • EXECUTE 요청: EXECUTE문은 원래 PREPARE 이후 유효하지 않게 된 경우, 경우에 따라 명령문을 내재적으로 준비하는 비용을 발생시키지 않을 수 있습니다. 섹션이 내재적으로 준비된 경우, 원래 PREPARE문의 환경이 아닌 현재 환경을 사용하게 됩니다.
    • EXECUTE IMMEDIATE 요청: 동일한 명령문에 EXECUTE IMMEDIATE를 연속으로 발행하면 섹션이 유효한 상태인 경우 명령문 컴파일 비용이 발생하지 않게 됩니다.
    • OPEN 요청: OPEN은 원래 PREPARE 이후 유효하지 않게 된 경우, 경우에 따라 동적으로 정의된 커서에 대해 명령문을 내재적으로 준비하는 비용을 발생시키지 않을 수 있습니다. 섹션이 내재적으로 준비된 경우, 원래 PREPARE문의 환경이 아닌 현재 환경을 사용하게 됩니다.
    • FETCH 요청: 동작 변경이 예상되지 않아야 합니다.
    • ROLLBACK: 준비된 해당 동적 SQL문 또는 롤백 연산에 영향 받는 작업 단위 중 내재적으로 준비된 동적 SQL문만 무효화됩니다. KEEPDYNAMIC NO에 바인드된 패키지에 연결된 비활성 동적 SQL문은 ROLLBACK 연산 후 애플리케이션 SQL 컨텍스트에서 제거되며 애플리케이션이 이들을 실행할 수 있게 되기 전에 명시적으로 다시 준비되어야 합니다. 동적 SQL문이 아직 데이터베이스 레벨에 캐시되어 있으므로 연속적인 PREPARE 요청은 섹션이 유효한 상태인 경우 명령문 컴파일 비용을 발생시키지 않습니다.
    • COMMIT: 동적 SQL문이 무효화되지 않았으나 획득한 잠금은 해제되었습니다. WITH HOLD 옵션으로 정의되지 않은 커서는 닫히고 해당 잠금은 해제됩니다. WITH HOLD 옵션으로 정의된 열린 커서는 패키지 및 섹션 잠금을 유지하여 커미트 처리 중과 처리 후 모두 활성 섹션을 보호합니다. KEEPDYNAMIC NO 옵션에 바인드된 동적 SQL문은 트랜잭션 경계 후 준비된 상태에 있지 않으며 애플리케이션이 이들을 실행할 수 있게 되기 전에 명시적으로 다시 준비되어야 합니다. WITH HOLD 옵션으로 정의된 열린 커서에 준비된 SELECT문은 트랜잭션 경계가 커서가 닫히는 지점을 히트할 때까지 준비된 상태로 남습니다. KEEPDYNAMIC NO에 바인드된 패키지에 연결된 비활성 동적 SQL문은 커미트 연산 후 애플리케이션 SQL 컨텍스트에서 제거되며 애플리케이션이 이들을 실행할 수 있게 되기 전에 명시적으로 다시 준비되어야 합니다.

    내재된 준비 중 오류가 발생한 경우, 내재된 준비를 야기하는 요청에 대해 오류가 리턴됩니다(SQLSTATE 56098).

예 1: 이 C 예에서, 매개변수 표시문자가 있는 INSERT문이 준비되고 실행됩니다. TDEPT의 형식에 해당하는 호스트 변수 h1 - h4입니다.
   strcpy (s,"INSERT INTO TDEPT VALUES(?,?,?,?)");
   EXEC SQL PREPARE DEPT_INSERT FROM :s;
     .
     .
   (Check for successful execution and put values into :h1, :h2, :h3, :h4)
     .
     .
   EXEC SQL EXECUTE DEPT_INSERT USING :h1, :h2,
   :h3, :h4;
예 2: 이 EXECUTE문은 SQLDA를 사용합니다.
   EXECUTE S3 USING DESCRIPTOR :sqlda3
예 3: 직원이 보너스를 받도록 하는 프로시저가 제공됩니다.
   CREATE PROCEDURE GIVE_BONUS (IN EMPNO INTEGER,
                             IN DEPTNO INTEGER,
                             OUT CHEQUE INTEGER,
                             INOUT BONUS DEC(6,0))
   ...
C 애플리케이션에서 프로시저를 동적으로 호출합니다. 프로시저는 다음 호스트 변수를 입력합니다.
  • employee, 직원의 ID 번호
  • dept, 부서 번호
  • bonus, 직원이 받을 보너스
프로시저가 다음 값을 호스트 변수로 리턴합니다.
  • cheque_no, 수표의 ID 번호
  • bonus, 실제 보너스 금액(조정 후)
   strcpy (s, "CALL GIVE_BONUS(?, ?, ?, ?)");
   EXEC SQL PREPARE DO_BONUS FROM :s;
     .
     .
   /* Check for successful execution and put values into
      :employee, :dept, and :bonus */
     .
     .
   EXEC SQL EXECUTE DO_BONUS INTO :cheque_no, :bonus
                          USING :employee, :dept, :bonus;
     .
     .
   /* Check for successful execution and process the
      values returned in :cheque_no and :bonus */