All Products
Search
Document Center

AnalyticDB:Migrasi data dari aplikasi Oracle yang dikelola sendiri ke instance AnalyticDB for PostgreSQL

Last Updated:Mar 18, 2026

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.

Catatan

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:

  • postgres (default): Mode kompatibilitas PostgreSQL.

  • oracle: Mode kompatibilitas Oracle.

Sebelum Anda mengonfigurasi parameter ini, kami sarankan Anda menjalankan pernyataan SHOW adb_compatibility_mode; untuk menanyakan nilai saat ini dari parameter.

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 dengan NULL menghasilkan NULL.

  • Dalam mode kompatibilitas Oracle, nilai kembali dari ekspresi adalah 'abc'. Di Oracle, NULL setara dengan string kosong yang diapit oleh tanda kutip tunggal (' ').

    Penting

    Sebelum 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

nvl(anyelement, anyelement)

  • Jika nilai argumen pertama adalah null, fungsi ini mengembalikan nilai argumen kedua.

  • Jika nilai argumen pertama bukan null, fungsi ini mengembalikan nilai argumen pertama.

Catatan

Tipe data dari dua argumen harus sama.

  • SELECT nvl(null,1);

    Informasi berikut dikembalikan:

    nvl
    -----
      1
    (1 row)
  • SELECT nvl(0,1);

    Informasi berikut dikembalikan:

    nvl
    -----
      0
    (1 row)
  • SELECT nvl(0,null);

    Informasi berikut dikembalikan:

    nvl
    -----
      0
    (1 row)

add_months(day date, value int)RETURNS date

Fungsi ini menambahkan jumlah bulan yang ditentukan oleh argumen kedua ke tanggal yang ditentukan oleh argumen pertama dan mengembalikan tanggal.

SELECT add_months(current_date, 2);

Informasi berikut dikembalikan:

add_months
------------
2019-08-31
(1 row)

last_day(value date)

Fungsi ini mengembalikan hari terakhir bulan untuk tanggal yang ditentukan. Nilai kembali adalah tanggal.

SELECT last_day('2018-06-01');

Informasi berikut dikembalikan:

 last_day
------------
2018-06-30
(1 row)

next_day(value date, weekday text)

  • Argumen pertama menentukan tanggal mulai.

  • Argumen kedua menentukan hari dalam seminggu. Contoh: Jumat.

Fungsi ini mengembalikan tanggal yang mewakili hari minggu kedua sejak tanggal mulai. Contoh: tanggal yang mewakili Jumat kedua.

SELECT next_day(current_date, 'FRIDAY');

Informasi berikut dikembalikan:

 next_day
------------
2019-07-05
(1 row)

next_day(value date, weekday integer)

  • Argumen pertama menentukan tanggal mulai.

  • Argumen kedua menentukan nomor yang mewakili hari dalam seminggu. Nomor berkisar dari 1 hingga 7. Nilai 1 mewakili Minggu, dan nilai 2 mewakili Senin. Dengan cara yang sama, nilai 7 mewakili Sabtu.

Fungsi ini mengembalikan tanggal yang merupakan sejumlah hari tertentu setelah tanggal mulai.

  • SELECT next_day('2019-06-22', 1);

    Informasi berikut dikembalikan:

     next_day
    ------------
    2019-06-23
    (1 row)
  • SELECT next_day('2019-06-22', 2);

    Informasi berikut dikembalikan:

     next_day
    ------------
    2019-06-24
    (1 row)

months_between(date1 date, date2 date)

Fungsi ini mengembalikan jumlah bulan antara date1 dan date2.

  • Jika date1 lebih lambat dari date2, nilai kembali positif.

  • Jika date1 lebih awal dari date2, nilai kembali negatif.

  • SELECT months_between('2019-01-01', '2018-11-01');

    Informasi berikut dikembalikan:

    months_between
    ----------------
                 2
    (1 row)
  • SELECT months_between('2018-11-01', '2019-01-01');

    Informasi berikut dikembalikan:

    months_between
    ----------------
                -2
    (1 row)

trunc(value timestamp with time zone, fmt text)

  • Argumen pertama menentukan cap waktu yang ingin Anda potong.

  • Argumen kedua menentukan presisi berdasarkan mana cap waktu dipotong, seperti tahun, bulan, hari, minggu, jam, menit, atau detik.

    • Y: menentukan bahwa cap waktu dipotong ke hari pertama tahun yang sesuai dengan cap waktu.

    • Q: menentukan bahwa cap waktu dipotong ke hari pertama kuartal yang sesuai dengan cap waktu.

  • SELECT TRUNC(current_date,'Q');

    Informasi berikut dikembalikan:

      trunc
    ------------
    2019-04-01
    (1 row)
  • SELECT TRUNC(current_date,'Y');

    Informasi berikut dikembalikan:

      trunc
    ------------
    2019-01-01
    (1 row)

trunc(value timestamp with time zone)

Fungsi ini memotong cap waktu. Nilai jam, menit, dan detik dari cap waktu yang ditentukan dipotong secara default.

SELECT TRUNC('2019-12-11'::timestamp);

Informasi berikut dikembalikan:

        trunc
------------------------
2019-12-11 00:00:00+08
(1 row)

trunc(value date)

Fungsi ini memotong tanggal.

SELECT TRUNC('2019-12-11'::timestamp,'Y');

Informasi berikut dikembalikan:

        trunc
------------------------
2019-01-01 00:00:00+08

round(value timestamp with time zone, fmt text)

Fungsi ini membulatkan cap waktu ke nilai terdekat berdasarkan unit seperti minggu atau hari.

SELECT round('2018-10-06 13:11:11'::timestamp, 'YEAR');

Informasi berikut dikembalikan:

        round
------------------------
2019-01-01 00:00:00+08
(1 row)

round(value timestamp with time zone)

Fungsi ini membulatkan cap waktu ke nilai terdekat berdasarkan unit hari.

SELECT round('2018-10-06 13:11:11'::timestamp);

Informasi berikut dikembalikan:

        round
------------------------
2018-10-07 00:00:00+08
(1 row)

round(value date, fmt text)

Fungsi ini mengembalikan tanggal yang dibulatkan.

  • SELECT round(TO_DATE('27-OCT-00','DD-MON-YY'), 'YEAR');

    Informasi berikut dikembalikan:

      round
    ------------
    2001-01-01
    (1 row)
  • SELECT round(TO_DATE('27-FEB-00','DD-MON-YY'), 'YEAR');

    Informasi berikut dikembalikan:

      round
    ------------
    2000-01-01
    (1 row)

round(value date)

Fungsi ini mengembalikan tanggal yang dibulatkan.

SELECT round(TO_DATE('27-FEB-00','DD-MON-YY'));

Informasi berikut dikembalikan:

  round
------------
2000-02-27
(1 row)

instr(str text, patt text, start int, nth int)

Fungsi ini mencari substring dalam string. Jika substring diperoleh, fungsi mengembalikan posisi substring. Jika tidak, fungsi mengembalikan 0.

  • start: menentukan posisi awal pencarian.

  • nth: menentukan posisi kemunculan ke-n dari substring.

  • SELECT instr('Greenplum', 'e',1,2);

    Informasi berikut dikembalikan:

    instr
    -------
        4
    (1 row)
  • SELECT instr('Greenplum', 'e',1,1);

    Informasi berikut dikembalikan:

    instr
    -------
        3
    (1 row)

instr(str text, patt text, start int)

Argumen nth tidak ditentukan. Fungsi ini mengembalikan posisi kemunculan pertama dari substring.

SELECT instr('Greenplum', 'e',1);

Informasi berikut dikembalikan:

instr
-------
    3
(1 row)

instr(str text, patt text)

Argumen start tidak ditentukan. Fungsi ini mencari substring dari awal string.

SELECT instr('Greenplum', 'e');

Informasi berikut dikembalikan:

instr
-------
    3
(1 row)

plvstr.rvrs(str text, start int, end int)

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.

SELECT plvstr.rvrs('adb4pg', 5,6);

Informasi berikut dikembalikan:

reverse
---------
gp
(1 row)

plvstr.rvrs(str text, start int)

Fungsi ini membalikkan urutan karakter dari karakter yang ditentukan oleh argumen start hingga akhir string.

SELECT plvstr.rvrs('adb4pg', 4);

Informasi berikut dikembalikan:

reverse
---------
gp4
(1 row)

plvstr.rvrs(str text)

Fungsi ini membalikkan urutan seluruh string.

SELECT plvstr.rvrs('adb4pg');

Informasi berikut dikembalikan:

reverse
---------
gp4bda
(1 row)

concat(text, text)

Fungsi ini menggabungkan dua string menjadi satu.

SELECT concat('adb','4pg');

Informasi berikut dikembalikan:

concat
--------
adb4pg
(1 row)

concat(text, anyarray)/concat(anyarray, text)/concat(anyarray, anyarray)

Fungsi ini menggabungkan data dengan tipe yang sama atau berbeda.

  • SELECT concat('adb4pg', 6666);

    Informasi berikut dikembalikan:

      concat
    ------------
    adb4pg6666
    (1 row)
  • SELECT concat(6666, 6666);

    Informasi berikut dikembalikan:

     concat
    ----------
    66666666
    (1 row)
  • SELECT concat(current_date, 6666);

    Informasi berikut dikembalikan:

        concat
    ----------------
    2019-06-306666
    (1 row)

nanvl(float4, float4)/nanvl(float4, float4)/nanvl(numeric, numeric)

Jika argumen pertama adalah tipe data NUMERIC, fungsi ini mengembalikan nilai dari argumen pertama. Jika tidak, fungsi ini mengembalikan nilai dari argumen kedua.

  • SELECT nanvl('NaN', 1.1);

    Informasi berikut dikembalikan:

    nanvl
    -------
      1.1
    (1 row)
  • SELECT nanvl('1.2', 1.1);

    Informasi berikut dikembalikan:

    nanvl
    -------
      1.2
    (1 row)

bitand(bigint, bigint)

Fungsi ini melakukan operasi AND untuk dua angka biner bertipe INTEGER. Hanya satu baris yang dikembalikan.

  • SELECT bitand(1,3);

    Informasi berikut dikembalikan:

    bitand
    --------
         1
    (1 row)
  • SELECT bitand(2,6);

    Informasi berikut dikembalikan:

    bitand
    --------
         2
    (1 row)
  • SELECT bitand(4,6);

    Informasi berikut dikembalikan:

    bitand
    --------
         4
    (1 row)

listagg(text)

Fungsi ini mengembalikan string terkluster untuk teks.

SELECT listagg(t) FROM (VALUES('abc'), ('def')) as l(t);

Informasi berikut dikembalikan:

listagg
---------
abcdef
(1 row)

listagg(text, text)

Fungsi ini mengembalikan string terkluster untuk teks. Nilai dari argumen kedua digunakan sebagai pemisah.

SELECT listagg(t, '.') FROM (VALUES('abc'), ('def')) as l(t);

Informasi berikut dikembalikan:

listagg
---------
abc.def
(1 row)

nvl2(anyelement, anyelement, anyelement)

Jika nilai argumen pertama adalah null, fungsi ini mengembalikan nilai argumen ketiga. Jika tidak, fungsi ini mengembalikan nilai argumen kedua.

  • SELECT nvl2(null, 1, 2);

    Informasi berikut dikembalikan:

    nvl2
    ------
       2
    (1 row)
  • SELECT nvl2(0, 1, 2);

    Informasi berikut dikembalikan:

    nvl2
    ------
       1
    (1 row)

lnnvl(bool)

Jika nilai argumen adalah null atau salah, fungsi ini mengembalikan true. Jika nilai argumen benar, fungsi ini mengembalikan false.

  • SELECT lnnvl(null);

    Informasi berikut dikembalikan:

    lnnvl
    -------
    t
    (1 row)
  • SELECT lnnvl(false);

    Informasi berikut dikembalikan:

    lnnvl
    -------
    t
    (1 row)
  • SELECT lnnvl(true);

    Informasi berikut dikembalikan:

    lnnvl
    -------
    f
    (1 row)

dump("any")

Fungsi ini mengembalikan teks yang berisi kode tipe data, panjang dalam byte, dan representasi internal dari argumen.

SELECT  dump('adb4pg');

Informasi berikut dikembalikan:

                dump
---------------------------------------
Typ=705 Len=7: 97,100,98,52,112,103,0
(1 row)

dump("any", integer)

Argumen kedua menentukan format nilai yang dikembalikan. Format tersebut dapat berupa notasi desimal (ditentukan oleh 10) atau notasi heksadesimal (ditentukan oleh 16).

  • SELECT dump('adb4pg', 10);

    Informasi berikut dikembalikan:

                    dump
    ---------------------------------------
    Typ=705 Len=7: 97,100,98,52,112,103,0
    (1 baris)
  • SELECT dump('adb4pg', 16);

    Informasi berikut dikembalikan:

                   dump
    ------------------------------------
    Typ=705 Len=7: 61,64,62,34,70,67,0
    (1 baris)
  • SELECT dump('adb4pg', 2);

    Informasi berikut dikembalikan:

    ERROR:  unknown format (others.c:430)

nlssort(teks, teks)

Fungsi ini mengurutkan data dalam urutan tertentu.

Eksekusi pernyataan berikut untuk membuat tabel dan menyisipkan data:

CREATE TABLE t1 (name text);
INSERT INTO t1 VALUES('Anne'), ('anne'), ('Bob'), ('bob');
  • SELECT * FROM t1 ORDER BY nlssort(name, 'en_US.UTF-8');

    Informasi berikut dikembalikan:

    name
    ------
    anne
    Anne
    bob
    Bob
    (4 baris)
  • SELECT * FROM t1 ORDER BY nlssort(name, 'C');

    Informasi berikut dikembalikan:

    name
    ------
    Anne
    Bob
    anne
    bob
    (4 baris)

substr(str text, start int)

Fungsi ini mengambil substring dari string yang ditentukan oleh argumen pertama. Argumen kedua menentukan posisi awal substring.

  • SELECT substr('adb4pg', 1);

    Informasi berikut dikembalikan:

    substr
    --------
    adb4pg
    (1 row)
  • SELECT substr('adb4pg', 4);

    Informasi berikut dikembalikan:

    substr
    --------
    4pg
    (1 row)

substr(str text, start int, len int)

Argumen ketiga menentukan posisi akhir dari substring. Nilai dari argumen ini harus lebih besar dari atau sama dengan nilai argumen start dan kurang dari atau sama dengan panjang string.

SELECT substr('adb4pg', 5,6);

Informasi berikut dikembalikan:

substr
--------
pg
(1 row)

pg_catalog.substrb(varchar2, integer, integer)

Fungsi ini mengembalikan substring dari string dengan tipe data VARCHAR2. Argumen kedua menentukan posisi awal substring, dan argumen ketiga menentukan posisi akhir substring.

SELECT  substr('adb4pg'::varchar2, 5,6);

Informasi berikut dikembalikan:


substr
--------
pg
(1 baris)

pg_catalog.substrb(varchar2, integer)

Fungsi ini mengembalikan substring dari string dengan tipe data VARCHAR2. Substring dimulai dari karakter yang ditentukan oleh argumen kedua dan berlanjut hingga akhir string.

SELECT substr('adb4pg'::varchar2, 4) ;

Informasi berikut dikembalikan:

substr
--------
4pg
(1 row)

pg_catalog.lengthb(varchar2)

Fungsi ini mengembalikan jumlah byte untuk string dengan tipe data VARCHAR2. Jika null ditentukan, fungsi mengembalikan null. Jika string kosong ditentukan, fungsi mengembalikan 0.

  • SELECT lengthb('adb4pg'::varchar2) ;

    Informasi berikut dikembalikan:

    lengthb
    ---------
          6
    (1 row)
  • SELECT lengthb('analytics'::varchar2);

    Informasi berikut dikembalikan:

    lengthb
    ---------
          9
    (1 row)

lpad(string char, length int, fill char)

Fungsi ini menambahkan string di sebelah kiri hingga panjang tertentu dengan urutan karakter.

  • Argumen pertama menentukan string yang ingin Anda tambahkan di sebelah kiri.

  • Argumen kedua menentukan panjang string hasil setelah penambahan.

  • Argumen ketiga menentukan string yang digunakan untuk penambahan.

Catatan

Untuk string tipe CHAR, PostgreSQL menghapus spasi di akhir sedangkan Oracle tidak.

SELECT lpad('abc '::char(4),6,'x');

Informasi berikut dikembalikan:

  lpad
--------
 xxabc
(1 baris)

lpad(string char, length int)

Fungsi ini menambahkan spasi di sebelah kiri string hingga panjang tertentu.

SELECT lpad('abc '::char(4),6);

Informasi berikut dikembalikan:

  lpad
--------
   abc
(1 baris)

regexp_count(string text, pattern text, startPos int, flags text)

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.

  • Argumen pertama menentukan string sumber.

  • Argumen kedua menentukan pola.

  • Argumen ketiga menentukan posisi dari mana pencarian dimulai. Harus berupa bilangan bulat positif. Anda tidak dapat mencari pola dari akhir string sumber.

  • Argumen keempat menentukan ekspresi karakter yang dapat digunakan untuk mengubah perilaku pencocokan default dari fungsi. Ekspresi tersebut dapat mencakup satu atau lebih karakter berikut:

    • 'i': pencocokan tanpa membedakan huruf besar/kecil. Secara default, pencocokan membedakan huruf besar/kecil dan aksen.

    • 'c': pencocokan membedakan huruf besar/kecil dan aksen.

    • 'n': memungkinkan titik (.) cocok dengan line feed. Secara default, titik (.) tidak cocok dengan line feed.

    • 'm': memperlakukan string sumber sebagai beberapa baris. Secara default, string sumber diperlakukan sebagai satu baris.

    • 'x': mengabaikan karakter spasi putih. Secara default, karakter spasi putih cocok dengan dirinya sendiri.

  • SELECT regexp_count('a'||CHR(10)||'d', 'a.d', 1, 'n');

    Informasi berikut dikembalikan:

     regexp_count 
    --------------
                1
    (1 baris)
  • SELECT regexp_count('a'||CHR(10)||'d', 'a.d', 1, 'n');

    Informasi berikut dikembalikan:

     regexp_count 
    --------------
                1
    (1 baris)

regexp_count(string text, pattern text, startPos int)

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.

SELECT regexp_count('abc', '[a-z]',3);

Informasi berikut dikembalikan:

 regexp_count
--------------
            1
(1 baris)

regexp_count(string text, pattern text)

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.

SELECT regexp_count('abc', '[a-z]');

Informasi berikut dikembalikan:

 regexp_count
--------------
            3
(1 baris)

regexp_instr(string text, pattern text, startPos int, occurence int, return_opt int, flags text, group int)

Fungsi ini mengembalikan posisi awal atau akhir dari pola dalam string sumber. Nilai yang dikembalikan harus berupa bilangan bulat.

  • Argumen pertama menentukan string sumber.

  • Argumen kedua menentukan pola.

  • Argumen ketiga menentukan posisi dari mana pencarian dimulai. Harus berupa bilangan bulat positif. Anda tidak dapat mencari pola dari akhir string sumber.

  • Argumen keempat menentukan kemunculan pola dalam string sumber dari mana pencarian dimulai. Harus berupa bilangan bulat positif. Nilai default adalah 1, yang menunjukkan bahwa pencarian dimulai dari kemunculan pertama pola.

  • Argumen kelima menentukan posisi awal atau akhir dari pola dalam string sumber. Nilai yang valid:

    • 0 (default): posisi karakter pertama dari kemunculan.

    • 1: posisi karakter yang mengikuti kemunculan.

  • Argumen keenam menentukan ekspresi karakter yang dapat digunakan untuk mengubah perilaku pencocokan default dari fungsi. Untuk informasi lebih lanjut, lihat REGEXP_COUNT.

  • Argumen ketujuh menentukan nomor seri dari grup penangkapan dalam pola. Harus berupa bilangan bulat positif. Grup penangkapan dapat bersarang. Grup penangkapan diberi nomor berdasarkan urutan munculnya tanda kurung kiri mereka dalam pola. Jika nilainya 0, posisi seluruh substring yang cocok dengan pola dikembalikan. Jika nilainya lebih besar dari jumlah grup penangkapan dalam pola, fungsi mengembalikan 0. Nilai default: 0.

SELECT regexp_instr('abxxabc','(a)(b)(c)',1,1,0,'',2);

Informasi berikut dikembalikan:

 regexp_instr
--------------
            6
(1 baris)

regexp_instr(string text, pattern text, startPos int, occurence int, return_opt int, flags text)

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:

    • 0 (default): posisi karakter pertama dari kemunculan.

    • 1: posisi karakter yang mengikuti kemunculan.

  • flags menentukan ekspresi karakter yang dapat Anda gunakan untuk mengubah perilaku pencocokan default dari fungsi. Untuk informasi lebih lanjut, lihat REGEXP_COUNT.

SELECT regexp_instr('abxxabc','(a)(b)(c)',1,1,0,'');

Informasi berikut dikembalikan:

 regexp_instr
--------------
            5
(1 baris)

regexp_instr(string text, pattern text, startPos int, occurence int, return_opt int)

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:

  • 0 (bawaan): posisi karakter pertama dari kemunculan.

  • 1: posisi karakter yang mengikuti kemunculan.

SELECT regexp_instr('abc','[a-z]{3}',1,1,1);

Informasi berikut dikembalikan:

 regexp_instr
--------------
            4
(1 row)

regexp_instr(string text, pattern text, startPos int, occurence int)

Fungsi ini mengembalikan posisi kemunculan tertentu dari sebuah pola dalam string sumber mulai dari posisi awal string. Nilai yang dikembalikan harus berupa bilangan bulat.

SELECT regexp_instr('abcd','[a-z]{2}',1,2);

Informasi berikut dikembalikan:

 regexp_instr
--------------
            3
(1 row)

regexp_instr(string text, pattern text, startPos int)

Fungsi ini mengembalikan posisi pola dalam string sumber dari posisi awal string. Nilai yang dikembalikan harus berupa bilangan bulat.

SELECT regexp_instr('abc','[a-z]',2);

Informasi berikut dikembalikan:

 regexp_instr
--------------
            2
(1 row)

regexp_instr(string text, pattern text)

Fungsi ini mengembalikan posisi pola dalam string sumber dari awal string. Nilai yang dikembalikan harus berupa bilangan bulat.

SELECT regexp_instr('abc','[a-z]');

Informasi berikut dikembalikan:

 regexp_instr
--------------
            1
(1 row)

regexp_like(string text, pattern text, flags text)

Jika substring dari string sumber cocok dengan pola, fungsi ini mengembalikan nilai true. Jika tidak, fungsi ini mengembalikan nilai false.

  • Argumen pertama menentukan string sumber.

  • Argumen kedua menentukan pola.

  • Argumen ketiga menentukan ekspresi karakter yang dapat digunakan untuk mengubah perilaku pencocokan default dari fungsi. Untuk informasi lebih lanjut, lihat REGEXP_COUNT.

SELECT regexp_like('a'||CHR(10)||'d', 'a.d', 'n');

Informasi berikut dikembalikan:

 regexp_like
-------------
 t
(1 baris)

regexp_like(string text, pattern text)

Jika substring dari string sumber cocok dengan pola, fungsi ini mengembalikan nilai true. Jika tidak, fungsi ini mengembalikan nilai false.

SELECT regexp_like('abc', '[a-z]');

Informasi berikut dikembalikan:

 regexp_like
-------------
 t
(1 baris)

regexp_substr(string text, pattern text, startPos int, occurence int, flags text)

Fungsi ini mengembalikan substring dari string sumber yang cocok dengan pola.

  • Argumen pertama menentukan string sumber.

  • Argumen kedua menentukan pola.

  • Argumen ketiga menentukan posisi dari mana pencarian dimulai. Harus berupa bilangan bulat positif. Anda tidak dapat mencari pola dari akhir string sumber.

  • Argumen keempat menentukan kemunculan pola dalam string sumber dari mana pencarian dimulai. Harus berupa bilangan bulat positif. Nilai defaultnya adalah 1, yang menunjukkan bahwa pencarian dimulai dari kemunculan pertama pola.

  • Argumen kelima menentukan ekspresi karakter yang dapat digunakan untuk mengubah perilaku pencocokan default dari fungsi. Untuk informasi lebih lanjut, lihat REGEXP_COUNT.

SELECT regexp_substr('a,bc,def', '[^,]+',1,2,'');

Informasi berikut dikembalikan:

 regexp_substr
---------------
 bc
(1 baris)

regexp_substr(string text, pattern text, startPos int, occurence int)

Fungsi ini mengembalikan substring dari string sumber yang cocok dengan pola untuk kemunculan yang ditentukan dari posisi awal string.

SELECT regexp_substr('a,bc,def', '[^,]+',4,2);

Informasi berikut dikembalikan:

 regexp_substr
---------------
 def
(1 row)

regexp_substr(string text, pattern text, startPos int)

Fungsi ini mengembalikan substring dari string sumber yang cocok dengan pola dari posisi awal string.

SELECT regexp_substr('a,bc,def', '[^,]+',4);

Informasi berikut dikembalikan:

 regexp_substr
---------------
 c
(1 row)

regexp_substr(string text, pattern text)

Fungsi ini mengembalikan substring dari string sumber yang cocok dengan pola dari awal string.

SELECT regexp_substr('a,bc,def', '[^,]+');

Informasi berikut dikembalikan:

 regexp_substr
---------------
 a
(1 row)

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

sinh(float)

Fungsi ini mengembalikan nilai sinus hiperbolik.

SELECT sinh(0.1);

Informasi berikut dikembalikan:

      sinh
-------------------
0.100166750019844
(1 row)

tanh(float)

Fungsi ini mengembalikan nilai tangen hiperbolik.

SELECT  tanh(3);

Informasi berikut dikembalikan:

      tanh
------------------
0.99505475368673
(1 row)

cosh(float)

Fungsi ini mengembalikan nilai kosinus hiperbolik.

SELECT cosh(0.2);

Informasi berikut dikembalikan:

      cosh
------------------
1.02006675561908
(1 row)

decode(expression, value, return [,value,return]... [, default])

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:

CREATE TABLE t1(id int, name varchar(20));
INSERT INTO t1 values(1,'alibaba');
INSERT INTO t1 values(2,'adb4pg');
  • SELECT decode(id, 1, 'alibaba', 2, 'adb4pg', 'not found') from t1;

    Informasi berikut dikembalikan:

     case
    ---------
    alibaba
    adb4pg
    (2 rows)
  • SELECT decode(id, 3, 'alibaba', 4, 'adb4pg', 'not found') from t1;

    Informasi berikut dikembalikan:

      case
    -----------
    not found
    not found
    (2 rows)

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_id

    Hasil 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

    1. 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;
    2. Gunakan row_number() over() untuk menghasilkan ROWNUM.

      Contoh:

      SELECT rownum, * FROM t;

      Hasil Konversi:

      SELECT row_number() over() AS rownum, * FROM t;
  • Tabel DUAL

    1. Hapus tabel DUAL.

      Contoh:

      SELECT sysdate FROM dual;

      Hasil Konversi:

      SELECT current_timestamp;
    2. 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.id

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