AnalyticDB for PostgreSQL kompatibel dengan sintaks Oracle. Dokumen ini menjelaskan cara memigrasikan data dari aplikasi Oracle ke instance AnalyticDB for PostgreSQL.
Konversi sintaks menggunakan Ora2Pg
Ora2Pg adalah alat open source yang dapat digunakan untuk mengonversi pernyataan DDL untuk tabel, tampilan, dan paket di Oracle menjadi pernyataan yang kompatibel dengan sintaks PostgreSQL. Untuk informasi lebih lanjut, lihat dokumentasi Ora2Pg.
Skrip SQL yang dikonversi harus diperbaiki secara manual karena versi sintaks PostgreSQL setelah konversi lebih baru daripada versi mesin minor dari instance AnalyticDB for PostgreSQL Anda, dan aturan konversi Ora2Pg mungkin hilang atau salah.
Kompatibilitas dengan Oracle
Parameter mode kompatibilitas
Perilaku fungsi bervariasi antar database dan tidak selalu kompatibel. Anda harus mengonfigurasi parameter mode kompatibilitas. Mode kompatibilitas PostgreSQL dan Oracle tersedia.
Tabel berikut menjelaskan parameter yang disediakan oleh AnalyticDB for PostgreSQL untuk menentukan mode kompatibilitas.
Parameter | Deskripsi |
adb_compatibility_mode | Mode kompatibilitas. Nilai valid:
Sebelum Anda mengonfigurasi parameter ini, kami sarankan Anda menjalankan pernyataan Jika Anda ingin memodifikasi parameter tingkat instance, Submit a ticket. |
Mode kompatibilitas operator penggabungan string
Dalam ekspresi penggabungan string 'abc' || NULL, 'abc' dan NULL dapat berupa konstanta atau data dari tabel dasar atau hasil perhitungan.
Dalam mode kompatibilitas PostgreSQL, nilai kembali dari ekspresi adalah
NULL. Di PostgreSQL, penggabungan string denganNULLmenghasilkanNULL.Dalam mode kompatibilitas Oracle, nilai kembali dari ekspresi adalah
'abc'. Di Oracle,NULLsetara dengan string kosong yang diapit oleh tanda kutip tunggal (' ').PentingSebelum menggunakan fitur penggabungan string dalam mode kompatibilitas Oracle, nonaktifkan mesin Laser dengan menggunakan
laser.enable = off.
Dukungan tipe data
AnalyticDB for PostgreSQL menyediakan dukungan tipe data untuk string konstan tanpa perlu mengonfigurasi parameter mode kompatibilitas.
Saat mengeksekusi pernyataan seperti CREATE TABLE AS SELECT, sistem secara otomatis mengenali string konstan sebagai tipe TEXT, bukan tipe UNKNOWN.
Gunakan ekstensi Orafce
AnalyticDB for PostgreSQL menyediakan ekstensi Orafce, yang mendukung fungsi-fungsi kompatibel dengan Oracle. Fungsi-fungsi ini dapat digunakan di AnalyticDB for PostgreSQL tanpa modifikasi atau konversi tambahan.
Sebelum menggunakan Orafce, jalankan pernyataan berikut untuk menginstalnya:
CREATE EXTENSION orafce;Tabel berikut mencantumkan fungsi-fungsi kompatibel dengan Oracle yang disediakan oleh Orafce.
Tabel 1. Fungsi Kompatibel dengan Oracle yang Disediakan oleh Orafce
Fungsi | Deskripsi | Contoh |
|
Catatan Tipe data dari dua argumen harus sama. |
|
| Fungsi ini menambahkan jumlah bulan yang ditentukan oleh argumen kedua ke tanggal yang ditentukan oleh argumen pertama dan mengembalikan tanggal. | Informasi berikut dikembalikan: |
| Fungsi ini mengembalikan hari terakhir bulan untuk tanggal yang ditentukan. Nilai kembali adalah tanggal. | Informasi berikut dikembalikan: |
|
Fungsi ini mengembalikan tanggal yang mewakili hari minggu kedua sejak tanggal mulai. Contoh: tanggal yang mewakili Jumat kedua. | Informasi berikut dikembalikan: |
|
Fungsi ini mengembalikan tanggal yang merupakan sejumlah hari tertentu setelah tanggal mulai. |
|
| Fungsi ini mengembalikan jumlah bulan antara date1 dan date2.
|
|
|
|
|
| Fungsi ini memotong cap waktu. Nilai jam, menit, dan detik dari cap waktu yang ditentukan dipotong secara default. | Informasi berikut dikembalikan: |
| Fungsi ini memotong tanggal. | Informasi berikut dikembalikan: |
| Fungsi ini membulatkan cap waktu ke nilai terdekat berdasarkan unit seperti minggu atau hari. | Informasi berikut dikembalikan: |
| Fungsi ini membulatkan cap waktu ke nilai terdekat berdasarkan unit hari. | Informasi berikut dikembalikan: |
| Fungsi ini mengembalikan tanggal yang dibulatkan. |
|
| Fungsi ini mengembalikan tanggal yang dibulatkan. | Informasi berikut dikembalikan: |
| Fungsi ini mencari substring dalam string. Jika substring diperoleh, fungsi mengembalikan posisi substring. Jika tidak, fungsi mengembalikan 0.
|
|
| Argumen nth tidak ditentukan. Fungsi ini mengembalikan posisi kemunculan pertama dari substring. | Informasi berikut dikembalikan: |
| Argumen start tidak ditentukan. Fungsi ini mencari substring dari awal string. | Informasi berikut dikembalikan: |
| Fungsi ini membalikkan urutan karakter dalam string yang ditentukan. Argumen str menentukan string, dan argumen start dan end menentukan posisi awal dan akhir karakter yang urutannya ingin Anda balik. | Informasi berikut dikembalikan: |
| Fungsi ini membalikkan urutan karakter dari karakter yang ditentukan oleh argumen start hingga akhir string. | Informasi berikut dikembalikan: |
| Fungsi ini membalikkan urutan seluruh string. | Informasi berikut dikembalikan: |
| Fungsi ini menggabungkan dua string menjadi satu. | Informasi berikut dikembalikan: |
| Fungsi ini menggabungkan data dengan tipe yang sama atau berbeda. |
|
| Jika argumen pertama adalah tipe data NUMERIC, fungsi ini mengembalikan nilai dari argumen pertama. Jika tidak, fungsi ini mengembalikan nilai dari argumen kedua. |
|
| Fungsi ini melakukan operasi AND untuk dua angka biner bertipe INTEGER. Hanya satu baris yang dikembalikan. |
|
| Fungsi ini mengembalikan string terkluster untuk teks. | Informasi berikut dikembalikan: |
| Fungsi ini mengembalikan string terkluster untuk teks. Nilai dari argumen kedua digunakan sebagai pemisah. | Informasi berikut dikembalikan: |
| Jika nilai argumen pertama adalah null, fungsi ini mengembalikan nilai argumen ketiga. Jika tidak, fungsi ini mengembalikan nilai argumen kedua. |
|
| Jika nilai argumen adalah null atau salah, fungsi ini mengembalikan true. Jika nilai argumen benar, fungsi ini mengembalikan false. |
|
| Fungsi ini mengembalikan teks yang berisi kode tipe data, panjang dalam byte, dan representasi internal dari argumen. | Informasi berikut dikembalikan: |
| Argumen kedua menentukan format nilai yang dikembalikan. Format tersebut dapat berupa notasi desimal (ditentukan oleh 10) atau notasi heksadesimal (ditentukan oleh 16). |
|
| Fungsi ini mengurutkan data dalam urutan tertentu. | Eksekusi pernyataan berikut untuk membuat tabel dan menyisipkan data:
|
| Fungsi ini mengambil substring dari string yang ditentukan oleh argumen pertama. Argumen kedua menentukan posisi awal substring. |
|
| Argumen ketiga menentukan posisi akhir dari substring. Nilai dari argumen ini harus | Informasi berikut dikembalikan: |
| Fungsi ini mengembalikan substring dari string dengan tipe data VARCHAR2. Argumen kedua menentukan posisi awal substring, dan argumen ketiga menentukan posisi akhir substring. | Informasi berikut dikembalikan: |
| Fungsi ini mengembalikan substring dari string dengan tipe data VARCHAR2. Substring dimulai dari karakter yang ditentukan oleh argumen kedua dan berlanjut hingga akhir string. | Informasi berikut dikembalikan: |
| Fungsi ini mengembalikan jumlah byte untuk string dengan tipe data VARCHAR2. Jika null ditentukan, fungsi mengembalikan null. Jika string kosong ditentukan, fungsi mengembalikan 0. |
|
| Fungsi ini menambahkan string di sebelah kiri hingga panjang tertentu dengan urutan karakter.
Catatan Untuk string tipe CHAR, PostgreSQL menghapus spasi di akhir sedangkan Oracle tidak. | Informasi berikut dikembalikan: |
| Fungsi ini menambahkan spasi di sebelah kiri string hingga panjang tertentu. | Informasi berikut dikembalikan: |
| Fungsi ini mengembalikan jumlah kemunculan pola dalam string sumber mulai dari posisi awal. Nilai yang dikembalikan harus berupa bilangan bulat. Jika tidak ada pola yang ditemukan, fungsi mengembalikan 0.
|
|
| Fungsi ini mengembalikan jumlah kemunculan pola dalam string sumber dari posisi awal string. Nilai kembali harus berupa bilangan bulat. Jika tidak ada pola yang ditemukan, fungsi mengembalikan 0. | Informasi berikut dikembalikan: |
| Fungsi ini mengembalikan jumlah kemunculan pola dalam string sumber dari awal string. Nilai yang dikembalikan harus berupa bilangan bulat. Jika tidak ada pola yang ditemukan, fungsi mengembalikan 0. | Informasi berikut dikembalikan: |
| Fungsi ini mengembalikan posisi awal atau akhir dari pola dalam string sumber. Nilai yang dikembalikan harus berupa bilangan bulat.
| Informasi berikut dikembalikan: |
| Fungsi ini mengembalikan posisi awal atau akhir dari kemunculan pola yang ditentukan dalam string sumber dari posisi awal string. Nilai pengembalian harus berupa bilangan bulat.
| Informasi berikut dikembalikan: |
| Fungsi ini mengembalikan posisi awal atau akhir dari kemunculan pola yang ditentukan dalam string sumber dari posisi awal string. Nilai pengembalian harus berupa bilangan bulat. return_opt menentukan posisi awal atau akhir pola dalam string sumber. Nilai yang valid:
| Informasi berikut dikembalikan: |
| Fungsi ini mengembalikan posisi kemunculan tertentu dari sebuah pola dalam string sumber mulai dari posisi awal string. Nilai yang dikembalikan harus berupa bilangan bulat. | Informasi berikut dikembalikan: |
| Fungsi ini mengembalikan posisi pola dalam string sumber dari posisi awal string. Nilai yang dikembalikan harus berupa bilangan bulat. | Informasi berikut dikembalikan: |
| Fungsi ini mengembalikan posisi pola dalam string sumber dari awal string. Nilai yang dikembalikan harus berupa bilangan bulat. | Informasi berikut dikembalikan: |
| Jika substring dari string sumber cocok dengan pola, fungsi ini mengembalikan nilai true. Jika tidak, fungsi ini mengembalikan nilai false.
| Informasi berikut dikembalikan: |
| Jika substring dari string sumber cocok dengan pola, fungsi ini mengembalikan nilai true. Jika tidak, fungsi ini mengembalikan nilai false. | Informasi berikut dikembalikan: |
| Fungsi ini mengembalikan substring dari string sumber yang cocok dengan pola.
| Informasi berikut dikembalikan: |
| Fungsi ini mengembalikan substring dari string sumber yang cocok dengan pola untuk kemunculan yang ditentukan dari posisi awal string. | Informasi berikut dikembalikan: |
| Fungsi ini mengembalikan substring dari string sumber yang cocok dengan pola dari posisi awal string. | Informasi berikut dikembalikan: |
| Fungsi ini mengembalikan substring dari string sumber yang cocok dengan pola dari awal string. | Informasi berikut dikembalikan: |
Selain fungsi-fungsi tersebut, Orafce juga kompatibel dengan tipe data VARCHAR2 di Oracle.
Tabel berikut menjelaskan fungsi-fungsi Oracle yang didukung oleh AnalyticDB for PostgreSQL tanpa perlu menginstal Orafce.
Fungsi | Deskripsi | Contoh |
| Fungsi ini mengembalikan nilai sinus hiperbolik. | Informasi berikut dikembalikan: |
| Fungsi ini mengembalikan nilai tangen hiperbolik. | Informasi berikut dikembalikan: |
| Fungsi ini mengembalikan nilai kosinus hiperbolik. | Informasi berikut dikembalikan: |
| Fungsi ini mencari nilai dalam ekspresi. Jika nilai ditemukan, fungsi mengembalikan nilai tersebut. Jika tidak, fungsi mengembalikan nilai default. | Jalankan pernyataan berikut untuk membuat tabel dan menyisipkan data:
|
Pemetaan antara tipe data Oracle dan AnalyticDB for PostgreSQL
Oracle | AnalyticDB for PostgreSQL |
VARCHAR2 | varchar atau text |
DATE | timestamp |
LONG | text |
LONG RAW | bytea |
CLOB | text |
NCLOB | text |
BLOB | bytea |
RAW | bytea |
ROWID | oid |
FLOAT | double precision |
DEC | decimal |
DECIMAL | decimal |
DOUBLE PRECISION | double precision |
INT | int |
INTEGER | integer |
REAL | real |
SMALLINT | smallint |
NUMBER | numeric |
BINARY_FLOAT | double precision |
BINARY_DOUBLE | double precision |
TIMESTAMP | timestamp |
XMLTYPE | xml |
BINARY_INTEGER | integer |
PLS_INTEGER | integer |
TIMESTAMP WITH TIME ZONE | timestamp with time zone |
TIMESTAMP WITH LOCAL TIME ZONE | timestamp with time zone |
Pemetaan antara fungsi Oracle dan AnalyticDB for PostgreSQL
Oracle | AnalyticDB for PostgreSQL |
sysdate | current timestamp |
trunc | trunc atau date trunc |
dbms_output.put_line | Pernyataan RAISE |
decode | case when atau decode |
NVL | coalesce |
Konversi data dalam PL/SQL
Procedural Language/SQL (PL/SQL) adalah ekstensi bahasa prosedural untuk SQL yang disediakan oleh Oracle. PL/SQL mendukung fitur-fitur bahasa pemrograman umum untuk SQL dan dapat digunakan untuk mengimplementasikan logika bisnis yang kompleks. PL/SQL dipetakan ke PL/pgSQL di AnalyticDB for PostgreSQL.
Paket
PL/pgSQL tidak mendukung paket. Anda harus mengonversi paket menjadi skema. Semua prosedur dan fungsi dalam paket harus dikonversi menjadi fungsi yang didukung oleh AnalyticDB for PostgreSQL.
Contoh:
CREATE OR REPLACE PACKAGE pkg IS
...
END;Hasil Konversi:
CREATE SCHEMA pkg;Variabel yang Didefinisikan dalam Paket
Variabel lokal dari prosedur dan fungsi tetap tidak berubah, sedangkan variabel global dapat disimpan dalam tabel sementara di AnalyticDB for PostgreSQL.
Blok Inisialisasi Paket
Hapus blok inisialisasi paket. Jika blok tidak dapat dihapus, enkapsulasi mereka dalam fungsi dan panggil fungsi tersebut saat diperlukan.
Prosedur dan Fungsi yang Didefinisikan dalam Paket
Konversikan prosedur dan fungsi yang didefinisikan dalam paket menjadi fungsi yang didukung oleh AnalyticDB for PostgreSQL. Setiap fungsi harus didefinisikan dalam skema yang sesuai dengan paket yang digunakan.
Sebagai contoh, paket bernama pkg mencakup fungsi berikut:
FUNCTION test_func (args int) RETURN int is var number := 10; BEGIN ... END;Fungsi di atas harus dikonversi ke fungsi berikut yang didukung oleh AnalyticDB for PostgreSQL:
CREATE OR REPLACE FUNCTION pkg. test_func(args int) RETURNS int AS $$ ... $$ LANGUAGE plpgsql;
Prosedur/Fungsi
Konversikan prosedur dan fungsi spesifik paket serta global di Oracle menjadi fungsi yang didukung oleh AnalyticDB for PostgreSQL.
Contoh:
CREATE OR REPLACE FUNCTION test_func (v_name varchar2, v_version varchar2)
RETURN varchar2 IS
ret varchar(32);
BEGIN
IF v_version IS NULL THEN
ret := v_name;
ELSE
ret := v_name || '/' || v_version;
END IF;
RETURN ret;
END;Hasil Konversi:
CREATE OR REPLACE FUNCTION test_func (v_name varchar, v_version varchar)
RETURNS varchar AS
$$
DECLARE
ret varchar(32);
BEGIN
IF v_version IS NULL THEN
ret := v_name;
ELSE
ret := v_name || '/' || v_version;
END IF;
RETURN ret;
END;
$$
LANGUAGE plpgsql;Perhatikan informasi berikut sebelum mengonversi prosedur atau fungsi:
Konversikan kata kunci RETURN menjadi RETURNS.
Gunakan $\$ ... $\$ untuk menutupi tubuh fungsi.
Perhatikan deklarasi bahasa fungsi.
Konversikan subprosedur menjadi fungsi yang didukung oleh AnalyticDB for PostgreSQL.
Pernyataan PL
Pernyataan FOR
Dalam PL/SQL dan PL/pgSQL, integer FOR LOOP dengan REVERSE bekerja secara berbeda:
PL/SQL menghitung mundur dari angka kedua ke angka pertama.
PL/pgSQL menghitung mundur dari angka pertama ke angka kedua.
Oleh karena itu, batas loop perlu ditukar selama konversi. Contoh:
FOR i IN REVERSE 1..3 LOOP DBMS_OUTPUT.PUT_LINE (TO_CHAR(i)); END LOOP;Hasil Konversi:
FOR i IN REVERSE 3..1 LOOP RAISE '%' ,i; END LOOP;Pernyataan PRAGMA
AnalyticDB for PostgreSQL tidak mendukung pernyataan PRAGMA. Hapus pernyataan PRAGMA.
Pengolahan Transaksi
Fungsi-fungsi dari AnalyticDB for PostgreSQL tidak mendukung pernyataan kontrol transaksi seperti BEGIN, COMMIT, dan ROLLBACK.
Pernyataan-pernyataan ini harus diproses berdasarkan aturan berikut:
Hapus pernyataan kontrol transaksi dalam tubuh fungsi dan masukkan mereka di luar tubuh fungsi.
Pisahkan fungsi berdasarkan pernyataan COMMIT dan ROLLBACK.
Pernyataan EXECUTE
AnalyticDB for PostgreSQL mendukung pernyataan SQL dinamis yang mirip dengan yang disediakan di Oracle. Perhatikan perbedaan berikut:
Pernyataan SQL dinamis di AnalyticDB for PostgreSQL tidak mendukung sintaks USING. Anda harus menggabungkan parameter ke dalam string SQL.
Pengenal database dikemas menggunakan quote_ident, dan nilai numerik dikemas menggunakan quote_literal.
Contoh:
EXECUTE 'UPDATE employees_temp SET commission_pct = :x' USING a_null;Hasil Konversi:
EXECUTE 'UPDATE employees_temp SET commission_pct = ' || quote_literal(a_null);Fungsi PIPE ROW
Gunakan fungsi tabel di AnalyticDB for PostgreSQL untuk menggantikan fungsi PIPE ROW.
Contoh:
TYPE pair IS RECORD(a int, b int); TYPE numset_t IS TABLE OF pair; FUNCTION f1(x int) RETURN numset_t PIPELINED IS DECLARE v_p pair; BEGIN FOR i IN 1..x LOOP v_p.a := i; v_p.b := i+10; PIPE ROW(v_p); END LOOP; RETURN; END; select * from f1(10);Hasil Konversi:
CREATE TYPE pair AS (a int, b int); CREATE OR REPLACE FUNCTION f1(x int) RETURNS SETOF PAIR AS $$ DECLARE REC PAIR; BEGIN FOR i IN 1..x loop REC := row(i, i+10); RETURN NEXT REC; END LOOP; RETURN ; END $$ language 'plpgsql'; SELECT * FROM f1(10);Penanganan Pengecualian
Gunakan pernyataan RAISE untuk melempar pengecualian.
Setelah pengecualian ditangkap, transaksi yang sesuai tidak dapat dibatalkan. Pembatalan hanya diizinkan di luar fungsi yang ditentukan pengguna.
Untuk informasi tentang kode kesalahan yang didukung oleh AnalyticDB for PostgreSQL, kunjungi situs resmi PostgreSQL.
Fungsi yang Berisi Argumen Return dan Out
Di AnalyticDB for PostgreSQL, fungsi tidak dapat berisi argumen return dan out pada saat yang bersamaan. Konversikan argumen return menjadi argumen out.
Contoh:
CREATE OR REPLACE FUNCTION test_func(id int, name varchar(10), out_id out int) returns varchar(10) AS $body$ BEGIN out_id := id + 1; return name; end $body$ LANGUAGE PLPGSQL;Hasil Konversi:
CREATE OR REPLACE FUNCTION test_func(id int, name varchar(10), out_id out int, out_name out varchar(10)) AS $body$ BEGIN out_id := id + 1; out_name := name; end $body$ LANGUAGE PLPGSQL;Kemudian, jalankan pernyataan
SELECT * FROM test_func(1,'1') INTO rec;untuk mendapatkan nilai kembali dari bidang yang sesuai dari rec.Tanda Kutip Tunggal (') yang Termasuk dalam Variabel dalam Penggabungan String
Dalam contoh berikut, variabel param2 adalah tipe STRING. Sebagai contoh, nilai variabel ini adalah
adb'-'pg. Jika sql_str digunakan langsung di AnalyticDB for PostgreSQL, tanda hubung (-) diidentifikasi sebagai operator, yang menyebabkan kesalahan. Gunakan fungsi quote_literal untuk mengonversi variabel.Contoh:
sql_str := 'SELECT * FROM test1 WHERE col1 = ' || param1 || ' AND col2 = '''|| param2 || '''AND col3 = 3';Hasil Konversi:
sql_str := 'SELECT * FROM test1 WHERE col1 = ' || param1 || ' AND col2 = '|| quote_literal(param2) || 'AND col3 = 3';Mendapatkan Jumlah Hari antara Dua Cap Waktu
Contoh:
SELECT to_date('2019-06-30 16:16:16') - to_date('2019-06-29 15:15:15') + 1 INTO v_days FROM dual;Hasil Konversi:
SELECT extract('days' from '2019-06-30 16:16:16'::timestamp - '2019-06-29 15:15:15'::timestamp + '1 days'::interval)::int INTO v_days;
Tipe data PL
Record
Konversikan tipe data RECORD menjadi tipe data komposit di AnalyticDB for PostgreSQL.
Contoh:
TYPE rec IS RECORD (a int, b int);Hasil Konversi:
CREATE TYPE rec AS (a int, b int);Tabel Bertingkat
Sebagai variabel dalam PL, tipe data NESTED TABLE dapat dikonversi menjadi tipe data ARRAY di AnalyticDB for PostgreSQL.
Contoh:
DECLARE TYPE Roster IS TABLE OF VARCHAR2(15); names Roster := Roster('D Caruso', 'J Hamil', 'D Piro', 'R Singh'); BEGIN FOR i IN names.FIRST .. names.LAST LOOP IF names(i) = 'J Hamil' THEN DBMS_OUTPUT.PUT_LINE(names(i)); END IF; END LOOP; END;Hasil Konversi:
CREATE OR REPLACE FUNCTION f1() RETURNS VOID AS $$ DECLARE names varchar(15)[] := '{"D Caruso", "J Hamil", "D Piro", "R Singh"}'; len int := array_length(names, 1); BEGIN for i in 1..len loop if names[i] = 'J Hamil' then raise notice '%', names[i]; end if; end loop; return ; END $$ language 'plpgsql'; SELECT f();Jika tabel bertingkat digunakan sebagai nilai kembali dari fungsi, gunakan fungsi tabel untuk menggantikan tabel bertingkat.
Array Asosiatif
Tidak ada pengganti untuk tipe data ini.
Array Ukuran Variabel
Tipe data VARIABLE-SIZE ARRAY dapat dikonversi menjadi tipe data ARRAY, dengan cara yang sama seperti tipe data NESTED TABLE.
Variabel Global
AnalyticDB for PostgreSQL tidak mendukung variabel global. Simpan semua variabel global dari paket dalam tabel sementara dan definisikan fungsi yang digunakan untuk mendapatkan variabel global.
Contoh:
CREATE TEMPORARY TABLE global_variables ( id int, g_count int, g_set_id varchar(50), g_err_code varchar(100) ); INSERT INTO global_variables VALUES(0, 1, null, null); CREATE OR REPLACE FUNCTION get_variable() returns setof global_variables AS $$ DECLARE rec global_variables%rowtype; BEGIN execute 'select * from global_variables' into rec; return next rec; END; $$ LANGUAGE plpgsql; CREATE OR REPLACE FUNCTION set_variable(in param varchar(50), in value anyelement) returns void AS $$ BEGIN execute 'update global_variables set ' || quote_ident(param) || ' = ' || quote_literal(value); END; $$ LANGUAGE plpgsql;Dalam tabel global_variables sementara, bidang ID adalah kunci distribusi tabel. AnalyticDB for PostgreSQL tidak mengizinkan Anda memodifikasi kunci distribusi. Tambahkan bidang
tmp_rec record;dalam tabel.Untuk memodifikasi variabel global, jalankan pernyataan
select * from set_variable('g_error_code', 'error'::varchar) into tmp_rec;.Untuk mendapatkan variabel global, jalankan pernyataan
select * from get_variable() into tmp_rec; error_code := tmp_rec.g_error_code;.
SQL
CONNECT BY
Klausa CONNECT BY dapat digunakan untuk kueri hierarkis di Oracle. Tidak ada pernyataan SQL dari AnalyticDB for PostgreSQL yang dapat digunakan dengan cara yang sama untuk menggantikan klausa CONNECT BY. Gunakan traversal berulang berdasarkan hierarki untuk mengonversi klausa CONNECT BY.
Contoh:
CREATE TABLE employee( emp_id numeric(18), lead_id numeric(18), emp_name varchar(200), salary numeric(10,2), dept_no varchar(8) ); INSERT INTO employee values('1',0,'king','1000000.00','001'); INSERT INTO employee values('2',1,'jack','50500.00','002'); INSERT INTO employee values('3',1,'arise','60000.00','003'); INSERT INTO employee values('4',2,'scott','30000.00','002'); INSERT INTO employee values('5',2,'tiger','25000.00','002'); INSERT INTO employee values('6',3,'wudde','23000.00','003'); INSERT INTO employee values('7',3,'joker','21000.00','003'); INSERT INTO employee values('3',7,'joker','21000.00','003');SELECT emp_id,lead_id,emp_name,prior emp_name as lead_name,salary FROM employee START WITH lead_id=0 CONNECT BY prior emp_id = lead_idHasil Konversi:
CREATE OR REPLACE FUNCTION f1(tablename text, lead_id int, nocycle boolean) RETURNS setof employee AS $$ DECLARE idx int := 0; res_tbl varchar(265) := 'result_table'; prev_tbl varchar(265) := 'tmp_prev'; curr_tbl varchar(256) := 'tmp_curr'; current_result_sql varchar(4000); tbl_count int; rec record; BEGIN execute 'truncate ' || prev_tbl; execute 'truncate ' || curr_tbl; execute 'truncate ' || res_tbl; loop -- Query hasil hierarki saat ini dan masukkan hasilnya ke dalam tabel tmp_curr. current_result_sql := 'insert into ' || curr_tbl || ' select t1.* from ' || tablename || ' t1'; if idx > 0 then current_result_sql := current_result_sql || ', ' || prev_tbl || ' t2 where t1.lead_id = t2.emp_id'; else current_result_sql := current_result_sql || ' where t1.lead_id = ' || lead_id; end if; execute current_result_sql; -- Jika terdapat loop, hapus data yang telah dilalui. if nocycle is false then execute 'delete from ' || curr_tbl || ' where (lead_id, emp_id) in (select lead_id, emp_id from ' || res_tbl || ') '; end if; -- Keluar jika tidak ada data. execute 'select count(*) from ' || curr_tbl into tbl_count; exit when tbl_count = 0; -- Simpan data dari tabel tmp_curr ke tabel hasil. execute 'insert into ' || res_tbl || ' select * from ' || curr_tbl; execute 'truncate ' || prev_tbl; execute 'insert into ' || prev_tbl || ' select * from ' || curr_tbl; execute 'truncate ' || curr_tbl; idx := idx + 1; end loop; -- Informasi berikut dikembalikan: current_result_sql := 'select * from ' || res_tbl; for rec in execute current_result_sql loop return next rec; end loop; return; END $$ language plpgsql;ROWNUM
ROWNUM dapat digunakan untuk membatasi ukuran set hasil. Gunakan klausa LIMIT untuk menggantikan ROWNUM.
Contoh:
SELECT * FROM t WHERE rownum < 10;Hasil Konversi:
SELECT * FROM t LIMIT 10;Gunakan
row_number() over()untuk menghasilkan ROWNUM.Contoh:
SELECT rownum, * FROM t;Hasil Konversi:
SELECT row_number() over() AS rownum, * FROM t;
Tabel DUAL
Hapus tabel DUAL.
Contoh:
SELECT sysdate FROM dual;Hasil Konversi:
SELECT current_timestamp;Buat tabel bernama dual.
Fungsi yang Ditentukan Pengguna dalam Pernyataan SELECT
AnalyticDB for PostgreSQL memungkinkan Anda memanggil fungsi yang ditentukan pengguna dalam pernyataan SELECT. Fungsi-fungsi ini tidak boleh berisi pernyataan SQL. Jika fungsi yang ditentukan pengguna berisi pernyataan SQL, pesan kesalahan berikut akan ditampilkan:
ERROR: function cannot execute on segment because it accesses relation "public.t2" (functions.c:155) (seg1 slice1 127.0.0.1:25433 pid=52153) (cdbdisp.c:1326) DETAIL: SQL statement "select b from t2 where a = $1 "Untuk mencegah kesalahan ini, konversikan fungsi yang ditentukan pengguna dalam pernyataan SELECT menjadi ekspresi SQL atau subquery.
Contoh:
CREATE OR REPLACE FUNCTION f1(arg int) RETURN int IS v int; BEGIN SELECT b INTO v FROM t2 WHERE a = arg; RETURN v; END; SELECT a, f1(b) FROM t1;Hasil Konversi:
SELECT t1.a, t2.b FROM t1, t2 WHERE t1.b = t2.a;OUTER JOIN (+) untuk Beberapa Tabel
AnalyticDB for PostgreSQL tidak mendukung sintaks (+). Konversikan sintaks (+) menjadi sintaks OUTER JOIN standar.
Contoh:
SELECT * FROM a,b WHERE a.id=b.id(+)Hasil Konversi:
SELECT * FROM a LEFT JOIN b ON a.id=b.idJika sintaks (+) memerlukan operasi JOIN untuk tiga tabel, gunakan WTE untuk menggabungkan dua tabel, lalu lakukan operasi OUTER JOIN pada tabel WTE dan tabel yang terhubung dengan (+).
Contoh:
SELECT * FROM test1 t1, test2 t2, test3 t3 WHERE t1.col1(+) BETWEEN NVL(t2.col1, t3.col1) AND NVL(t3.col1, t2.col1);Hasil Konversi:
WITH cte AS (SELECT t2.col1 AS low, t2.col2, t3.col1 AS high, t3.col2 AS c2 FROM t2, t3) SELECT * FROM t1 RIGHT OUTER JOIN cte ON t1.col1 BETWEEN coalesce(cte.low, cte.high) AND coalesce(cte.high,cte.low);MERGE INTO
Dalam banyak kasus, sintaks MERGE INTO dapat diimplementasikan oleh INSERT ON CONFLICT. Namun, beberapa fitur dari MERGE INTO hanya dapat diimplementasikan oleh prosedur tersimpan.
Untuk informasi lebih lanjut tentang INSERT ON CONFLICT, lihat Gunakan INSERT ON CONFLICT untuk Menimpa Data.
Untuk informasi lebih lanjut tentang prosedur tersimpan, lihat Prosedur Tersimpan.
Sequence
Contoh:
CREATE SEQUENCE seq1; SELECT seq1.nextval FROM dual;Hasil Konversi:
CREATE SEQUENCE seq1; SELECT nextval('seq1');Cursor
Anda dapat menggunakan pernyataan berikut untuk melintasi cursor di Oracle.
Contoh:
FUNCTION test_func() IS Cursor data_cursor IS SELECT * from test1; BEGIN FOR I IN data_cursor LOOP Lakukan sesuatu dengan I; END LOOP; END;Hasil Konversi:
CREATE OR REPLACE FUNCTION test_func() AS $body$ DECLARE data_cursor cursor for select * from test1; I record; BEGIN Open data_cursor; LOOP Fetch data_cursor INTO I; If not found then Exit; End if; Lakukan sesuatu dengan I; END LOOP; Close data_cursor; END; $body$ LANGUAGE PLPGSQL;Cursor dengan nama yang sama dapat dibuka dalam fungsi rekursif. Ini tidak didukung di AnalyticDB for PostgreSQL. Gunakan query FOR I IN.
Contoh:
FUNCTION test_func(level IN numer) IS Cursor data_cursor IS SELECT * from test1; BEGIN If level > 5 then return; End if; FOR I IN data_cursor LOOP Lakukan sesuatu dengan I; test_func(level + 1); END LOOP; END;Hasil Konversi:
CREATE OR REPLACE FUNCTION test_func(level int) returns void AS $body$ DECLARE data_cursor cursor for select * from test1; I record; BEGIN If level > 5 then return; End if; For I in select * from test1 LOOP Lakukan sesuatu dengan I; PERFORM test_func(level+1); END LOOP; END; $body$ LANGUAGE PLPGSQL;