Loading...
MySQL 9.5 Reference Manual 9.5의 15.5.1 PREPARE Statement의 한국어 번역본입니다.
아래의 경우에 피드백에서 신고해주신다면 반영하겠습니다.
감사합니다 :)
1PREPARE stmt_name FROM preparable_stmt
PREPARE statement는 하나의
SQL statement를 준비하고 나중에 이 statement를 참조하기 위한 이름
_stmt_name_을 할당합니다. 준비된 statement는
EXECUTE로 실행되고
DEALLOCATE PREPARE로 해제됩니다. 예시는
Section 15.5, “Prepared Statements”를 참조하십시오.
statement 이름은 대소문자를 구분하지 않습니다.
_preparable_stmt_는 문자열 리터럴이거나 SQL
statement의 텍스트를 담고 있는 사용자 변수입니다. 텍스트는 복수의
statement가 아닌 단일 statement를 나타내야 합니다. statement 내부에서
? 문자는 나중에 쿼리를 실행할 때 데이터 값을 바인딩할
위치를 나타내는 파라미터 마커로 사용할 수 있습니다.
? 문자는 비록 문자열 값에 바인딩할 의도라 하더라도
작은따옴표로 둘러싸지 않아야 합니다. 파라미터 마커는
SQL 키워드, 식별자 등에 대해서가 아니라, 데이터 값이
나타나야 하는 위치에서만 사용할 수 있습니다.
같은 이름을 가진 prepared statement가 이미 존재하는 경우, 새 statement가 준비되기 전에 암시적으로 해제됩니다. 이는 새 statement에 오류가 있어 준비될 수 없는 경우, 오류가 반환되고 주어진 이름을 가진 statement는 존재하지 않게 됨을 의미합니다.
prepared statement의 스코프는 그것이 생성된 세션이며, 이는 여러 가지 의미를 가집니다:
한 세션에서 생성된 prepared statement는 다른 세션에서 사용할 수 없습니다.
세션이 정상적으로든 비정상적으로든 종료되면, 그 세션의 prepared statement는 더 이상 존재하지 않습니다. 자동 재연결이 활성화된 경우, 클라이언트는 연결이 끊어졌음을 통지받지 못합니다. 이러한 이유로 클라이언트는 자동 재연결을 비활성화하는 것이 좋을 수 있습니다. Automatic Reconnection Control을 참조하십시오.
저장 프로그램 내에서 생성된 prepared statement는 프로그램 실행이 끝난 후에도 계속 존재하며 이후 프로그램 외부에서 실행할 수 있습니다.
저장 프로그램 컨텍스트에서 준비된 statement는 프로그램의 종료 시 스코프를 벗어나 이후 프로그램 외부에서 statement가 실행될 때 사용할 수 없게 되는 저장 프로시저나 함수 파라미터 또는 로컬 변수를 참조할 수 없습니다. 해결 방법으로, 세션 스코프를 가지는 사용자 정의 변수를 대신 참조하십시오. Section 11.4, “User-Defined Variables”를 참조하십시오.
prepared statement에서 사용되는 파라미터의 타입은
statement가 처음 준비될 때 결정되며,
이 prepared statement에 대해
EXECUTE가 호출될 때마다
(이 절 뒤에 설명된 대로 statement가 다시 준비되는 경우를 제외하고)
이 타입을 유지합니다. 파라미터 타입을 결정하는 규칙은 다음과 같습니다:
이항 산술 연산자의 피연산자인 파라미터는 다른 피연산자와 같은 데이터 타입을 가집니다.
이항 산술 연산자의 두 피연산자가 모두 파라미터인 경우, 파라미터의 타입은 연산자의 컨텍스트에 의해 결정됩니다.
단항 산술 연산자의 피연산자인 파라미터의 타입은 연산자의 컨텍스트에 의해 결정됩니다.
산술 연산자가 타입을 결정하는 컨텍스트를 가지지 않는 경우,
여기에 관련된 모든 파라미터의 파생 타입은
DOUBLE PRECISION입니다.
예를 들어, 파라미터가
SELECT 리스트의 최상위 노드이거나
비교 연산자의 일부인 경우에 이런 상황이 발생할 수 있습니다.
문자 문자열 연산자의 피연산자인 파라미터는
다른 피연산자의 집계 타입과 동일한 파생 타입을 가집니다.
연산자의 모든 피연산자가 파라미터인 경우,
파생 타입은 VARCHAR입니다.
그 콜레이션은
collation_connection의 값에 의해
결정됩니다.
시간형 연산자의 피연산자인 파라미터는
연산자가 DATETIME을 반환하면
DATETIME 타입을,
연산자가 TIME을 반환하면
TIME 타입을,
연산자가 DATE를 반환하면
DATE 타입을 가집니다.
이항 비교 연산자의 피연산자인 파라미터는 비교의 다른 피연산자와 동일한 파생 타입을 가집니다.
BETWEEN과 같은
삼항 비교 연산자의 피연산자인 파라미터는
다른 피연산자의 집계 타입과 동일한 파생 타입을 가집니다.
비교 연산자의 모든 피연산자가 파라미터인 경우,
각 피연산자의 파생 타입은
VARCHAR이며,
콜레이션은
collation_connection의 값에 의해
결정됩니다.
CASE,
COALESCE,
IF,
IFNULL,
NULLIF 중
어떤 연산자의 출력 피연산자인 파라미터는
이 연산자의 다른 출력 피연산자의 집계 타입과
동일한 파생 타입을 가집니다.
CASE,
COALESCE,
IF,
IFNULL,
NULLIF의
모든 출력 피연산자가 파라미터이거나 모두 NULL인 경우,
파라미터의 타입은 연산자의 컨텍스트에 의해 결정됩니다.
파라미터가
CASE,
COALESCE(),
IF,
IFNULL의
피연산자이고 타입을 결정하는 컨텍스트가 없는 경우,
관련된 각 파라미터의 파생 타입은
VARCHAR이며,
그 콜레이션은
collation_connection의 값에 의해
결정됩니다.
CAST()의 피연산자인 파라미터는
CAST()에 의해 지정된 것과 동일한 타입을 가집니다.
SELECT 리스트의 즉시 구성원이면서
INSERT statement의 일부가 아닌
파라미터의 파생 타입은
VARCHAR이며,
그 콜레이션은
collation_connection의 값에 의해
결정됩니다.
파라미터가
INSERT statement의 일부인
SELECT 리스트의 즉시 구성원인 경우,
파라미터의 파생 타입은
파라미터가 삽입되는 해당 컬럼의 타입입니다.
파라미터가
UPDATE statement의
SET 절이나
INSERT statement의
ON DUPLICATE KEY UPDATE 절에서
대입의 소스로 사용되는 경우,
파라미터의 파생 타입은
SET 절 또는
ON DUPLICATE KEY UPDATE 절에 의해
갱신되는 해당 컬럼의 타입입니다.
파라미터가 함수의 인자인 경우, 파생 타입은 함수의 반환 타입에 따라 달라집니다.
일부 실제 타입과 파생 타입의 조합에 대해서는, 이전 버전의 MySQL과의 더 나은 호환성을 보장하기 위해 statement의 자동 재준비가 트리거됩니다. 다음 조건 중 하나라도 참인 경우에는 재준비가 발생하지 않습니다:
실제 파라미터 값으로 NULL이 사용된 경우.
파라미터가
CAST()의 피연산자인 경우.
(이 경우 파생 타입으로의 캐스트가 시도되며,
캐스트가 실패하면 예외가 발생합니다.)
파라미터가 문자열인 경우.
(이 경우 암시적으로
CAST(? AS derived_type)가 수행됩니다.)
파라미터의 파생 타입과 실제 타입이 모두
INTEGER이고
부호가 동일한 경우.
파생 타입이 DOUBLE이고
실제 타입이 임의의 숫자 타입인 경우.
파생 타입과 실제 타입이 모두 문자열 타입인 경우.
파생 타입이 시간형이고 실제 타입이 시간형인 경우.
예외: 파생 타입이
TIME인데 실제 타입이
TIME이 아닌 경우;
파생 타입이
DATE인데 실제 타입이
DATE가 아닌 경우.
파생 타입이 시간형이고 실제 타입이 숫자형인 경우.
위에 나열된 경우가 아닌 경우에는, statement가 다시 준비되며 파생 파라미터 타입 대신 실제 파라미터 타입이 사용됩니다.
이 규칙들은 prepared statement에서 참조되는 사용자 변수에도 동일하게 적용됩니다.
prepared statement 내에서, 첫 번째 실행 이후의 statement 실행에 대해 특정 파라미터나 사용자 변수에 대해 다른 데이터 타입을 사용하면 statement가 다시 준비됩니다. 이는 효율성이 떨어질 뿐만 아니라, 파라미터(또는 변수)의 실제 타입이 달라질 수 있으므로, prepared statement의 이후 실행 결과가 일관되지 않을 수 있습니다. 이러한 이유로, prepared statement를 다시 실행할 때는 특정 파라미터에 대해 동일한 데이터 타입을 사용하는 것이 좋습니다.
15.5 Prepared Statements
15.5.2 EXECUTE Statement