Migrasi aplikasi lama dari Oracle Pro*C ke ECPG - AWS Prescriptive Guidance

Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.

Migrasi aplikasi lama dari Oracle Pro*C ke ECPG

Sai Parthasaradhi dan Mahesh Balumuri, Amazon Web Services

Ringkasan

Sebagian besar aplikasi lama yang telah tertanam kode SQL menggunakan precompiler Oracle Pro*C untuk mengakses database. Ketika Anda memigrasikan database Oracle ini ke Amazon Relational Database Service (Amazon RDS) untuk PostgreSQL atau Amazon Aurora PostgreSQL Compatible Edition, Anda harus mengonversi kode aplikasi Anda ke format yang kompatibel dengan precompiler di PostgreSQL, yang disebut ECPG. Pola ini menjelaskan cara mengonversi kode Oracle Pro*C ke padanannya di PostgreSQL ECPG. 

Untuk informasi selengkapnya tentang Pro*C, lihat dokumentasi Oracle. Untuk pengantar singkat tentang ECPG, lihat bagian Informasi tambahan.

Prasyarat dan batasan

Prasyarat

  • Akun AWS yang aktif

  • Database yang kompatibel dengan Amazon RDS for PostgreSQL atau Aurora PostgreSQL

  • Database Oracle berjalan di tempat

Alat

  • Paket PostgreSQL tercantum di bagian berikutnya.

  • AWS CLI — AWS Command Line Interface (AWS CLI) Command Line Interface (AWS CLI) adalah alat sumber terbuka untuk berinteraksi dengan layanan AWS melalui perintah di shell baris perintah Anda. Dengan konfigurasi minimal, Anda dapat menjalankan perintah AWS CLI yang menerapkan fungsionalitas yang setara dengan yang disediakan oleh AWS Management Console berbasis browser dari prompt perintah.

Epik

TugasDeskripsiKeterampilan yang dibutuhkan
Instal paket PostgreSQL.

Instal paket PostgreSQL yang diperlukan dengan menggunakan perintah berikut.

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
Pengembang aplikasi, DevOps insinyur
Instal file header dan pustaka.

Instal postgresql12-devel paket, yang berisi file header dan pustaka, dengan menggunakan perintah berikut. Instal paket di lingkungan pengembangan dan runtime untuk menghindari kesalahan di lingkungan runtime.

dnf -y install postgresql12-devel yum install ncompress zip ghostscript jq unzip wget git -y

Untuk lingkungan pengembangan saja, jalankan juga perintah berikut.

yum install zlib-devel make -y ln -s /usr/pgsql-12/bin/ecpg /usr/bin/
Pengembang aplikasi, DevOps insinyur
Konfigurasikan variabel jalur lingkungan.

Mengatur jalur lingkungan untuk pustaka klien PostgreSQL.

export PATH=$PATH:/usr/pgsql-12/bin
Pengembang aplikasi, DevOps insinyur
Instal perangkat lunak tambahan seperlunya.

Jika diperlukan, instal pgLoader sebagai pengganti SQL* loader di Oracle.

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/

Jika Anda memanggil aplikasi Java apa pun dari modul Pro* C, instal Java.

yum install java -y

Instal ant untuk mengkompilasi kode Java.

yum install ant -y
Pengembang aplikasi, DevOps insinyur
Instal AWS CLI.

Instal AWS CLI untuk menjalankan perintah agar berinteraksi dengan layanan AWS seperti AWS Secrets Manager dan Amazon Simple Storage Service (Amazon S3) dari aplikasi Anda.

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
Pengembang aplikasi, DevOps insinyur
Identifikasi program yang akan dikonversi.

Identifikasi aplikasi yang ingin Anda konversi dari Pro* C ke ECPG.

Pengembang aplikasi, Pemilik aplikasi
TugasDeskripsiKeterampilan yang dibutuhkan
Hapus header yang tidak diinginkan.

Hapus include header yang tidak diperlukan di PostgreSQL, seperti,, dan. oci.h oratypes sqlda

Pemilik aplikasi, Pengembang aplikasi
Perbarui deklarasi variabel.

Tambahkan EXEC SQL pernyataan untuk semua deklarasi variabel yang digunakan sebagai variabel host.

Hapus EXEC SQL VAR deklarasi seperti berikut ini dari aplikasi Anda.

EXEC SQL VAR query IS STRING(2048);
Pengembang aplikasi, Pemilik aplikasi
Perbarui fungsionalitas ROWNUM.

ROWNUMFungsi ini tidak tersedia di PostgreSQL. Ganti ini dengan fungsi ROW_NUMBER jendela dalam kueri SQL.

Kode 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;

Kode 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;
Pengembang aplikasi, Pemilik aplikasi
Perbarui parameter fungsi untuk menggunakan variabel alias.

Di PostgreSQL, parameter fungsi tidak dapat digunakan sebagai variabel host. Menimpa mereka dengan menggunakan variabel alias.

Kode 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; }

Kode 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; }
Pengembang aplikasi, Pemilik aplikasi
Perbarui jenis struct.

Tentukan struct tipe EXEC SQL BEGIN dan END blok dengan typedef jika variabel struct tipe digunakan sebagai variabel host. Jika struct jenis didefinisikan dalam file header (.h), sertakan file dengan pernyataan EXEC SQL include.

Kode Pro* C:

Berkas header (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; };

Kode ECPG:

Berkas header (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;

Berkas 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] ;

File 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;
Pengembang aplikasi, Pemilik aplikasi
Ubah logika untuk mengambil dari kursor.

Untuk mengambil beberapa baris dari kursor dengan menggunakan variabel array, ubah kode yang akan digunakan. FETCH FORWARD

Kode Pro* C:

EXEC SQL char  aPoeFiles[MAX_FILES][FILENAME_LENGTH]; EXEC SQL FETCH filename_cursor into :aPoeFiles;

Kode ECPG:

EXEC SQL char  aPoeFiles[MAX_FILES][FILENAME_LENGTH]; EXEC SQL int fetchSize = MAX_FILES; EXEC SQL FETCH FORWARD :fetchSize filename_cursor into :aPoeFiles;
Pengembang aplikasi, Pemilik aplikasi
Ubah panggilan paket yang tidak memiliki nilai pengembalian.

Fungsi paket Oracle yang tidak memiliki nilai kembali harus dipanggil dengan variabel indikator. Jika aplikasi Anda menyertakan beberapa fungsi yang memiliki nama yang sama atau jika fungsi tipe yang tidak dikenal menghasilkan kesalahan runtime, ketikkan nilai ke tipe data.

Kode Pro* C:

void ProcessData (char *data , int id) {                EXEC SQL EXECUTE                BEGIN                   pkg_demo.process_data (:data, :id);                                                                                                  END;        END-EXEC; }

Kode 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; }
Pengembang aplikasi, Pemilik aplikasi
Tulis ulang variabel SQL_CURSOR.

Tulis ulang SQL_CURSOR variabel dan implementasinya.

Kode 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;

Kode 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;
Pengembang aplikasi, Pemilik aplikasi
Terapkan pola migrasi umum.
  • Ubah kueri SQL sehingga kompatibel dengan PostgreSQL.

  • Pindahkan blok anonim, jika tidak didukung di ECPG, ke database.

  • Hapus dbms_application_info logika, yang tidak didukung oleh PostgreSQL.

  • Pindahkan EXEC SQL COMMIT pernyataan setelah kursor ditutup. Jika Anda melakukan kueri saat berada di loop untuk mengambil catatan dari kursor, kursor ditutup dan kesalahan kursor tidak ada ditampilkan.

  • Untuk informasi tentang penanganan pengecualian di ECPG dan kode kesalahan, lihat Penanganan Kesalahan dalam dokumentasi PostgreSQL.

Pengembang aplikasi, Pemilik aplikasi
Aktifkan debugging, jika diperlukan.

Untuk menjalankan program ECPG dalam mode debug, tambahkan perintah berikut di dalam blok fungsi utama.

ECPGdebug(1, stderr);
Pengembang aplikasi, Pemilik aplikasi
TugasDeskripsiKeterampilan yang dibutuhkan
Buat file yang dapat dieksekusi untuk ECPG.

Jika Anda memiliki file sumber SQL C tertanam bernamaprog1.pgc, Anda dapat membuat program yang dapat dieksekusi dengan menggunakan urutan perintah berikut.

ecpg prog1.pgc cc -I/usr/local/pgsql/include -c prog1.c cc -o prog1 prog1.o -L/usr/local/pgsql/lib -lecpg
Pengembang aplikasi, Pemilik aplikasi
Buat file make untuk kompilasi.

Buat file make untuk mengkompilasi program ECPG, seperti yang ditunjukkan pada file contoh berikut.

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)
Pengembang aplikasi, Pemilik aplikasi
TugasDeskripsiKeterampilan yang dibutuhkan
Uji kode.

Uji kode aplikasi yang dikonversi untuk memastikan bahwa itu berfungsi dengan benar.

Pengembang aplikasi, Pemilik aplikasi, Insinyur uji

Sumber daya terkait

Informasi tambahan

PostgreSQL memiliki precompiler SQL tertanam, ECPG, yang setara dengan precompiler Oracle Pro*C. ECPG mengkonversi program C yang telah tertanam pernyataan SQL untuk kode C standar dengan mengganti panggilan SQL dengan panggilan fungsi khusus. File output kemudian dapat diproses dengan rantai alat kompiler C apa pun.

File input dan output

ECPG mengonversi setiap file input yang Anda tentukan pada baris perintah ke file output C yang sesuai. Jika nama file input tidak memiliki ekstensi file, .pgc diasumsikan. Ekstensi file diganti dengan .c untuk membangun nama file output. Namun, Anda dapat mengganti nama file output default dengan menggunakan -o opsi.

Jika Anda menggunakan tanda hubung (-) sebagai nama file input, ECPG membaca program dari input standar dan menulis ke output standar, kecuali jika Anda menggantinya dengan menggunakan opsi. -o

File header

Ketika kompiler PostgreSQL mengkompilasi file kode C yang telah diproses sebelumnya, ia mencari file header ECPG di direktori PostgreSQL. include Oleh karena itu, Anda mungkin harus menggunakan -I opsi untuk mengarahkan kompiler ke direktori yang benar (misalnya,-I/usr/local/pgsql/include).

Perpustakaan

Program yang menggunakan kode C dengan SQL tertanam harus ditautkan dengan libecpg perpustakaan. Misalnya, Anda dapat menggunakan opsi  -L/usr/local/pgsql/lib -lecpg tautan.

Aplikasi ECPG yang dikonversi memanggil fungsi di libpq perpustakaan melalui perpustakaan SQL tertanam (ecpglib), dan berkomunikasi dengan server PostgreSQL dengan menggunakan protokol standar. frontend/backend