스클렉세츠

유효 기간

추출 및 복제

설명

SQLEXEC 매개변수를 사용하여 Oracle GoldenGate 처리 컨텍스트 내에서 내장 프로시저, 질의 또는 데이터베이스 명령을 실행할 수 있습니다. SQLEXEC Oracle GoldenGate는 데이터베이스와 직접 통신하여 데이터베이스에서 지원하는 작업을 수행할 수 있습니다. 이 작업은 열 변환에 대한 값 검색과 같은 동기화 프로세스의 일부일 수도 있고, 데이터베이스 내에서 작업을 실행하는 내장 프로시저 실행과 같은 데이터 추출 또는 복제와 무관할 수도 있습니다.

주: SQLEXEC는 최소한의 세계화 지원을 제공합니다. 소스 캡처의 캡처 매개변수 파일에 SQLEXEC를 사용하려면 소스 .prm 파일의 클라이언트 문자 집합이 소스 데이터베이스 문자 집합의 동일하거나 상위 집합인지 확인하십시오.

SQLEXEC는 다음과 같이 작동합니다.

주: SQLEXECONBEFOREIMAGE 매개변수는 이전 이미지 레코드에서 SQLEXEC 실행을 지원합니다.

주: EXEC 유형이 TRANSACTION, SOURCEROW 또는 ONCE인 경우 PK 업데이트 또는 통합 업데이트 레코드에서 SQLEXECONBEFOREIMAGE 매개변수가 무시됩니다.

독립형 SQLEXEC

독립형 SQLEXEC 매개변수는 매개변수 파일의 루트 레벨에서 사용되며 TABLE 또는 MAP 매개변수와 독립적으로 작동합니다. 다음은 독립형 SQLEXEC 매개변수 사용에 대한 지침입니다.

독립형 SQLEXEC 사용에 대한 추가 정보 얻기

SQLEXEC 사용 방법에 대한 자세한 내용은 SQLEXEC를 사용하여 명령, 내장 프로시저 및 질의 실행을 참조하십시오.

독립형 SQLEXEC 구문

SQLEXEC
{'call <procedure_name>()' | '<SQL_query>' | '<database_command>'}
[EVERY <n> {SECONDS | MINUTES | HOURS | DAYS}]
[ONEXIT]
[, THREADS (<threadID>[, <threadID>][, ...][, <thread_range>[, <thread_range>][, ...])]

'호출 <procedure_name ()'>

실행할 내장 프로시저의 이름을 지정합니다. 명령문을 작은 따옴표로 묶습니다. call 키워드는 필수입니다. 다음은 독립형 SQLEXEC를 사용하여 프로시저를 실행하는 방법의 예입니다.

SQLEXEC 'call prc_job_count ()'

<'SQL_query'>

실행할 질의의 이름을 지정합니다. query를 작은 따옴표로 묶습니다. 데이터베이스에 필요한 것과 동일한 형식으로 대소문자를 구분하는 객체 이름을 지정합니다. 다음은 독립형 SQLEXEC를 사용하여 질의를 실행하는 방법의 예입니다.

SQLEXEC ' select x from dual '

다중 행 쿼리의 경우 각 행에 작은 따옴표를 사용합니다. 최상의 결과를 얻으려면 각 시작 따옴표 다음에 각 끝 따옴표 앞에 공백을 입력하거나 적어도 각 끝 따옴표 앞에 공백을 입력하십시오.

<'database_command'>

데이터베이스 명령을 실행합니다. 다음은 독립형 SQLEXEC로 데이터베이스 명령을 실행하는 방법의 예입니다.

SQLEXEC 'SET TRIGGERS OFF'

EVERY <n> {SECONDS | MINUTES | HOURS | DAYS}

독립형 내장 프로시저나 질의가 정의된 간격으로 실행됩니다(예:

SQLEXEC 'call prc_job_count ()' EVERY 30 SECONDS

간격은 양의 정수여야 합니다.

ONEXIT

Extract 또는 Replicat 프로세스가 정상적으로 정지할 때 SQL을 실행합니다. 예:

SQLEXEC 'call prc_job_count ()' ONEXIT

THREADS (<threadID>[, <threadID>][, ...][, <thread_range>[, <thread_range>][, ...])

조정 Replicat의 지정된 스레드에만 SQLEXEC를 실행합니다.

<threadID>[, <threadID>][, ...]

스레드 ID 또는 threadID, threadID, threadID 형식의 콤마로 구분된 스레드 목록을 지정합니다.

[, <thread_range>[, <thread_range>][, ...]

threadIDlow-threadIDhigh 형식의 스레드 범위 또는 threadIDlow-threadIDhigh, threadIDlow-threadIDhigh 형식의 콤마로 구분된 범위 목록을 지정합니다.

threadID, threadID, threadIDlow-threadIDhigh 등의 형식 조합이 허용됩니다.

THREADS 절을 사용하지 않을 경우 ADD REPLICAT 명령으로 이 Replicat 그룹에 대해 구성된 모든 스레드에서 SQL이 실행됩니다. 그러나 SQL이 장벽 트랜잭션 기준을 충족하면 실제 스레드 매핑에 관계없이 전체 SQLEXEC 문이 스레드 0에 의해 처리됩니다.

TABLE 또는 MAP 파라미터의 SQLEXEC

TABLE 또는 MAP 매개변수의 SQLEXEC 매개변수를 사용하여 매개변수를 허용하거나 허용하지 않는 내장 프로시저 또는 질의를 실행할 수 있습니다. 다음은 MAP 또는 TABLE 문에서 사용될 때의 SQLEXEC 종속성 및 제한 사항입니다.

TABLE 또는 MAP의 SQLEXEC 구문

SQLEXEC (
{SPNAME <procedure_name>[, ID <logical_name>] |
   ID <logical_name>, QUERY ' <SQL_query> '}
{, PARAMS [OPTIONAL | REQUIRED] <parameter_name> = {<source_column> | <OGG_function>} |
   NOPARAMS}
[, AFTERFILTER | BEFOREFILTER]
[, ALLPARAMS {OPTIONAL | REQUIRED}]
[, ERROR {IGNORE | REPORT | RAISE | FINAL | FATAL}]
[, EXEC {MAP | ONCE | TRANSACTION | SOURCEROW}][, MAXVARCHARLEN <bytes>]
[, PARAMBUFSIZE <bytes>]
[, TRACE]
[, ...]
[, BEFORE_col1 = @BEFORE(col1),
)

SPNAME <procedure_name>[, ID <logical_name>]

내장 프로시저를 실행합니다.

SPNAME <procedure_name>

실행할 프로시저의 이름을 지정합니다.

다음 예제는 lookup라는 내장 프로시저의 단일 실행을 보여줍니다. 이 경우 프로시저의 실제 이름이 사용됩니다. 논리적 이름은 필요하지 않습니다.

SQLEXEC (SPNAME lookup), PARAMS (param1 = srccol)), &
COLMAP (targcol = lookup.param1);

ID <logical_name>

프로시저에 대한 선택적 논리적 이름을 정의합니다. 예를 들어, lookup라는 프로시저의 논리적 이름은 lookup1, lookup2 등일 수 있습니다. 이 옵션을 사용하여 MAP 문 내에서 프로시저를 여러 번 실행합니다. 프로시저는 MAP 문당 최대 20회 실행할 수 있습니다. 프로시저를 한 번 실행할 때는 ID가 필요하지 않습니다.

다음 예에서는 ID 옵션을 사용하여 조회 테이블에서 값을 가져오는 내장 프로시저의 다중 실행을 사용으로 설정하는 방법을 보여줍니다. 값은 대상 열에 매핑됩니다.

SQLEXEC (SPNAME lookup, ID lookup1, &
  PARAMS (long_name = current_residence_state)), &
SQLEXEC (SPNAME lookup, ID lookup2, &
  PARAMS (long_name = birth_state)), &
COLMAP (custid = custid, current_residence_state_long = lookup
1.long_name, & birth_state_long = lookup2.long_name);

`ID , QUERY ' '

질의를 실행합니다.

ID <logical_name>

질의에 대한 논리적 이름을 정의합니다. 질의 결과에서 값을 추출하려면 논리적 이름이 필요합니다. <ID logical_name>는 질의에서 반환된 열 값을 참조합니다.

QUERY '<SQL_query>'

데이터베이스에 대해 실행할 SQL 질의 구문을 지정합니다. 질의는 SELECT 문으로 결과를 반환하거나, INSERT, UPDATE 또는 DELETE 문을 실행할 수 있습니다. SELECT 문은 하나의 행만 반환해야 합니다. 다중 행이 반환되면 첫번째 행만 처리됩니다. SELECT statements.The 질의에 대해 INTO ... 절을 지정하지 마십시오. 질의가 실행 중인 데이터베이스에 대해 적합한 표준 질의 언어여야 합니다. 대부분의 질의에는 입력 매개변수에 대한 위치 표시자가 필요합니다. query 내에서 파라미터를 지정하는 방법은 다음과 같이 데이터베이스 유형에 따라 다릅니다.

'SELECT NAME FROM ACCOUNT WHERE SSN = :SSN AND ACCOUNT = :ACCT'
'SELECT NAME FROM ACCOUNT WHERE SSN = ? AND ACCOUNT = ?'

질의는 작은 따옴표 안에 한 행에 포함되어야 합니다. 데이터베이스의 파라미터 이름에는 따옴표가 필요하지 않습니다.

다음 예에서는 Oracle 및 SQL Server 쿼리에 대해 각각 SQLEXEC 쿼리를 사용하는 방법을 보여 줍니다.

Oracle 예제:

MAP sales.account, TARGET sales.newacct, &
  SQLEXEC (ID lookup, &
  QUERY 'select desc_col into desc_param from lookup_table &
  where code_col = :code_param', &
  PARAMS (code_param = account_code)), &
  COLMAP (newacct_id = account_id, newacct_val = lookup.desc_param);

SQL Server 예제:

MAP sales.account, TARGET sales.newacct, &
  SQLEXEC (ID lookup, &
  QUERY 'select desc_col into desc_param from lookup_table &
  where code_col = ?', &
  PARAMS (p1 = account_code)), &
  COLMAP (newacct_id = account_id, &
  newacct_val = lookup.desc_param);

PARAMS [OPTIONAL | REQUIRED] <parameter_name> = {<source_column> | <OGG_function>} | NOPARAMS

프로시저 또는 질의가 매개변수를 수락할지 여부를 정의하고, 예인 경우 매개변수를 입력 소스에 매핑합니다. PARAMS 절 또는 NOPARAMS를 사용해야 합니다.

OPTIONAL REQUIRED

매개변수 값이 누락된 경우 프로시저 또는 질의가 실행되는지 여부를 결정합니다.

OPTIONAL는 SQL 실행에 매개변수 값이 필요하지 않음을 나타냅니다. 데이터베이스 작업에서 필수 소스 열이 누락되었거나 소스 열이 누락되어 열 변환 함수를 성공적으로 완료할 수 없는 경우 SQL이 실행됩니다. OPTIONAL는 Oracle을 제외한 모든 데이터베이스에 대한 기본값입니다. Oracle의 경우 매개변수가 선택 사항인지 여부는 내장 프로시저 정의를 검색할 때 자동으로 결정됩니다.

REQUIRED는 매개변수 값이 있어야 함을 나타냅니다. 매개변수 값이 없으면 SQL이 실행되지 않습니다.

<parameter_name> = {<source_column> | <OGG_function>}

매개변수 이름을 입력을 제공하는 열 또는 함수에 매핑합니다. 다음 데이터 유형은 입력 및 출력 매개변수에 대해 SQLEXEC에서 지원됩니다.

<parameter_name>는 다음 중 하나임:

SQLEXEC (ID appphone, QUERY ' select per_type from ps_personal_data '
    ' where emplid = :vemplid '
    ' and per_status = 'N' and per_type = 'A' ',
    PARAMS (vemplid = emplid)),
TOKENS (applid = @GETVAL(appphone.per_type));
SQLEXEC (ID appphone, QUERY ' select per_type from ps_personal_data '
    ' where emplid = ? '
    ' and per_status = 'N' and per_type = 'A' ',
    PARAMS (p1 = emplid)),
TOKENS (applid = @GETVAL(appphone.per_type));

<source_column>는 입력을 제공하는 소스 열의 이름입니다. 기본적으로 지정된 열이 로그에 없는 경우(레코드에는 갱신된 열의 값만 포함됨) 이 매개변수는 프로시저 또는 매개변수 질의에 의해 지정된 기본값을 가정합니다.

<OGG_function>은 입력을 제공하기 위해 실행되는 Oracle GoldenGate 열 변환 함수의 이름입니다. "테이블 및 열 매핑 함수"를 참조하십시오.

내장 프로시저 또는 query의 출력 값을 입력으로 FILTER 또는 COLMAP 절에 전달하려면 다음 구문을 사용합니다.

{<procedure_name> | <logical_name>}.<parameter>

설명:

다음 예제는 Oracle 소스 및 대상 테이블 집합과 조회 테이블에 적용됩니다. 이 예제는 내장 프로시저의 단일 인스턴스 및 내장 프로시저의 다중 인스턴스에 대해 테이블 매개변수가 전달되는 방법을 보여줍니다.

소스 테이블 고객:

custid                     Number
current_residence_state    Char(2)
birth_state                Char(2)

대상 테이블 cust_extended:

custid                          Number
current_residence_state_long    Varchar(30)
birth_state_long                Varchar(30)

룩업 테이블 state_lookup

abbreviation     Char(2)
long_name        Varchar(30)

다음 예제는 한 번 실행하여 조회 테이블에서 값을 가져오는 내장 프로시저의 사용을 보여줍니다. cust 테이블의 레코드를 처리할 때 Oracle GoldenGate는 열 맵을 실행하기 전에 lookup 내장 프로시저를 실행합니다. 프로시저의 long_name 매개변수는 birth_state 소스 column.The 값의 입력을 COLMAP 문의 대상 열 birth_state_long에 매핑합니다.

MAP sales.cust, TARGET sales.cust_extended, &
SQLEXEC (SPNAME lookup, &
PARAMS (long_name = birth_state)), &
COLMAP (custid = custid, &
birth_state_long = lookup.long_name);

다음 예에서는 ID 옵션을 사용하여 조회 테이블에서 값을 가져오는 내장 프로시저의 다중 실행을 사용으로 설정하는 방법을 보여줍니다. 값은 대상 열에 매핑됩니다.

MAP sales.cust, TARGET sales.cust_extended, &
SQLEXEC (SPNAME lookup, ID lookup1, &
PARAMS (long_name = current_residence_state)), &
SQLEXEC (SPNAME lookup, ID lookup2, &
PARAMS (long_name = birth_state)), &
COLMAP (custid = custid, current_residence_state_long = lookup1.long_name, & birth_state_long = lookup2.long_name);
AFTERFILTER BEFOREFILTER

AFTERFILTER 및 BEFOREFILTER를 사용하여 MAP 문의 FILTER 절과 관련하여 내장 프로시저 또는 질의를 실행할 시기를 지정합니다.

AFTERFILTER

FILTER 문 뒤에 SQL이 실행되도록 합니다. 이렇게 하면 필터가 성공하지 못할 경우 SQL 실행 오버헤드를 건너뛸 수 있습니다. 이는 기본값입니다.

BEFOREFILTER

필터에서 결과를 사용할 수 있도록 FILTER 문 앞에 SQL이 실행되도록 합니다.

다음은 BEFOREFILTER를 사용하는 예제입니다.

SQLEXEC (SPNAME check, NOPARAMS, BEFOREFILTER)
ALLPARAMS [OPTIONAL REQUIRED]

ALLPARAMS를 내장 프로시저 또는 질의를 실행하기 위해 지정된 모든 매개변수가 존재해야 하는지 여부를 결정하는 전역 규칙으로 사용합니다. PARAMS 절 내에 설정된 개별 매개변수에 대한 규칙은 전역 규칙 집합을 ALLPARAMS로 대체합니다.

OPTIONAL

SQL에서 모든 파라미터가 있는지 여부를 실행할 수 있습니다. 이는 기본값입니다.

REQUIRED

SQL을 실행하려면 모든 파라미터가 있어야 합니다.

다음은 OPTIONAL를 사용하는 예제입니다.

SQLEXEC (SPNAME lookup,
PARAMS (long_name = birth_state, short_name = state),
ALLPARAMS OPTIONAL)
ERROR {IGNORE REPORT RAISE FINAL FATAL}

ERROR를 사용하여 내장 프로시저 또는 질의와 연관된 오류에 대한 응답을 정의합니다. 명시적 오류 처리가 없으면 Oracle GoldenGate 프로세스가 오류 시 비정상 종료됩니다. 프로시저에서 오류를 반환하는지 확인하고 ERROR를 사용하여 응답을 지정합니다.

Oracle GoldenGate 21c를 사용하면 SQL 유형 오류에 따라 다양한 동작을 지정할 수 있습니다.

다음 예제는 내장 프로시저 조회를 실행할 때 SQL 오류 코드 1403 또는 1405가 감지될 때 비정상 종료 ER 프로세스를 보여줍니다. 다른 모든 오류가 보고되고 복제가 계속됩니다.

SQLEXEC ( SPNAME lookup,
  PARAMS( long_name = birth_state, short_name = state),
  ERROR REPORT, ERROR FATAL (1403, 1405) );

IGNORE

Oracle GoldenGate가 내장 프로시저 또는 질의와 연관된 모든 오류를 무시하고 처리를 계속하도록 합니다. 결과 매개변수 추출로 인해 "열 누락" 조건이 발생합니다. 이는 기본값입니다.

REPORT

내장 프로시저 또는 query와 연관된 모든 오류가 폐기 파일에 보고되도록 합니다. 보고서는 오류의 원인을 추적하는 데 유용합니다. 여기에는 오류 설명과 프로시저 또는 query에 전달되는 파라미터의 값이 모두 포함됩니다. Oracle GoldenGate는 오류를 보고한 후 처리를 계속합니다.

RAISE

REPERROR 매개변수로 설정된 규칙에 따라 오류를 처리합니다. Oracle GoldenGate는 오류를 처리하기 전에 현재 MAP 문과 연관된 다른 내장 프로시저 또는 질의를 계속 처리합니다.

FINAL

프로시저 또는 질의와 연관된 오류가 발생하면 나머지 내장 프로시저 및 질의가 생략된다는 점을 제외하면 RAISE와 유사합니다. 오류 처리가 오류 직후 호출됩니다.

FATAL

프로시저 또는 질의와 연관된 오류가 발생하는 즉시 Oracle GoldenGate가 비정상 종료되도록 합니다.

EXEC {MAP ONCE TRANSACTION SOURCEROW}

출력 매개변수를 추출하는 경우 EXEC를 사용하여 MAP 문의 내장 프로시저 또는 질의가 실행되는 빈도 및 결과가 적합한 것으로 간주되는 기간을 제어합니다.

MAP

지정된 각 소스-대상 테이블 맵에 대해 프로시저 또는 질의를 한 번 실행합니다. MAP를 사용하면 소스 테이블이 동일한 후속 맵에 대해 부적합한 결과가 렌더링됩니다. MAP가 기본값입니다.

다음 예에서는 기본값 MAP의 잘못된 사용을 보여줍니다. MAP가 기본값이므로 SQLEXEC 문에 명시적으로 나열할 필요가 없습니다. 이 예제에서 소스 테이블은 별도의 MAP 매개변수로 서로 다른 두 대상 테이블에 매핑됩니다. 이 경우 결과는 첫번째 매핑에 대해서만 유효합니다. lookup 프로시저의 결과는 두번째 MAP 매개변수가 실행될 때까지 만료되며, 두번째 MAP는 "열 누락" 조건을 생성합니다. 각 MAP가 적합한 결과를 반환하도록 올바르게 구현하려면 SOURCEROW를 사용해야 합니다.

MAP sales.srctab, TARGET sales.targtab, &
SQLEXEC (SPNAME lookup, PARAMS (param1 = srccol)), &
COLMAP (targcol = lookup.param2);

MAP sales.srctab, TARGET sales.targtab2, &
COLMAP (targcol2 = lookup.param2);

ONCE

연관된 MAP 문을 처음 호출할 때 Oracle GoldenGate 실행 과정에서 프로시저 또는 질의를 한 번 실행합니다. 결과는 프로세스가 실행 중인 동안 유효합니다.

다음은 ONCE 사용 예제입니다.

MAP sales.cust, TARGET sales.cust_extended, &
SQLEXEC (SPNAME lookup, PARAMS (long_name = birth_state), EXEC ONCE), &
COLMAP (custid = custid, &
birth_state_long = lookup.long_name);

TRANSACTION

소스 트랜잭션당 프로시저 또는 질의를 한 번 실행합니다. 결과는 트랜잭션의 모든 작업에 대해 유효합니다.

다음은 TRANSACTION 사용 예제입니다.

MAP sales.cust, TARGET sales.cust_extended, &
SQLEXEC (SPNAME lookup, PARAMS (long_name = birth_state), EXEC TRANSACTION), &
COLMAP (custid = custid, &
birth_state_long = lookup.long_name);

SOURCEROW

소스 행 작업당 한 번씩 프로시저 또는 질의를 실행합니다. 소스 테이블을 둘 이상의 대상 테이블과 동기화하는 경우 각 소스-대상 매핑에 대해 프로시저 또는 질의 결과가 호출되도록 이 옵션을 사용합니다.

다음은 SOURCEROW 사용 예제입니다. 이 경우 프로시저는 모든 소스 행 작업에서 실행되므로 두번째 맵은 유효한 값을 반환합니다.

MAP sales.srctab, TARGET sales.targtab, &
SQLEXEC (SPNAME lookup, PARAMS (param1 = srccol), EXEC SOURCEROW), &
COLMAP (targcol = lookup.param2);

MAP sales.srctab, TARGET sales.targtab2, &
COLMAP (targcol2 = lookup.param2);

MAXVARCHARLEN <bytes>

MAXVARCHARLEN를 사용하여 내장 프로시저 또는 질의에 있는 매개변수의 출력 값에 대해 할당되는 최대 바이트 길이를 지정합니다. 이 최대값을 초과하면 출력 값이 잘립니다. 기본값은 명시적 MAXVARCHARLEN 절이 없는 255바이트입니다. 유효한 값 범위는 50-32767바이트입니다.

다음 예에서는 출력 값의 바이트 길이를 100으로 제한합니다.

MAXVARCHARLEN 100

PARAMBUFSIZE <bytes>

PARAMBUFSIZE를 사용하여 입력 및 출력 매개변수를 포함하여 SQLEXEC 매개변수 정보를 저장하는 메모리 버퍼에 허용되는 최대 바이트 수를 지정합니다. 기본값은 명시적 PARAMBUFSIZE 절이 없는 10,000바이트입니다. 유효한 값 범위는 1000 ~ 2000000바이트입니다. Oracle GoldenGate는 매개변수에 할당된 메모리가 최대값의 500바이트 이내일 때마다 경고를 표시합니다.

다음 예에서는 버퍼를 15,000바이트로 늘립니다.

PARAMBUFSIZE 15000
TRACE {ALL ERROR}

TRACE를 사용하여 SQLEXEC 입력 및 출력 매개변수를 보고서 파일에 기록합니다.

다음은 SQLEXEC 추적이 사용으로 설정된 샘플 보고서 파일입니다.

Input parameter values...
LMS_TABLE: INTERACTION_ATTR_VALUES
   KEY1: 2818249
  KEY2: 1
Report File:
From Table MASTER.INTERACTION_ATTR_VALUES to MASTER.INTERACTION_ATTR_VALUES:
       #  inserts:      0
       #  updates:      0
       #  deletes:      0
       #  discards:     1

  Stored procedure GGS_INTERACTION_ATTR_VALUES:
       attempts:        2
       successful:      0

ALL

프로시저 또는 질의의 각 호출에 대한 입력 및 출력 매개변수를 보고서 파일에 기록합니다. 이는 기본값입니다.

ERROR

SQL 오류가 발생한 후에만 프로시저 또는 질의의 각 호출에 대한 입력 및 출력 매개변수를 보고서 파일에 기록합니다.