기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.
Oracle Pro*C에서 로 레거시 애플리케이션 마이그레이션 ECPG
작성자: Sai Parthasaradhi(AWS) 및 Mahesh Balumuri(AWS)
환경: PoC 또는 파일럿 | 소스: Oracle | 대상: PostgreSQL |
R 유형: 리아키텍트 | 워크로드: Oracle | 기술: 마이그레이션, 데이터베이스 |
요약
SQL 코드가 포함된 대부분의 레거시 애플리케이션은 Oracle Pro*C 프리컴파일러를 사용하여 데이터베이스에 액세스합니다. 이러한 Oracle 데이터베이스를 PostgreSQL용 Amazon Relational Database Service(Amazon RDS) 또는 Amazon Aurora Postgre SQL호환 에디션으로 마이그레이션할 때는 애플리케이션 코드를 Postgre의 프리컴파일러와 호환되는 형식으로 변환해야 합니다SQLECPG. 이 패턴은 PostgreSQL 에서 Oracle Pro*C 코드를 동등한 코드로 변환하는 방법을 설명합니다ECPG.
Pro*C에 대한 자세한 내용은 Oracle 설명서를 참조하십시오. 에 대한 간략한 소개는 추가 정보 섹션을 ECPG참조하세요.
사전 조건 및 제한 사항
사전 조건
다음 섹션에 나열된 PostgreSQL 패키지입니다.
AWS CLI- AWS 명령줄 인터페이스(AWS CLI)는 명령줄 쉘의 명령을 통해 AWS 서비스와 상호 작용하기 위한 오픈 소스 도구입니다. 최소한의 구성으로 AWS CLI 명령 프롬프트에서 브라우저 기반 AWS Management Console에서 제공하는 것과 동등한 기능을 구현하는 명령을 실행할 수 있습니다.
에픽
작업 | 설명 | 필요한 기술 |
---|
PostgreSQL 패키지를 설치합니다. | 다음 명령을 사용하여 필요한 PostgreSQL 패키지를 설치합니다. yum update -y
yum install -y yum-utils
rpm -ivh https://download.postgresql.org/pub/repos/yum/reporpms/EL-8-x86_64/pgdg-redhat-repo-latest.noarch.rpm
dnf -qy module disable postgresql
| 앱 개발자, DevOps 엔지니어 |
헤더 파일 및 라이브러리를 설치합니다. | 다음 명령을 사용하여 헤더 파일 및 라이브러리가 포함된 postgresql12-devel 패키지를 설치합니다. 개발 환경과 런타임 환경 모두에 패키지를 설치하여 런타임 환경에서 오류가 발생하지 않도록 하십시오. dnf -y install postgresql12-devel
yum install ncompress zip ghostscript jq unzip wget git -y
개발 환경에서만 다음 명령도 실행합니다. yum install zlib-devel make -y
ln -s /usr/pgsql-12/bin/ecpg /usr/bin/
| 앱 개발자, DevOps 엔지니어 |
환경 경로 변수를 구성합니다. | PostgreSQL 클라이언트 라이브러리의 환경 경로를 설정합니다. export PATH=$PATH:/usr/pgsql-12/bin
| 앱 개발자, DevOps 엔지니어 |
필요에 따라 추가 소프트웨어를 설치합니다. | 필요한 경우 Oracle에서 SQL*로더를 대체pgLoader하여 를 설치합니다. wget -O /etc/yum.repos.d/pgloader-ccl.repo https://dl.packager.io/srv/opf/pgloader-ccl/master/installer/el/7.repo
yum install pgloader-ccl -y
ln -s /opt/pgloader-ccl/bin/pgloader /usr/bin/
Pro*C 모듈에서 Java 애플리케이션을 호출하려면 Java를 설치하십시오. yum install java -y
ant를 설치하여 자바 코드를 컴파일하십시오. yum install ant -y
| 앱 개발자, DevOps 엔지니어 |
를 설치합니다AWSCLI. | 를 설치AWSCLI하여 애플리케이션의 AWS Secrets Manager 및 Amazon Simple Storage Service(Amazon S3)와 같은 AWS 서비스와 상호 작용하는 명령을 실행합니다. cd /tmp/
curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"
unzip awscliv2.zip
./aws/install -i /usr/local/aws-cli -b /usr/local/bin --update
| 앱 개발자, DevOps 엔지니어 |
변활할 프로그램이 표시되어야 합니다. | Pro*C에서 로 변환하려는 애플리케이션을 식별합니다ECPG. | 앱 개발자, 앱 소유자 |
작업 | 설명 | 필요한 기술 |
---|
불필요한 헤더를 삭제합니다. | SQL, 및 와 같이 Postgre 에 필요하지 않은 include 헤더oci.h oratypes 를 제거합니다sqlda . | 앱 소유자, 앱 개발자 |
변수 선언을 업데이트합니다. | 호스트 변수로 사용되는 모든 변수 선언에 EXEC SQL 명령문을 추가합니다. 애플리케이션에서 다음과 같은 EXEC SQL VAR 선언을 제거합니다. EXEC SQL VAR query IS STRING(2048);
| 앱 개발자, 앱 소유자 |
ROWNUM 기능을 업데이트합니다. | Postgre 에서는 ROWNUM 함수를 사용할 수 없습니다SQL. 이를 SQL 쿼리의 ROW_NUMBER 창 함수로 바꿉니다. Pro*C 코드: SELECT SUBSTR(RTRIM(FILE_NAME,'.txt'),12) INTO :gcpclFileseq
FROM (SELECT FILE_NAME
FROM DEMO_FILES_TABLE
WHERE FILE_NAME LIKE '%POC%'
ORDER BY FILE_NAME DESC) FL2
WHERE ROWNUM <=1 ORDER BY ROWNUM;
ECPG 코드: SELECT SUBSTR(RTRIM(FILE_NAME,'.txt'),12) INTO :gcpclFileseq
FROM (SELECT FILE_NAME , ROW_NUMBER() OVER (ORDER BY FILE_NAME DESC) AS ROWNUM
FROM demo_schema.DEMO_FILES_TABLE
WHERE FILE_NAME LIKE '%POC%'
ORDER BY FILE_NAME DESC) FL2
WHERE ROWNUM <=1 ORDER BY ROWNUM;
| 앱 개발자, 앱 소유자 |
별칭 변수를 사용하도록 함수 파라미터를 업데이트합니다. | Postgre 에서는 SQL함수 파라미터를 호스트 변수로 사용할 수 없습니다. 별칭 변수를 사용하여 덮어씁니다. Pro*C 코드: int processData(int referenceId){
EXEC SQL char col_val[100];
EXEC SQL select column_name INTO :col_val from table_name where col=:referenceId;
}
ECPG 코드: int processData(int referenceIdParam){
EXEC SQL int referenceId = referenceIdParam;
EXEC SQL char col_val[100];
EXEC SQL select column_name INTO :col_val from table_name where col=:referenceId;
}
| 앱 개발자, 앱 소유자 |
구조 유형을 업데이트합니다. | struct 유형 변수가 호스트 변수로 사용되는 경우 typedef 를 사용하여 EXEC SQL BEGIN 및 END 블록에서 struct 유형을 정의합니다. 헤더(.h ) 파일에 struct 유형이 정의된 경우 EXEC SQL 명령문을 사용하여 파일을 포함합니다.
Pro*C 코드: 헤더 파일(demo.h ) struct s_partition_ranges
{
char sc_table_group[31];
char sc_table_name[31];
char sc_range_value[10];
};
struct s_partition_ranges_ind
{
short ss_table_group;
short ss_table_name;
short ss_range_value;
};
ECPG 코드: 헤더 파일(demo.h ) EXEC SQL BEGIN DECLARE SECTION;
typedef struct
{
char sc_table_group[31];
char sc_table_name[31];
char sc_range_value[10];
} s_partition_ranges;
typedef struct
{
short ss_table_group;
short ss_table_name;
short ss_range_value;
} s_partition_ranges_ind;
EXEC SQL END DECLARE SECTION;
Pro*C 파일(demo.pc ) #include "demo.h"
struct s_partition_ranges gc_partition_data[MAX_PART_TABLE] ;
struct s_partition_ranges_ind gc_partition_data_ind[MAX_PART_TABLE] ;
ECPG 파일(demo.pc ) exec sql include "demo.h"
EXEC SQL BEGIN DECLARE SECTION;
s_partition_ranges gc_partition_data[MAX_PART_TABLE] ;
s_partition_ranges_ind gc_partition_data_ind[MAX_PART_TABLE] ;
EXEC SQL END DECLARE SECTION;
| 앱 개발자, 앱 소유자 |
커서에서 가져오도록 로직을 수정합니다. | 배열 변수를 사용하여 커서에서 여러 열을 가져오려면 사용할 코드를 FETCH FORWARD 로 변경하십시오. Pro*C 코드: EXEC SQL char aPoeFiles[MAX_FILES][FILENAME_LENGTH];
EXEC SQL FETCH filename_cursor into :aPoeFiles;
ECPG 코드: EXEC SQL char aPoeFiles[MAX_FILES][FILENAME_LENGTH];
EXEC SQL int fetchSize = MAX_FILES;
EXEC SQL FETCH FORWARD :fetchSize filename_cursor into :aPoeFiles;
| 앱 개발자, 앱 소유자 |
반환 값이 없는 패키지 호출을 수정합니니다. | 반환 값이 없는 Oracle 패키지 함수는 표시 변수를 사용하여 직접적으로 호출해야 합니다. 애플리케이션에 이름이 같은 함수가 여러 개 포함되어 있거나 알 수 없는 형식 함수로 인해 런타임 오류가 발생하는 경우 값을 데이터 유형으로 타입캐스트합니다. Pro*C 코드: void ProcessData (char *data , int id)
{
EXEC SQL EXECUTE
BEGIN
pkg_demo.process_data (:data, :id);
END;
END-EXEC;
}
ECPG 코드: void ProcessData (char *dataParam, int idParam )
{
EXEC SQL char *data = dataParam;
EXEC SQL int id = idParam;
EXEC SQL short rowInd;
EXEC SQL short rowInd = 0;
EXEC SQL SELECT pkg_demo.process_data (
inp_data => :data::text,
inp_id => :id
) INTO :rowInd;
}
| 앱 개발자, 앱 소유자 |
SQL_CURSOR 변수를 다시 씁니다. | SQL_CURSOR 변수와 해당 구현을 다시 작성하십시오.
Pro*C 코드: /* SQL Cursor */
SQL_CURSOR demo_cursor;
EXEC SQL ALLOCATE :demo_cursor;
EXEC SQL EXECUTE
BEGIN
pkg_demo.get_cursor(
demo_cur=>:demo_cursor
);
END;
END-EXEC;
ECPG 코드: EXEC SQL DECLARE demo_cursor CURSOR FOR SELECT
* from
pkg_demo.open_filename_rc(
demo_cur=>refcursor
) ;
EXEC SQL char open_filename_rcInd[100];
# As the below function returns cursor_name as
# return we need to use char[] type as indicator.
EXEC SQL SELECT pkg_demo.get_cursor (
demo_cur=>'demo_cursor'
) INTO :open_filename_rcInd;
| 앱 개발자, 앱 소유자 |
일반적인 마이그레이션 패턴을 적용합니다. | Postgre 와 호환되도록 SQL 쿼리를 변경합니다SQL. 에서 지원되지 않는 익명 블록은 데이터베이스ECPG로 이동합니다. Postgre dbms_application_info 에서 지원하지 않는 로직을 제거합니다SQL. 커서가 닫힌 후 EXEC SQL COMMIT 명령문을 이동합니다. 루프 중에 쿼리를 커밋하여 커서에서 레코드를 가져오면 커서가 닫히고 커서가 존재하지 않음 오류가 표시됩니다. ECPG 및 오류 코드의 예외 처리에 대한 자세한 내용은 PostgreSQL 설명서의 오류 처리를 참조하세요.
| 앱 개발자, 앱 소유자 |
필요한 경우 디버깅을 활성화합니다. | 디버그 모드에서 ECPG 프로그램을 실행하려면 기본 함수 블록 내에 다음 명령을 추가합니다. ECPGdebug(1, stderr);
| 앱 개발자, 앱 소유자 |
작업 | 설명 | 필요한 기술 |
---|
에 대한 실행 파일을 생성합니다ECPG. | 라는 SQL C 소스 파일이 포함된 경우 다음 명령 시퀀스를 사용하여 실행 프로그램을 생성할 prog1.pgc 수 있습니다. ecpg prog1.pgc
cc -I/usr/local/pgsql/include -c prog1.c
cc -o prog1 prog1.o -L/usr/local/pgsql/lib -lecpg
| 앱 개발자, 앱 소유자 |
컴파일할 메이크 파일을 생성합니다. | 다음 샘플 파일에 표시된 대로 make 파일을 생성하여 ECPG 프로그램을 컴파일합니다. CFLAGS ::= $(CFLAGS) -I/usr/pgsql-12/include -g -Wall
LDFLAGS ::= $(LDFLAGS) -L/usr/pgsql-12/lib -Wl,-rpath,/usr/pgsql-12/lib
LDLIBS ::= $(LDLIBS) -lecpg
PROGRAMS = test
.PHONY: all clean
%.c: %.pgc
ecpg $<
all: $(PROGRAMS)
clean:
rm -f $(PROGRAMS) $(PROGRAMS:%=%.c) $(PROGRAMS:%=%.o)
| 앱 개발자, 앱 소유자 |
작업 | 설명 | 필요한 기술 |
---|
코드를 테스트합니다. | 변환된 애플리케이션 코드를 테스트하여 제대로 작동하는지 확인하십시오. | 앱 개발자, 앱 소유자, 테스트 엔지니어 |
관련 리소스
추가 정보
PostgreSQL에는 Oracle Pro*C SQL 프리컴파일러와 동일한 임베디드 프리컴파일러ECPG인 가 있습니다. ECPG 는 SQL 호출을 특수 함수 호출로 대체하여 SQL 문이 포함된 C 프로그램을 표준 C 코드로 변환합니다. 그러면 모든 C 컴파일러 툴 체인을 사용하여 출력 파일을 처리할 수 있습니다.
입력 및 출력 파일
ECPG 는 명령줄에 지정한 각 입력 파일을 해당 C 출력 파일로 변환합니다. 입력 파일 이름에 파일 확장자가 없는 경우에는 .pgc로 간주됩니다. 파일 확장자는 .c
로 대체되어 출력 파일 이름을 구성합니다. 그러나 -o
옵션을 사용하여 기본 출력 파일 이름을 재정의할 수 있습니다.
대시(-
)를 입력 파일 이름으로 사용하는 경우 옵션을 사용하여 재정의하지 않는 한 는 표준 입력에서 프로그램을 ECPG읽고 표준 출력에-o
씁니다.
헤더 파일
PostgreSQL 컴파일러가 사전 처리된 C 코드 파일을 컴파일하면 PostgreSQL include
디렉터리에서 ECPG 헤더 파일을 찾습니다. 따라서 컴파일러가 올바른 디렉터리(예: -I/usr/local/pgsql/include
)를 가리키도록 -I
옵션을 사용해야 할 수도 있습니다.
Libraries
내장 C 코드를 사용하는 프로그램은 라이브러리에libecpg
연결해야 SQL 합니다. 예를 들어 링커 옵션 -L/usr/local/pgsql/lib -lecpg
을 사용할 수 있습니다.
변환된 ECPG 애플리케이션은 임베디드 libpq
라이브러리(ecpglib
)를 통해 SQL 라이브러리의 함수를 호출하고 표준 프런트엔드/백엔드 프로토콜을 사용하여 PostgreSQL 서버와 통신합니다.