43.5. 기본 진술

이 섹션과 다음 섹션에서는에 의해 명시 적으로 이해되는 모든 진술 유형을 설명합니다.pl/pgsql. 이러한 토토 핫문 유형 중 하나로 인식되지 않은 것은 SQL 토토 핫으로 추정되며에 설명 된대로 실행하기 위해 기본 데이터베이스 엔진으로 전송됩니다.섹션 43.5.2.

43.5.1. 과제

값의 할당pl/pgsql변수는 다음과 같이 작성되었습니다.

variable: = | =표현;

앞에서 설명한 바와 같이, 그러한 진술의 표현은 SQL을 통해 평가됩니다.select기본 데이터베이스 엔진으로 전송 된 토토 핫. 표현식은 단일 값을 산출해야합니다 (변수가 행 또는 레코드 변수 인 경우 행 값 일 수 있음). 대상 변수는 간단한 변수 (선택적으로 블록 이름으로 자격이있는), 행 또는 레코드 대상 필드 또는 배열 대상의 요소 또는 슬라이스 일 수 있습니다. 동일한 (=) PL/SQL 호환 대신 사용할 수 있습니다: =.

표현식의 결과 데이터 유형이 변수의 데이터 유형과 일치하지 않으면 할당 캐스트에 의해 값이 강요됩니다 (참조PostgreSQL : 문서 : 14 : 10.4. 가치 토토 결과). 관련 데이터 유형 쌍에 대해 과제 캐스트가 알려지지 않으면pl/pgsql인터프리터는 결과 값을 텍스트로 변환하려고 시도합니다. 결과 값의 문자열 양식이 입력 함수에 허용되지 않는 경우 입력 함수에 의해 생성 된 실행 오류가 발생할 수 있습니다..

예 :

세금 : = 하위 토탈 * 0.06;
my_record.user_id : = 20;
my_array [j] : = 20;
my_array [1 : 3] : = 배열 ​​[1,2,3];
complex_array [n] .realpart = 12.3;

43.5.2. SQL 토토 핫 실행

일반적으로 행을 반환하지 않는 SQL 토토 핫은 A 내에서 실행될 수 있습니다.pl/pgsql토토 핫을 작성하는 것만으로 기능합니다. 예를 들어, 글을 작성하여 테이블을 만들고 채울 수 있습니다

테이블 작성 mytable (id int 기본 키, 데이터 텍스트);
myTable 값 (1, 'one'), (2, 'two')에 삽입;

토토 핫이 행을 반환하는 경우 (예 :select또는삽입/업데이트/삭제with반환), 진행하는 방법에는 두 가지가 있습니다. 토토 핫이 최대 한 행에서 반환되거나 첫 번째 출력 행에만 관심이 있으면 평소와 같이 토토 핫을 쓰지 말고 추가하십시오.in출력을 캡처하려는 조항에 설명 된대로섹션 43.5.3. 모든 출력 행을 처리하려면 토토 핫을 A의 데이터 소스로 작성하십시오.for루프, 설명대로섹션 43.6.6.

일반적으로 정적으로 정의 된 SQL 토토 핫을 실행하는 것만으로는 충분하지 않습니다. 일반적으로 다양한 데이터 값을 사용하거나 다른 시간에 다른 테이블 이름을 사용하는 것과 같은보다 근본적인 방식으로 변경되도록 토토 핫을 원합니다. 다시, 상황에 따라 진행하는 두 가지 방법이 있습니다.

pl/pgsql변수 값은 최적화 가능한 SQL 토토 핫에 자동으로 삽입 될 수 있습니다.select, 삽입, 업데이트, 삭제및 이들 중 하나를 포함하는 특정 유틸리티 토토 핫 (설명and테이블 작성 ... 선택. 이 토토 핫에서 모든pl/pgsql토토 핫 텍스트에 나타나는 변수 이름은 쿼리 매개 변수로 대체 된 다음 변수의 현재 값이 실행 시간에 매개 변수 값으로 제공됩니다. 이것은 표현에 대해 앞에서 설명한 처리와 똑같습니다. 자세한 내용은 참조섹션 43.11.1.

이러한 방식으로 최적화 가능한 SQL 토토 핫을 실행할 때pl/pgsql섹션 43.11.2.

최적화 할 수없는 SQL 토토 핫 (유틸리티 토토 핫이라고도 함)은 쿼리 매개 변수를 수락 할 수 없습니다. 그래서 자동 대체pl/pgsql변수는 그러한 토토 핫에서 작동하지 않습니다. 유틸리티 토토 핫에 텍스트가 아닌 텍스트를 포함하려면pl/pgsql, 유틸리티 토토 핫을 문자열로 빌드 한 다음executeit,섹션 43.5.4.

execute예를 들어 테이블 이름을 변경하여 데이터 값을 공급하는 것 외에 다른 방법으로 토토 핫을 수정하려면 사용해야합니다..

때로는 표현식 또는를 평가하는 것이 유용합니다.select쿼리 그러나 예를 들어 부작용이 있지만 유용한 결과 값이없는 함수를 호출 할 때 결과를 폐기합니다.pl/pgsql, 사용공연진술 :

공연쿼리;

이것은 실행쿼리결과를 버립니다. 쓰기쿼리SQL을 작성하는 것과 같은 방식select토토 핫이지만 초기 키워드를 대체selectwith공연. 을 위한with쿼리, 사용공연그런 다음 쿼리를 괄호 안에 놓습니다. (이 경우 쿼리는 한 행만 반환 할 수 있습니다.)pl/pgsql변수는 위에서 설명한대로 쿼리로 대체되며 계획은 같은 방식으로 캐시됩니다. 또한 특수 변수발견쿼리가 적어도 하나의 행을 생성 한 경우, 또는 행이 생성 된 경우 False (참조섹션 43.5.5).

Note

글쓰기를 기대할 수 있습니다select직접이 결과를 달성하지만 현재로서는 수용된 유일한 방법은입니다.공연. 와 같은 행을 반환 할 수있는 SQL 토토 핫select,가없는 한 오류로 거부됩니다.in다음 섹션에서 논의 된 조항

예 :

create_mv 수행 ( 'cs_session_page_requests_mv', my_query);

43.5.3. 단일 줄 결과로 토토 핫 실행

SQL 토토 핫의 결과 단일 행 (여러 열의 가능성)을 산출하는 결과는 레코드 변수, 행 유형 변수 또는 스칼라 변수 목록에 할당 될 수 있습니다. 이것은 기본 SQL 토토 핫을 작성하고 추가를 추가하여 수행됩니다.in절. 예를 들어,

selectselect_expressions[에엄격한]대상삽입 ... 반환표현[에엄격한]대상;
업데이트 ... 반환표현[에엄격한]대상;
삭제 ... 반환표현[에엄격한]대상;

여기서대상레코드 변수, 행 변수 또는 간단한 변수 및 레코드/행 필드의 쉼표로 구분 된 목록이 될 수 있습니다.pl/pgsql변수는 나머지 토토 핫으로 대체됩니다 (즉,into절) 위에서 설명한대로 계획은 같은 방식으로 캐시됩니다. 이것은 |select, 삽입/업데이트/삭제with반환및와 같은 행 세트를 반환하는 특정 유틸리티 토토 핫설명. 을 제외하고in절, SQL 토토 핫은 외부에 기록 될 것과 동일합니다pl/pgsql.

이 해석에 주목하십시오.selectwithin|PostgreSQL'S Regal선택토토 핫, 여기서in대상은 새로 생성 된 테이블입니다. a에서 테이블을 만들고 싶다면select내부의 결과PL/PGSQL함수, 구문 사용테이블 생성 테이블 ... 선택.

행 변수 또는 변수 목록이 대상으로 사용되면 토토 핫의 결과 열은 숫자 및 데이터 유형과 관련하여 대상의 구조와 정확히 일치해야합니다. 그렇지 않으면 런타임 오류가 발생합니다. 레코드 변수가 대상 인 경우 토토 핫의 결과 열의 행 유형에 자동으로 구성됩니다.

thein절은 SQL 토토 핫의 거의 모든 곳에 나타날 수 있습니다. 관습 적으로 그것은 | 목록 직전이나 바로 뒤에 쓰여졌다select_expressionsatselect토토 핫 또는 다른 토토 핫 유형에 대한 토토 핫의 끝에. 의 경우이 컨벤션을 준수하는 것이 좋습니다.pl/pgsql향후 버전에서 파서가 더 엄격 해집니다.

if엄격한에 지정되어 있지 않습니다.in조항,대상토토 핫에 의해 반환 된 첫 번째 행 또는 토토 핫이 행을 반환하지 않은 경우 NULLS로 설정됩니다. (첫 번째 행당신이 사용하지 않는 한 잘 정의되지 않았습니다주문 by.) 첫 번째 행 후 결과 행은 폐기됩니다. 스페셜을 확인할 수 있습니다발견변수 (참조섹션 43.5.5) 행이 반환되었는지 여부를 결정하려면 :

empname = myName에서 EMP에서 MyRec에 * 선택 *;
찾을 수없는 경우
    예외 '직원 % 찾을 수 없음', MyName;
끝 If;

엄격한옵션이 지정되고, 토토 핫은 정확히 하나의 행을 반환해야합니다. 그렇지 않으면 런 타임 오류가보고됩니다.no_data_found(줄 없음) 또는TOO_MANY_ROWS(하나 이상). 예를 들어 오류를 잡으려는 경우 예외 블록을 사용할 수 있습니다 (예 :

시작
    Empname = myName에서 Emp에서 Strict Myrec으로 * 선택하십시오.
    예외
        그렇다면 no_data_found 일 때
            예외 '직원 % 찾을 수 없음', MyName;
        언제 너무 _many_rows
            예외를 제기하는 '직원 % 고유하지 않음', MyName;
끝;

토토 핫의 성공적인 실행엄격한항상 설정발견to true.

for삽입/업데이트/삭제with반환, pl/pgsql|엄격한지정되지 않았습니다. 와 같은 옵션이 없기 때문입니다.주문 by반환 해야하는 영향을받는 행을 결정하기 위해.

ifprint_strict_params함수에 대해 활성화 된 다음이므로 오류가 발생하면엄격한충족되지 않음,세부 사항오류 메시지의 일부에는 토토 핫에 전달 된 매개 변수에 대한 정보가 포함됩니다. 당신은 변경할 수 있습니다print_strict_params설정을 통해 모든 함수 설정plpgsql.print_strict_params, 후속 기능 컴파일 만 영향을받지 만. 컴파일러 옵션을 사용하여 기능별로 활성화 할 수도 있습니다.

함수 만들기 get_userid (사용자 이름 텍스트) int를 반환합니다
$$로
#print_strict_params on
선언하다
userId int;
시작하다
    사용자를 엄격한 userID로 선택하십시오
        user.username = get_userid.username이있는 사용자로부터;
    반환 userID;
끝;
$$ 언어 plpgsql;

실패시이 함수는와 같은 오류 메시지를 생성 할 수 있습니다.

오류 : 쿼리는 행이 없습니다
세부 사항 : 매개 변수 : username = 'nosuchuser'
컨텍스트 : pl/pgsql 함수 get_userid (텍스트) SQL 문 6 행

note

the엄격한옵션은 Oracle PL/SQL의 동작과 일치합니다선택및 관련 진술.

43.5.4. 동적 토토 핫 실행

종종 당신은 당신의 내부에서 동적 토토 핫을 생성하고 싶을 것입니다pl/pgsql함수, 즉 실행할 때마다 다른 테이블 또는 다른 데이터 유형이 포함되는 토토 핫.PL/PGSQL의 토토 핫 계획을 캐시하려는 정상적인 시도 (섹션 43.11.2)는 그러한 시나리오에서 작동하지 않습니다. 이런 종류의 문제를 처리하려면execute진술이 제공됩니다 :

executeCommand-string[[에엄격한]대상 ] [사용표현[, ... ]];

여기서Command-string(유형의 문자열을 산출하는 표현식입니다.텍스트) 실행하라는 토토 핫을 포함합니다. 선택 사항대상는 레코드 변수, 행 변수 또는 간단한 변수 및 레코드/행 필드의 쉼표로 구분 된 목록입니다. 선택 사항사용토토 핫에 삽입 할 표현식 공급 값.

대체 없음PL/PGSQL변수는 계산 된 토토 핫 문자열에서 수행됩니다. 필요한 변수 값은 구성 될 때 토토 핫 문자열에 삽입해야합니다. 또는 아래에 설명 된대로 매개 변수를 사용할 수 있습니다.

또한,execute. 대신, 토토 핫문이 실행될 때마다 토토 핫은 항상 계획됩니다. 따라서 토토 핫 문자열은 기능 내에서 동적으로 생성되어 다른 테이블과 열에서 동작을 수행 할 수 있습니다.

theinto조항은 SQL 토토 핫의 결과를 반환하는 행의 결과를 지정해야합니다. 행 변수 또는 가변 목록이 제공되면 토토 핫 결과의 구조와 정확히 일치해야합니다. 레코드 변수가 제공되면 결과 구조와 자동으로 일치하도록 구성됩니다. 여러 행이 반환되면 첫 번째 행만에 할당됩니다.in변수. 행이 반환되지 않으면 NULL이에 할당됩니다.in변수. 그렇지 않은 경우in조항이 지정되어 있으며 토토 핫 결과는 폐기됩니다.

엄격한옵션이 제공되며 토토 핫이 정확히 하나의 행을 생성하지 않는 한 오류 가보고됩니다.

토토 핫 문자열은 매개 변수 값을 사용할 수 있으며 토토 핫에$ 1, $ 2등.이 기호는에 제공된 값을 나타냅니다.사용절. 이 방법은 종종 텍스트로 토토 핫 문자열에 데이터 값을 삽입하는 것보다 선호됩니다. 값을 텍스트와 뒤로 변환하는 런 타임 오버 헤드를 피하며 인용 또는 이스케이프 할 필요가 없기 때문에 SQL 주입 공격에 훨씬 덜 걸립니다. 예는 다음과 같습니다.

execute 'inserted_by = $ 1이고 삽입 된 mytable에서 count (*)를 선택하십시오. <= $ 2'
   c
   Checked_user 사용, Checked_date;

매개 변수 기호는 데이터 값에만 사용할 수 있습니다. 동적으로 결정된 테이블 또는 열 이름을 사용하려면 텍스트로 토토 핫 문자열에 삽입해야합니다. 예를 들어, 동적으로 선택된 테이블에 대해 이전 쿼리를 수행 해야하는 경우 다음을 수행 할 수 있습니다.

execute 'count (*)에서'
    || quote_ident (tabname)
    || 'inserted_by = $ 1이고 삽입 된 <= $ 2'
   c
   Checked_user 사용, Checked_date;

더 깨끗한 접근 방식은 사용하는 것입니다format ()'s%I자동 견적이있는 테이블 또는 열 이름을 삽입하려는 사양 :

형식 실행 ( ' %i'
   'inserted_by = $ 1이고 삽입 된 <= $ 2', tabname)
   c
   Checked_user 사용, Checked_date;

31955_32067

매개 변수 기호의 또 다른 제한은 최적화 가능한 SQL 토토 핫에서만 작동한다는 것입니다 (select, 삽입, 업데이트, 삭제및 그 중 하나를 포함하는 특정 토토 핫). 다른 토토 핫문 유형 (일반적으로 유틸리티 토토 핫문이라고 함)에서는 데이터 값에 불과하더라도 값을 텍스트로 삽입해야합니다.

anexecute간단한 상수 토토 핫 문자열과 일부사용위의 첫 번째 예에서와 같이 매개 변수는 기능적으로 토토 핫을 직접 작성하는 것과 동일합니다pl/pgsql그리고 교체 허용pl/pgsql변수가 자동으로 발생합니다. 중요한 차이점은execute각 실행에 대한 토토 핫을 다시 계획하여 현재 매개 변수 값에 특정한 계획을 생성합니다. 반면pl/pgsql그렇지 않으면 일반 계획을 작성하고 재사용 할 수 있습니다. 최상의 계획이 매개 변수 값에 크게 의존하는 상황에서 사용하는 것이 도움이 될 수 있습니다execute일반 계획이 선택되지 않도록 긍정적으로 보장합니다.

선택현재 내부에 지원되지 않습니다execute; 대신, 평범한 실행select토토 핫 및 지정in의 일부로execute자체.

note

thepl/pgsql execute진술은와 관련이 없습니다executeSQL 토토 핫문이 지원하는PostgreSQL서버. 서버의execute진술은 직접 사용할 수 없습니다pl/pgsql기능 (그리고 필요하지 않음).

예 43.1. 동적 쿼리의 값 인용

동적 토토 핫으로 작업 할 때는 종종 단일 따옴표의 탈출을 처리해야합니다. 기능 본문에서 고정 텍스트를 인용하는 권장 방법은 달러 인용입니다. (달러 인용을 사용하지 않는 레거시 코드가있는 경우 개요를 참조하십시오.섹션 43.12.1, 해당 코드를보다 합리적인 체계로 번역 할 때 약간의 노력을 절약 할 수 있습니다.)

동적 값에는 인용 문자가 포함되어 있으므로 신중한 처리가 필요합니다. 사용 예format ()35392_35491

형식 실행 ( 'TBL 세트 %I = $ 1'업데이트
   'where key = $ 2', colname) NewValue 사용, keyValue;

인용 기능을 직접 호출 할 수도 있습니다.

실행 'TBL 세트 업데이트'
        || quote_ident (colname)
        || '='
        || quote_literal (newValue)
        || 'key ='
        || quote_literal (keyvalue);

이 예제는의 사용을 보여줍니다.QUOTE_INDENquote_literal함수 (참조PostgreSQL : 문서 : 14 : 9.4. 토토 사이트 함수 및 연산자). 안전을 위해 열 또는 테이블 식별자를 포함하는 표현식을 통과해야합니다QUOTE_INDEN동적 쿼리에 삽입하기 전에. 구성된 토토 핫에 문자 그대로 해야하는 값을 포함하는 표현식을 통과해야합니다quote_literal. 이 기능은 각각 이중 또는 단일 따옴표로 둘러싸인 입력 텍스트를 반환하기 위해 적절한 단계를 수행하며 임베드 된 특수 문자는 제대로 탈출했습니다.

왜냐하면quote_literal라벨이 표시엄격한, null 인수로 호출되면 항상 null을 반환합니다. 위의 예에서 ifNewValue또는KeyValuenull이었고, 전체 동적 쿼리 문자열이 null이되어 오류가 발생합니다.execute. 를 사용 하여이 문제를 피할 수 있습니다.QUOTE_NULLABLE함수는와 동일하게 작동합니다quote_literal널 인수로 호출 할 때 문자열을 반환하는 것을 제외하고NULL. 예를 들어,

실행 'TBL 세트 업데이트'
        || quote_ident (colname)
        || '='
        || quote_nullable (newValue)
        || 'key ='
        || quote_nullable (keyvalue);

NULL 일 수있는 값을 다루는 경우 일반적으로 사용해야합니다QUOTE_NULLABLE대신quote_literal.

항상 그렇듯이 쿼리의 널 값이 의도하지 않은 결과를 제공하지 않도록주의해야합니다. 예를 들어어디

'여기서 key ='|| quote_nullable (keyvalue)

if 성공하지 못할 것입니다.KeyValue평등 연산자를 사용한 결과=null 피연산자가있는 것은 항상 널입니다. NULL이 일반적인 키 가치처럼 작동하기를 원한다면 위를 다시 작성해야합니다.

'키가'||와 구별되지 않는 경우 quote_nullable (keyvalue)

(현재,|=, 따라서해야 할 경우를 제외하고는하지 마십시오. 보다와이즈 토토 PostgreSQL : 문서 : 14 : 9.2. 비교 기능 및 운영자nulls 및에 대한 자세한 내용은뚜렷하다.)

달러 인용은 고정 텍스트를 인용하는 데만 유용합니다. 이 예제를 다음과 같이 쓰려고 시도하는 것은 매우 나쁜 생각입니다.

실행 'TBL 세트 업데이트'
        || quote_ident (colname)
        || '= $$'
        || NewValue
        || '$$ key ='
        || quote_literal (keyvalue);

내용이 끊어지기 때문에NewValue포함 된$$. 동일한 반대 의견은 선택할 수있는 다른 달러 인출 구분 기호에 적용됩니다. 따라서 미리 알려지지 않은 텍스트를 안전하게 인용하려면필수useQUOTE_LITERAL, QUOTE_NULLABLE, 또는QUOTE_INDEN, 적절하게.

동적 SQL 문은를 사용하여 안전하게 구성 할 수 있습니다형식함수 (참조섹션 9.4.1). 예를 들어:

형식 실행 ( 'TBL 세트 %I = %l'업데이트
   'key = %l', colname, newValue, keyValue);

%IQUOTE_INDEN%lQUOTE_NULLABLE. 그만큼형식함수는와 함께 사용할 수 있습니다.사용절 :

형식 실행 ( 'TBL 세트 업데이트 %i = $ 1 key = $ 2', colname)
   NewValue 사용, keyValue;

이 양식은 변수가 무조건 텍스트로 변환하여 텍스트로 변환하는 대신 기본 데이터 유형 형식으로 처리되기 때문에 더 좋습니다%l. 또한 더 효율적입니다.


동적 토토 핫의 훨씬 더 큰 예와execute예 43.10기능 만들기새 함수를 정의하도록 토토 핫.

43.5.5. 결과 상태 얻기

토토 핫의 효과를 결정하는 몇 가지 방법이 있습니다. 첫 번째 방법은를 사용하는 것입니다.진단 받기토토 핫, 양식이 있습니다.

get [현재] 진단variable= | : =항목[ , ... ];

이 토토 핫은 시스템 상태 표시기를 검색 할 수 있습니다.현재소음 단어입니다 (그러나 참조스택 진단 받기in섹션 43.6.8.1). 각항목지정된 상태 값을 식별하는 핵심 단어가변(이를 수신하기에 적합한 데이터 유형이어야 함). 현재 사용 가능한 상태 항목은에 표시됩니다.표 43.1. 결장 평등 (: =) SQL 표준 대신 사용할 수 있습니다=토큰. 예 :

진단 받기 integer_var = row_count;

표 43.1. 사용 가능한 진단 항목

이름 타입 설명
row_count bigint 가장 최근에 처리 된 행 수SQL토토 핫
PG_CONTEXT 텍스트 현재 통화 스택을 설명하는 텍스트의 줄 (참조섹션 43.6.9)

토토 핫의 효과를 결정하는 두 번째 방법은 명명 된 특수 변수를 확인하는 것입니다.발견, 유형의부울. 발견각각 내에서 거짓을 시작합니다pl/pgsql함수 호출. 다음 각 유형의 진술에 의해 설정됩니다.

  • a선택진술 세트발견행이 지정된 경우 true 행이 반환되지 않으면 거짓.

  • a공연토토 핫문 세트발견하나 이상의 행을 생성하고 폐기하는 경우, 행이 생성되지 않으면 거짓.

  • 업데이트, 삽입삭제진술 세트발견적어도 하나의 행에 영향을 미치는 경우, 행에 영향을 미치지 않으면 거짓.

  • aFetch진술 세트발견행을 반환하는 경우 true 행이 반환되지 않으면 false.

  • a움직임토토 핫문 세트발견Cursor를 성공적으로 재배치하면 그렇지 않으면 false.

  • afor또는foreach토토 핫문 세트발견하나 이상을 반복하면 true false.발견루프가 종료 될 때이 방식으로 설정됩니다. 루프 실행 내부에서발견루프 본문 내에서 다른 문의 실행에 의해 변경 될 수는 있지만 루프 문에 의해 수정되지는 않지만.

  • return queryreturn query execute진술 세트발견쿼리가 하나 이상의 행을 반환하는 경우, 행이 반환되지 않으면 false.

기타pl/pgsql진술은 상태를 변경하지 않습니다발견. 특히execute출력 변경진단 받기그러나 변경되지는 않습니다발견.

발견각각 내의 로컬 변수입니다pl/pgsql함수; 그것에 대한 모든 변경 사항은 현재 함수에만 영향을 미칩니다.

43.5.6. 전혀 아무것도하지 않는다

때로는 아무것도하지 않는 자리 표시 자 진술이 유용합니다. 예를 들어, if/the/else 체인의 한 팔이 의도적으로 비어 있음을 나타낼 수 있습니다. 이 목적을 위해 사용하십시오.NULL진술 :

null;

예를 들어, 다음 두 조각의 코드 조각은 동일합니다.

시작
    Y : = x / 0;
예외
    Division_by_zero가있을 때
        널;  - 오류를 무시하십시오
끝;
시작
    Y : = x / 0;
예외
    Division_By_Zero 일 때 - 오류를 무시하십시오
끝;

바람직한 맛의 문제입니다.

Note

Oracle의 PL/SQL에서 빈 토토 핫문 목록은 허용되지 않습니다.NULL진술은필수이와 같은 상황의 경우PL/PGSQL대신 아무것도 쓸 수 있습니다.

수정 제출

문서에 올바른 것이 없으면 일치하지 않습니다. 특정 기능에 대한 귀하의 경험 또는 추가 설명이 필요합니다. 사용이 양식문서 문제를보고하려면