Oracle GoldenGate 매크로로 작업 간소화 및 자동화
매개변수 파일에서 Oracle GoldenGate 매크로를 사용하여 매개변수, 명령 및 변환 함수를 구성하고 재사용할 수 있습니다. 공통 태스크를 수행하기 위해 입력해야 하는 텍스트의 양을 줄이십시오. 매크로는 Oracle GoldenGate 매개변수 파일 내에서 저장된 처리 단계 세트를 호출할 수 있는 내장 자동화 도구입니다. 매크로는 매개변수 대체, 계산 또는 변환의 복잡한 시리즈에 자주 사용되는 매개변수 명령문의 간단한 세트로 구성될 수 있습니다. 매크로에서 다른 매크로를 호출할 수 있습니다. 일반적으로 사용되는 매크로를 라이브러리에 저장한 다음 매크로를 개별적으로 호출하는 대신 라이브러리를 호출할 수 있습니다.
Oracle GoldenGate 매크로는 다음 매개변수 파일에서 작동합니다.
-
데프겐
-
Extract
-
Replicat
매크로를 사용하는 단계에는 다음 두 가지가 있습니다.
-
매크로 정의
-
매크로 호출
매크로 정의
Oracle GoldenGate 매크로를 정의하려면 매개변수 파일에 MACRO 매개변수를 사용하십시오. MACRO는 필요한 모든 입력 매개변수를 정의하며 매크로가 수행하는 작업을 정의합니다.
구문
<pre class="copy"><code>MACRO #*macro_name* PARAMS (#*p1*, #*p2* [, ...]) BEGIN *macro_body* END;</code></pre>
표 18 매크로 정의 인수
| 인수 | 설명 |
|---|---|
|
필수입니다. Oracle GoldenGate 매크로 정의의 시작을 나타냅니다. |
|
매크로의 이름입니다. 매크로 및 매개변수 이름은 매크로 문자로 시작해야 합니다. 기본 매크로 문자는 매크로 또는 매개변수 이름은 문자와 숫자로 구성된 한 단어이거나 둘 다일 수 있습니다. 밑줄 문자( 구문 분석 오류를 방지하기 위해 매크로 문자를 매크로 이름의 첫 문자로 사용할 수 없습니다. 예를 들어, 매크로 및 매개변수 이름은 대소문자를 구분하지 않습니다. 따옴표 안에 있는 매크로 또는 매개변수 이름은 무시됩니다. |
PARAMS (# |
입력 매개변수의 선택적 정의입니다. 콤마로 구분된 매개변수 이름 목록을 지정하고 괄호 안에 묶습니다. 입력 값을 대체할 매크로 본문에서 각 매개변수를 참조해야 합니다. 각 매개변수를 별도의 행에 나열하여 가독성을 높일 수 있습니다(열기 및 닫기 괄호를 사용하여 매개변수 목록을 묶어야 함). 자세한 내용은 매개변수를 포함하는 매크로 호출을 참조하십시오. |
BEGIN |
매크로 본문을 시작합니다. 매크로 본문 앞에 지정되어야 합니다. |
|
매크로 본문입니다. 본문은 매크로가 수행할 함수를 정의하는 구문 문입니다. 매크로 본문은 다음 유형의 명령문을 포함할 수 있습니다.
|
|
매크로 정의를 종료합니다. 정의를 완료하려면 세미콜론이 필요합니다. |
다음은 매개변수를 포함하는 매크로 정의의 예입니다. 이 경우 매크로는 MAP 문의 기본 구문에 소유자, 테이블 및 KEYCOLS 열의 이름으로 분석되는 입력 매개변수를 제공하여 객체 및 열 매핑 작업을 단순화합니다.
<pre class="copy"><code>MACRO #macro1 PARAMS ( #o, #t, #k ) BEGIN MAP #o.#t, TARGET #o.#t, KEYCOLS (#k), COLMAP (USEDEFAULTS); END;</code></pre>
다음은 매개변수를 정의하지 않는 매크로의 예입니다. 자주 사용되는 파라미터 집합을 실행합니다.
MACRO #option_defaults
BEGIN
GETINSERTS
GETUPDATES
GETDELETES
INSERTDELETES
END;
매크로 호출
매크로를 호출하려면 매개변수 파일 내에서 매크로를 실행할 다음 구문을 사용합니다.
구문
[*target* =] *macro_name* (*val*[, ...])
[*target* =] *macro_name* (*val* | {*val*, *val*, ...}[, ...])
표 19 매크로 호출 구문 요소
| 인수 | 설명 |
|---|---|
| 대상 = | 선택 사항입니다. 매크로 결과가 지정되거나 매핑되는 대상을 지정합니다. 예를 들어, 대상이 없으면 |
| macro_name | 호출되는 매크로의 이름(예: #make_date)입니다. |
( 값[, ...]) |
매개변수 입력 값입니다. 매크로가 매개변수를 정의하는지 여부에 관계없이 이 구성요소가 필요합니다. 매크로에서 매개변수를 정의하는 경우 MACRO 매개변수의 매개변수 정의에 해당하는 순서대로 쉼표로 구분된 입력 값 목록을 지정하고 목록을 괄호 안에 묶습니다. 매크로에서 매개변수를 정의하지 않을 경우 여는 괄호와 닫는 괄호 사이에 아무 것도 지정하지 않습니다(). |
( val(평가) \| {val(평가), val(평가), ...} )[, ...] |
매개변수 입력 값입니다. 매크로가 매개변수를 정의하는지 여부에 관계없이 이 구성요소가 필요합니다. 매크로에서 매개변수를 정의하는 경우 MACRO 매개변수의 매개변수 정의에 해당하는 순서대로 쉼표로 구분된 입력 값 목록을 지정하고 목록을 괄호 안에 묶습니다. 여러 값을 하나의 매개변수로 전달하려면 쉼표로 구분하고 목록을 중괄호 안에 묶습니다. 매크로에서 매개변수를 정의하지 않을 경우 여는 괄호와 닫는 괄호 사이에 아무 것도 지정하지 않습니다(). |
매크로 호출 구문에 대한 자세한 내용은 다음 항목을 참조하십시오.
파라미터를 포함하는 매크로 호출
매개변수가 포함된 매크로를 호출하려면 호출 명령문이 매크로 실행 시 해당 매개변수에 대해 대체될 입력 값을 제공해야 합니다.
매크로 매개변수에 적합한 입력은 다음 중 하나이며 앞에 매크로 문자가 옵니다(기본값 #).
-
#macro (#name, #address, #phone)또는#macro (#"name", #"address", #"phone")와 같이 일반 텍스트 또는 따옴표로 묶인 텍스트의 단일 값입니다. -
쉼표로 구분된 괄호 안에 포함된 값 목록(예:
#macro1 (SCOTT, DEPT, {DEPTNO1, DEPTNO2, DEPTNO3}))입니다. 지정된 매개변수에 대해 값 블록을 대체하는 기능은 Oracle GoldenGate 구성에서 매크로 정의 및 유용성에 유연성을 더합니다. -
#macro (#mycalc (col2, 100), #total)와 같은 다른 매크로에 호출합니다. 이 예에서#mycalc매크로는col2및100의 입력 값으로 호출됩니다.
Oracle GoldenGate는 다음 규칙에 따라 매크로 본문 내의 매개변수 값을 대체합니다.
-
매크로 프로세서는 매크로 본문을 통해
PARAMS문에 지정된 매개변수 이름의 인스턴스를 찾습니다. -
파라미터 이름이 나올 때마다 호출 중에 지정된 해당 파라미터 값이 치환됩니다.
-
매개변수 이름이
PARAMS문에 나타나지 않으면 매크로 프로세서는 항목이 다른 매크로에 대한 호출인지 여부를 평가합니다. Calling Other Macros from a Macro을 참조하십시오. 호출이 성공하면 중첩된 매크로가 실행됩니다. 실패하면 전체 매크로가 실패합니다.
예제 9-39: 매개변수를 사용하여 MAP 문 채우기
다음 매크로 정의는 분석해야 하는 세 개의 매개변수를 지정합니다. 매개변수는 MAP 문에서 테이블 소유자 이름(매개변수 #o), 테이블(매개변수 #t) 및 KEYCOLS 열(매개변수 #k)을 대체합니다.
MACRO #macro1 PARAMS ( #o, #t, #k ) BEGIN MAP #o.#t, TARGET #o.#t, KEYCOLS (#k), COLMAP (USEDEFAULTS); END;
MAP 문의 테이블에 KEYCOLS 열이 하나만 필요하다고 가정할 경우 다음 구문을 사용하여 #macro1를 호출할 수 있습니다. 이 구문에서 #k 매개변수는 하나의 값으로만 분석할 수 있습니다.
#macro1 (SCOTT, DEPT, DEPTNO1)
두 개의 KEYCOLS 열이 필요한 테이블에 대해 매크로를 호출하기 위해 다음과 같이 중괄호가 사용되어 열 이름에 필요한 두 값을 모두 묶습니다.
#macro1 (SCOTT, DEPT, {DEPTNO1, DEPTNO2})
#t 매개변수를 분석하기 위해 DEPTNO1 및 DEPTNO2 값이 하나의 인수로 전달됩니다. KEYCOLS가 3개 이상인 테이블도 중괄호 안에 추가 값을 사용하여 이러한 방식으로 처리할 수 있습니다.
예 9-40 매크로를 사용하여 변환 수행
이 예에서 매크로는 #year, #month 및 #day 매개변수를 정의하여 고유 날짜 형식을 변환합니다.
MACRO #make_date
PARAMS (#year, #month, #day)
BEGIN
@DATE ('YYYY-MM-DD', 'CC', @IF (#year < 50, 20, 19), 'YY', #year, 'MM', #month, 'DD', #day)
END;
매크로는 COLMAP 절에서 호출됩니다.
MAP sales.acct_tab, TARGET sales.account,
COLMAP
(
targcol1 = sourcecol1,
datecol1 = #make_date(YR1, MO1, DAY1),
datecol2 = #make_date(YR2, MO2, DAY2)
);
매크로는 다음과 같이 확장됩니다.
MAP sales.acct_tab, TARGET sales.account,
COLMAP
(
targcol1 = sourcecol1,
datecol1 = @DATE ('YYYY-MM-DD', 'CC', @IF (YR1 < 50, 20, 19),'YY', YR1, 'MM', MO1, 'DD', DAY1),
datecol2 = @DATE ('YYYY-MM-DD', 'CC', @IF (YR2 < 50, 20, 19),'YY', YR2, 'MM', MO2, 'DD', DAY2)
);
입력 매개변수 없이 매크로 호출
입력 매개변수 없이 매크로를 호출하려면 호출 문이 열린 괄호와 닫힌 괄호를 제공해야 하지만 입력 값(#macro ())은 제공하지 않아야 합니다.
다음 매크로는 입력 매개변수 없이 정의됩니다. 본문은 자주 사용되는 매개변수를 포함합니다.
MACRO #option_defaults
BEGIN
GETINSERTS
GETUPDATES
GETDELETES
INSERTDELETES
END;
이 매크로를 다음과 같이 호출합니다.
#option_defaults ()
IGNOREUPDATES
MAP owner.srctab, TARGET owner.targtab;
#option_defaults ()
MAP owner.srctab2, TARGET owner.targtab2;
매크로는 다음과 같이 확장됩니다.
GETINSERTS
GETUPDATES
GETDELETES
INSERTDELETES
IGNOREUPDATES
MAP owner.srctab, TARGET owner.targtab;
GETINSERTS
GETUPDATES
GETDELETES
INSERTDELETES
MAP owner.srctab2, TARGET owner.targtab2;
매크로에서 다른 매크로 호출
매크로에서 다른 매크로를 호출하려면 다음과 유사한 매크로 정의를 만듭니다. 이 예에서 #make_date 매크로는 #assign_date 매크로 내에 중첩되며 #assign_date가 실행될 때 호출됩니다.
중첩된 매크로는 기본 매크로에 정의된 동일한 매개변수의 전체 또는 하위 세트를 정의해야 합니다. 즉, 기본 매크로가 호출될 때의 입력 값은 두 매크로의 매개변수로 분석되어야 합니다.
다음은 #assign_date를 정의합니다.
MACRO #assign_date
PARAMS (#target_col, #year, #month, #day)
BEGIN
#target_col = #make_date (#year, #month, #day)
END;
다음은 #make_date를 정의합니다. 이 매크로는 2자리 입력 날짜 앞에 세기 값 19 또는 20을 붙여야 하는지 여부를 결정한 후 4자리 연도를 포함하는 날짜 형식을 생성합니다. #make_date의 PARAMS 문은 #assign_date 매크로에 매개변수의 하위 세트를 포함합니다.
MACRO #make_date
PARAMS (#year, #month, #day)
BEGIN
@DATE ('YYYY-MM-DD', 'CC', @IF (#year < 50, 20, 19), 'YY', #year, 'MM', #month, 'DD', #day)
END;
다음 구문은 #assign_date를 호출합니다.
#assign_date (COL1, YEAR, MONTH, DAY)
매크로는 앞의 입력 값과 포함된 #make_date 매크로가 제공된 다음으로 확장됩니다.
COL1 = @DATE ('YYYY-MM-DD', 'CC', @IF (YEAR < 50, 20, 19),'YY', YEAR, 'MM', MONTH, 'DD', DAY)
매크로 라이브러리 생성
매크로가 하나 이상 포함된 매크로 라이브러리를 만들 수 있습니다. 매크로 라이브러리를 사용하면 매크로를 한 번 정의한 다음 여러 매개변수 파일 내에서 사용할 수 있습니다.
매크로 라이브러리 만들기
-
텍스트 편집기에서 새 파일을 엽니다.
-
필요한 경우 주석 처리된 행을 사용하여 라이브러리를 설명합니다.
-
다음 구문을 사용하여 각 매크로를 정의합니다.
MACRO #*macro_name* PARAMS (#*p1*, #*p2* [, ...]) BEGIN *macro_body* END; -
파일을 Oracle GoldenGate 디렉토리의
dirprm하위 디렉토리에 다음과 같이 저장합니다.*filename*.mac설명:
filename은 파일의 이름입니다.
.mac확장자는 파일을 매크로 라이브러리로 정의합니다.
datelib라는 다음 샘플 라이브러리에는 #make_date 및 #assign_date라는 두 개의 매크로가 포함되어 있습니다.
-- datelib macro library
--
MACRO #make_date
PARAMS (#year, #month, #day)
BEGIN
@DATE ('YYYY-MM-DD', 'CC', @IF (#year < 50, 20, 19), 'YY', #year, 'MM', #month, 'DD', #day)
END;
MACRO #assign_date
PARAMS (#target_col, #year, #month, #day)
BEGIN
#target_col = #make_date (#year, #month, #day)
END;
매크로 라이브러리를 사용하려면 다음 샘플 Replicat 매개변수 파일에 표시된 대로 매개변수 파일 시작 부분에 있는 INCLUDE 매개변수를 사용합니다.
INCLUDE /ggs/dirprm/datelib.mac
REPLICAT rep
ASSUMETARGETDEFS
USERIDALIAS ogg
MAP fin.acct_tab, TARGET fin.account;
매개변수 파일에 긴 매크로 라이브러리를 포함하는 경우 NOLIST 매개변수를 사용하여 Extract 또는 Replicat 보고서 파일에서 각 매크로 목록을 표시하지 않을 수 있습니다. LIST 및 NOLIST 매개변수를 매개변수 파일 내 또는 매크로 라이브러리 파일 내 임의의 위치에 배치하여 목록을 설정 및 해제할 수 있습니다. 다음 예에서 NOLIST는 hugelib 매크로 라이브러리의 각 매크로 목록을 표시하지 않습니다. INCLUDE 문 뒤에 LIST를 지정하면 보고서 파일에 일반 목록이 복원됩니다.
NOLIST
INCLUDE /ggs/dirprm/hugelib.mac
LIST
INCLUDE /ggs/dirprm/mdatelib.mac
REPLICAT REP
매크로 확장 추적
CMDTRACE 매개변수를 사용하여 매크로 확장을 추적할 수 있습니다. CMDTRACE가 사용으로 설정된 경우 Extract 또는 Replicat 보고서 파일에 매크로 확장 단계가 표시됩니다.
구문
CMDTRACE [ON | OFF | DETAIL]
설명:
-
ON는 추적을 사용으로 설정합니다. -
OFF는 추적을 사용 안함으로 설정합니다. -
DETAIL는 매크로 확장의 상세 정보 표시를 생성합니다.
다음 예에서는 #testmac가 호출되기 전에 추적이 사용으로 설정된 다음 매크로 실행 후 사용 안함으로 설정됩니다.
<pre class="copy"><code>REPLICAT REP MACRO #testmac BEGIN COL1 = COL2, COL3 = COL4, END; ... CMDTRACE ON MAP test.table1, TARGET test.table2, COLMAP (#testmac); CMDTRACE OFF</code></pre>