Memigrasikan pengguna Oracle® ke Cloud SQL untuk PostgreSQL: Kueri, serta prosedur, fungsi, dan pemicu tersimpan

Dokumen ini adalah bagian dari sebuah seri yang menyajikan informasi dan panduan penting terkait perencanaan dan pelaksanaan migrasi database Oracle® 11g/12c ke Cloud SQL untuk PostgreSQL versi 12. Selain bagian penyiapan pendahuluan, seri ini mencakup bagian berikut:

Kueri

Oracle dan Cloud SQL untuk PostgreSQL mendukung standar ANSI SQL. Oleh karena itu, migrasi pernyataan SQL secara umum sangat mudah dilakukan, cukup dengan menggunakan elemen sintaksis dasar (tanpa perlu menentukan fungsi skalar atau fitur tambahan Oracle lainnya). Bagian berikut membahas elemen kueri yang umum di Oracle dan padanan terkaitnya di Cloud SQL untuk PostgreSQL.

Sintaksis SELECT dan FROM dasar

Nama fitur atau nama sintaksis di Oracle Ringkasan atau implementasi di Oracle Dukungan di Cloud SQL untuk PostgreSQL Solusi terkait atau alternatif di Cloud SQL untuk PostgreSQL
Sintaksis dasar SQL untuk pengambilan data SELECT
FROM
WHERE
GROUP BY
HAVING
ORDER BY
Ya SELECT
FROM
WHERE
GROUP BY
HAVING
ORDER BY
SELECT
untuk cetak output
SELECT 1 FROM DUAL Ya SELECT 1
Alias kolom SELECT COL1 AS C1 Ya SELECT COL1 AS C1
OR
SELECT COL1 C1
Kepekaan huruf besar/kecil nama tabel Tidak peka huruf besar/kecil
(misalnya, nama tabel dapat orders dan/atau ORDERS).
Ya Nama tidak peka huruf besar/kecil kecuali jika diapit tanda kutip (misalnya, orders dan ORDERS diperlakukan sama, sedangkan "orders" dan "ORDERS" diperlakukan berbeda)

Untuk mengetahui detail selengkapnya tentang sintaksis SELECT di Cloud SQL untuk PostgreSQL, lihat dokumentasi.

Tabel virtual inline

  • Tabel virtual inline (disebut juga tabel turunan) adalah pernyataan SELECT, yang terletak di klausa FROM dan digunakan sebagai subkueri.
  • Tabel virtual inline dapat membantu menyederhanakan kueri yang kompleks dengan menghapus penghitungan gabungan atau menghilangkan operasi join, sekaligus menggabungkan beberapa kueri terpisah menjadi satu kueri yang disederhanakan.
  • Catatan konversi: Tabel virtual inline di Oracle tidak memerlukan penggunaan alias, sedangkan Cloud SQL untuk PostgreSQL mengharuskan alias spesifik untuk setiap tabel virtual inline.

Tabel berikut menampilkan contoh konversi dari Oracle ke Cloud SQL untuk PostgreSQL, sebagai tabel virtual inline.

Oracle 11g/12c Cloud SQL untuk PostgreSQL 12
SQL> SELECT FIRST_NAME,
DEPARTMENT_ID,
SALARY,
DATE_COL
FROM EMPLOYEES,
(SELECT SYSDATE AS DATE_COL FROM DUAL);


Outputnya mirip dengan berikut:

FIRST_NAME DEPARTMENT_ID SALARY DATE_COL
-------------------- ------------- ---------- ---------
Steven 90 24000 30-JUL-19
Neena 90 17000 30-JUL-19
Lex 90 17000 30-JUL-19

Tanpa alias untuk tabel virtual inline:

postgres=> SELECT FIRST_NAME,
postgres-> DEPARTMENT_ID,
postgres-> SALARY,
postgres-> DATE_COL
postgres-> FROM EMPLOYEES, (SELECT NOW() AS DATE_COL);

ERROR: subquery in FROM must have an alias
LINE 5: FROM EMPLOYEES, (SELECT NOW() AS DATE_COL);

HINT: For example, FROM (SELECT ...) [AS] foo.

Menambahkan alias ke tabel virtual inline:

postgres=> SELECT FIRST_NAME,
postgres-> DEPARTMENT_ID,
postgres-> SALARY,
postgres-> DATE_COL
postgres-> FROM EMPLOYEES, (SELECT NOW() AS DATE_COL) AS C1;

Outputnya mirip dengan berikut:

first_name | department_id | salary | date_col
-------------+---------------+----------+--------------------------------
Steven | 90 | 24000.00 | 10/16/2020 08:35:18.470089 UTC
Neena | 90 | 17000.00 | 10/16/2020 08:35:18.470089 UTC
Lex | 90 | 17000.00 | 10/16/2020 08:35:18.470089 UTC

Pernyataan JOIN

Pernyataan JOIN Oracle didukung oleh pernyataan JOIN Cloud SQL untuk PostgreSQL. Namun, penggunaan operator join (+) Oracle tidak didukung oleh Cloud SQL untuk PostgreSQL. Untuk memperoleh hasil yang sama, Anda harus mengonversi outer join ke sintaksis SQL standar.

Tabel berikut menampilkan contoh konversi JOIN.

Jenis JOIN di Oracle Didukung oleh Cloud SQL untuk PostgreSQL Sintaksis JOIN di Cloud SQL untuk PostgreSQL
INNER JOIN Ya SELECT E.FIRST_NAME, D.DEPARTMENT_NAME
FROM EMPLOYEES E JOIN DEPARTMENTS D
ON E.DEPARTMENT_ID = D.DEPARTMENT_ID;
CROSS JOIN Ya SELECT E.FIRST_NAME, D.DEPARTMENT_NAME
FROM EMPLOYEES E CROSS JOIN DEPARTMENTS D;
FULL JOIN [ OUTER ] Ya SELECT E.FIRST_NAME, D.DEPARTMENT_NAME
FROM EMPLOYEES E FULL JOIN DEPARTMENTS D
ON E.DEPARTMENT_ID = D.DEPARTMENT_ID;
LEFT JOIN [ OUTER ] Ya SELECT E.FIRST_NAME, D.DEPARTMENT_NAME
FROM EMPLOYEES E LEFT JOIN DEPARTMENTS D
ON E.DEPARTMENT_ID = D.DEPARTMENT_ID;
RIGHT JOIN [ OUTER ] Ya SELECT E.FIRST_NAME, D.DEPARTMENT_NAME
FROM EMPLOYEES E RIGHT JOIN DEPARTMENTS D
ON E.DEPARTMENT_ID = D.DEPARTMENT_ID;
SUBQUERY Ya SELECT E.FIRST_NAME, D.DEPARTMENT_NAME
FROM EMPLOYEES E JOIN (SELECT * FROM DEPARTMENTS)D
ON E.DEPARTMENT_ID = D.DEPARTMENT_ID;

UNION, UNION ALL, INTERSECT, dan MINUS

Cloud SQL untuk PostgreSQL mendukung operator UNION, UNION ALL, dan INTERSECT Oracle. Operator MINUS tidak didukung. Namun, Cloud SQL untuk PostgreSQL mengimplementasikan operator EXCEPT yang setara dengan operator MINUS di Oracle. Selain itu, Cloud SQL untuk PostgreSQL mendukung operator INTERSECT ALL dan EXCEPT ALL yang tidak didukung oleh Oracle.

  • UNION: Melampirkan kumpulan hasil dari dua pernyataan SELECT atau lebih dan menghapus data duplikat.
  • UNION ALL: Melampirkan kumpulan hasil dari dua pernyataan SELECT atau lebih tanpa menghapus data duplikat.
  • INTERSECT: Menampilkan irisan dari dua pernyataan SELECT atau lebih hanya jika data ada di kedua set data. Data duplikat tidak akan dihapus.
  • INTERSECT ALL (khusus Cloud SQL untuk PostgreSQL): Menampilkan irisan dari dua pernyataan SELECT atau lebih hanya jika data ada di kedua set data.
  • MINUS (EXCEPT di Cloud SQL untuk PostgreSQL): Membandingkan dua pernyataan SELECT atau lebih, dengan hanya menampilkan baris berbeda dari kueri pertama yang tidak ditampilkan oleh pernyataan lainnya.
  • EXCEPT ALL (khusus Cloud SQL untuk PostgreSQL): Membandingkan dua pernyataan SELECT atau lebih, dengan hanya menampilkan baris dari kueri pertama yang tidak ditampilkan oleh pernyataan lainnya tanpa menghapus data duplikat.

Catatan konversi

Saat mengonversi operator MINUS dari Oracle ke Cloud SQL untuk PostgreSQL, gunakan operator EXCEPT.

Contoh

Fungsi di Oracle Implementasi di Oracle Dukungan di Cloud SQL untuk PostgreSQL Solusi terkait atau alternatif di Cloud SQL untuk PostgreSQL
UNION SELECT COL1 FROM TBL1
UNION
SELECT COL1 FROM TBL2
Ya SELECT COL1 FROM TBL1
UNION
SELECT COL1 FROM TBL2
UNION ALL SELECT COL1 FROM TBL1
UNION ALL
SELECT COL1 FROM TBL2
Ya SELECT COL1 FROM TBL1
UNION ALL
SELECT COL1 FROM TBL2
INTERSECT SELECT COL1 FROM TBL1
INTERSECT
SELECT COL1 FROM TBL2
Ya SELECT COL1 FROM TBL1
INTERSECT
SELECT COL1 FROM TBL2
MINUS SELECT COL1 FROM TBL1
MINUS
SELECT COL1 FROM TBL2
Ya (Convert MINUS ke EXCEPT di PostgreSQL) SELECT COL1 FROM TBL1
EXCEPT
SELECT COL1 FROM TBL2

Fungsi skalar (baris tunggal) dan grup

Cloud SQL untuk PostgreSQL menyediakan daftar lengkap fungsi skalar (baris tunggal) dan agregasi. Beberapa fungsi Cloud SQL untuk PostgreSQL mirip dengan fungsi padanannya di Oracle (berdasarkan nama dan fungsionalitas, atau dengan nama berbeda tetapi fungsionalitas sama). Meskipun beberapa fungsi Cloud SQL untuk PostgreSQL dapat memiliki nama yang sama dengan fungsi padanannya di Oracle, terkadang fungsionalitasnya berbeda.

Tabel berikut menjelaskan elemen di Oracle dan Cloud SQL untuk PostgreSQL yang setara berdasarkan nama dan fungsionalitas (ditentukan oleh "Ya") dan elemen yang perlu dikonversi (semua kasus selain "Ya").

Fungsi karakter
Fungsi di Oracle Spesifikasi atau implementasi fungsi di Oracle Setara dengan Cloud SQL untuk PostgreSQL Fungsi terkait di Cloud SQL untuk PostgreSQL Spesifikasi atau implementasi fungsi di Cloud SQL untuk PostgreSQL
CONCAT Menampilkan str1 yang disambung dengan str2:

CONCAT('A', 1) = A1
Ya CONCAT Setara dengan Oracle:

CONCAT('A', 1) = A1
LOWER/UPPER Menampilkan char, dengan huruf kecil atau huruf besar semua:

LOWER('SQL') = sql
Ya LOWER/UPPER Setara dengan Oracle:

LOWER('SQL') = sql
LPAD/RPAD Menampilkan expr1, dengan padding kiri atau kanan hingga sepanjang n karakter dengan urutan karakter dalam expr2:

LPAD('A',3,'*') = **A
Ya LPAD/RPAD Setara dengan Oracle:

LPAD('A',3,'*') = **A
SUBSTR Tampilkan sebagian char, mulai dari posisi karakter, dengan panjang substring
karakter:

SUBSTR('PostgreSQL', 8, 3)
= SQL
Sebagian SUBSTR Setara dengan Oracle saat posisi awalnya adalah bilangan positif.

SUBSTR('PostgreSQL', 8, 3)
= SQL

Jika bilangan negatif diberikan sebagai posisi awal di Oracle, operasi substring akan dijalankan dari akhir string. Hal ini berbeda dengan di Cloud SQL untuk PostgreSQL. Gunakan fungsi RIGHT sebagai pengganti jika menginginkan perilaku seperti di Oracle.
INSTR Menampilkan posisi (indeks) sebuah string tertentu dari string yang diberikan:

INSTR('PostgreSQL', 'e')
= 7
Tidak T/A Cloud SQL untuk PostgreSQL tidak memiliki fungsi instr bawaan. Fungsi instr yang kompatibel dengan Oracle dapat diimplementasikan menggunakan PL/pgSQL.
REPLACE Menampilkan karakter dengan setiap kemunculan string penelusuran diganti dengan string pengganti
:

REPLACE('ORADB', 'ORA', 'PostgreSQL')
= PostgreSQLDB
Sebagian REPLACE Parameter string pengganti di Oracle bersifat opsional, sedangkan di Cloud SQL untuk PostgreSQL bersifat wajib. Jika parameter ini dihilangkan, Oracle akan menghapus semua kemunculan string penelusuran. Perilaku yang sama dapat dicapai di Cloud SQL untuk PostgreSQL dengan memberikan string kosong sebagai string pengganti.

REPLACE('ORADB', 'ORA', 'PostgreSQL')
= PostgreSQLDB
TRIM Memangkas karakter di awal atau di akhir (atau keduanya) dari string:

TRIM(both '-' FROM '-PostgreSQL-')
= PostgreSQL
TRIM(' PostgreSQL ')
= PostgreSQL
Ya TRIM Setara dengan Oracle:

TRIM(both '-' FROM '-PostgreSQL-')
= PostgreSQL
TRIM(' PostgreSQL ')
= PostgreSQL
LTRIM/RTRIM Menghapus semua karakter dari ujung kiri atau kanan string yang
muncul dalam penelusuran:

LTRIM(' PostgreSQL', ' ')
= PostgreSQL
Ya LTRIM/RTRIM Setara dengan Oracle:

LTRIM(' PostgreSQL', ' ') = PostgreSQL
ASCII Menampilkan representasi desimal dalam himpunan karakter database dari karakter pertama char:

ASCII('A') = 65
Ya ASCII Setara dengan Oracle:

ASCII('A') = 65
CHR Menampilkan nilai kode ASCII, yang merupakan nilai numerik antara 0 dan 225, hingga sebuah karakter:

CHR(65) = A
Ya CHAR Setara dengan Oracle:

CHR(65) = A
LENGTH Menampilkan panjang string tertentu:

LENGTH ('PostgreSQL') = 10
Ya LENGTH Setara dengan Oracle:

LENGTH ('PostgreSQL') = 10
REGEXP_REPLACE Mencari pola ekspresi reguler dalam string:

REGEXP_REPLACE('John', '[hn].', '1') = Jo1
Ya REGEXP_REPLACE Setara dengan Oracle:

REGEXP_REPLACE('John', '[hn].', '1') = Jo1
REGEXP_SUBSTR Memperluas fungsionalitas fungsi SUBSTR dengan mencari
pola ekspresi reguler dalam string:

REGEXP_SUBSTR('https://console.cloud.google.com/sql/instances','https://([[:alnum:]]+\.?){3,4}/?')
= https://console.cloud.google.com/
Tidak T/A Gunakan REGEXP_MATCH PostgreSQL untuk mendapatkan fungsionalitas serupa.
REGEXP_COUNT Menampilkan frekuensi kemunculan pola di sebuah string sumber. Tidak T/A Gunakan REGEXP_MATCH PostgreSQL untuk mencapai fungsionalitas serupa.
REGEXP_INSTR Mencari pola ekspresi reguler dalam posisi
string (indeks).
Tidak T/A Mengonversi fungsionalitas menjadi lapisan aplikasi.
REVERSE Menampilkan string terbalik.

REVERSE('PostgreSQL') = LQSergtsoP
Ya REVERSE Setara dengan Oracle:

REVERSE('PostgreSQL') = LQSergtsoP
Fungsi numerik
Fungsi di Oracle Spesifikasi atau implementasi fungsi di Oracle Setara dengan Cloud SQL untuk PostgreSQL Fungsi terkait di Cloud SQL untuk PostgreSQL Spesifikasi atau implementasi fungsi di Cloud SQL untuk PostgreSQL
ABS Nilai absolut n:

ABS(-4.6) = 4.6
Ya ABS Setara dengan Oracle:

ABS(-4.6) = 4.6
CEIL Menampilkan bilangan bulat terkecil yang lebih besar daripada atau sama dengan n:

CEIL(21.4) = 22
Ya CEIL Setara dengan Oracle:

CEIL(21.4) = 22
FLOOR Menampilkan bilangan bulat terbesar yang sama dengan atau lebih kecil daripada n:

FLOOR(-23.7) = -24
Ya FLOOR Setara dengan Oracle:

FLOOR(-23.7) = -24
MOD Menampilkan sisa m dibagi n:

MOD(10, 3) = 1
Ya MOD Setara dengan Oracle:

MOD(10, 3) = 1
ROUND Menampilkan n yang dibulatkan ke tempat bilangan bulat di sebelah kanan tanda desimal:

ROUND(1.39, 1) = 1.4
Ya ROUND Setara dengan Oracle:

ROUND(1.39, 1) = 1.4
TRUNC
(angka)
Menampilkan n1 yang dipangkas hingga n2 di belakang koma:

TRUNC(99.999) = 99
TRUNC(99.999, 0) = 99
Ya TRUNCATE
(angka)
Setara dengan Oracle:

TRUNC(99.999) = 99
TRUNC(99.999, 0) = 99
Fungsi DateTime
Fungsi di Oracle Spesifikasi atau implementasi fungsi di Oracle Setara dengan Cloud SQL untuk PostgreSQL Fungsi terkait di Cloud SQL untuk PostgreSQL Spesifikasi atau implementasi fungsi di Cloud SQL untuk PostgreSQL
SYSDATE Menampilkan tanggal dan waktu saat ini yang ditetapkan untuk sistem operasi tempat server database berada:

SELECT SYSDATE FROM DUAL
= 31-JUL-2019
Sebagian dengan nama fungsi dan format berbeda CURRENT_TIMESTAMP CURRENT_TIMESTAMP akan menampilkan format tanggal dan waktu yang berbeda dengan fungsi SYSDATE di Oracle:

SELECT CURRENT_TIMESTAMP
= 2019-07-31 06:46:40.171477+00
SYSTIMESTAMP Menampilkan tanggal sistem, termasuk detik pecahan dan zona waktu:

SELECT SYSTIMESTAMP FROM DUAL
= 01-JAN-19 07.37.11.622187000 AM +00:00
Sebagian dengan nama fungsi berbeda CURRENT_TIMESTAMP Cloud SQL untuk PostgreSQL menampilkan format tanggal/waktu yang berbeda dengan di Oracle. Pemformatan tanggal diperlukan agar sama dengan format tanggal/waktu asli:

SELECT CURRENT_TIMESTAMP
= 2019-01-31 07:37:11.622187+00
LOCAL TIMESTAMP Menampilkan tanggal dan waktu saat ini di zona waktu sesi dalam nilai dengan jenis data TIMESTAMP:

SELECT LOCALTIMESTAMP FROM DUAL
= 01-JAN-19 10.01.10.123456 PM
Sebagian dengan format tanggal/waktu berbeda LOCAL TIMESTAMP Cloud SQL untuk PostgreSQL menampilkan format tanggal/waktu yang berbeda dengan di Oracle. Pemformatan tanggal diperlukan agar sama dengan format tanggal/waktu asli:

SELECT LOCALTIMESTAMP
= 2019-01-31 07:37:11.622187+00
CURRENT_DATE Menampilkan tanggal saat ini dalam zona waktu sesi:

SELECT CURRENT_DATE FROM DUAL
= 31-JAN-19
Sebagian dengan format tanggal/waktu berbeda CURRENT_ DATE Cloud SQL untuk PostgreSQL menampilkan format tanggal/waktu yang berbeda dengan di Oracle. Pemformatan tanggal diperlukan agar sama dengan format tanggal/waktu asli:

SELECT CURRENT_DATE
= 2019-01-31
CURRENT_TIMESTAMP Menampilkan tanggal dan waktu saat ini dalam zona waktu sesi:

SELECT CURRENT_TIMESTAMP FROM DUAL
= 31-JAN-19 06.54.35.543146 AM +00:00
Sebagian dengan format tanggal/waktu berbeda CURRENT_TIMESTAMP Cloud SQL untuk PostgreSQL menampilkan format tanggal/waktu yang berbeda dengan di Oracle. Pemformatan tanggal diperlukan agar sama dengan format tanggal/waktu asli:

SELECT CURRENT_TIMESTAMP FROM DUAL
= 2019-01-31 07:37:11.622187+00s
ADD_MONTHS Menampilkan tanggal plus bulan dalam bilangan bulat:

ADD_MONTHS(SYSDATE, 1)
= 31-JAN-19
Tidak T/A Untuk mendapatkan fungsionalitas yang sama di Cloud SQL untuk PostgreSQL, gunakan operator + / - dan tentukan interval waktunya:

SELECT CURRENT_TIMESTAMP + INTERVAL '1 MONTH'
= 2019-01-31 07:37:11.622187+00s
EXTRACT
(bagian tanggal)
Menampilkan nilai kolom tanggal/waktu tertentu dari ekspresi tanggal/waktu atau interval:

EXTRACT(YEAR FROM DATE '2019-01-31')
= 2019
Ya EXTRACT
(bagian tanggal)
Setara dengan Oracle:

EXTRACT(YEAR FROM DATE '2019-01-31')
= 2019
LAST_DAY Menampilkan tanggal dari hari terakhir bulan itu yang berisi tanggal yang ditentukan:

LAST_DAY('01-JAN-2019')
= 31-JAN-19
Tidak T/A Sebagai solusinya, gunakan operator DATE_TRUNC dan + untuk menghitung hari terakhir bulan itu. Pemformatan tanggal diperlukan agar sama dengan format tanggal/waktu asli:

SELECT DATE_TRUNC('MONTH', DATE '01-JAN-2019') + INTERVAL '1 MONTH -1 DAY'
= 2019-01-31
MONTH_BETWEEN Menampilkan jumlah bulan antara tanggal date1 dan date2:

MONTHS_BETWEEN(SYSDATE, SYSDATE-60)
= 1.96
Sebagian
dengan
format tanggal/waktu Fungsi yang berbeda
AGE Fungsi AGE Cloud SQL untuk PostgreSQL menampilkan interval antara dua stempel waktu:

AGE(DATE '01-JAN-2019', DATE '01-JAN-2019' - 60)
= 1 mon 29 days

Untuk mendapatkan nilai yang sama dengan fungsi MONTH_BETWEEN di Oracle, diperlukan konversi yang lebih spesifik.
TO_CHAR (tanggal/waktu) Mengonversi jenis data tanggal/waktu atau stempel waktu menjadi nilai dengan jenis data VARCHAR2
dalam format yang ditentukan oleh format tanggal:

TO_CHAR(SYSDATE,'DD-MM-YYYY HH24:MI:SS')
= 01-01-2019 10:01:01
Ya To_CHAR Setara dengan Oracle:

TO_CHAR(CURRENT_TIMESTAMP,'DD-MM-YYYY HH24:MI:SS');
01-01-2019 10:01:01
Fungsi encoding dan decoding
Fungsi di Oracle Spesifikasi atau implementasi fungsi di Oracle Setara dengan Cloud SQL untuk PostgreSQL Fungsi terkait di Cloud SQL untuk PostgreSQL Spesifikasi atau implementasi fungsi di Cloud SQL untuk PostgreSQL
DECODE Membandingkan ekspresi dengan setiap nilai penelusuran satu per satu menggunakan pernyataan IF-THEN-ELSE. Tidak CASE Gunakan pernyataan CASE Cloud SQL untuk PostgreSQL guna mendapatkan fungsionalitas yang mirip.
DUMP Menampilkan nilai VARCHAR2 yang berisi kode jenis data, panjang dalam byte, dan representasi internal ekspresi. Tidak T/A Tidak didukung.
ORA_HASH Menghitung nilai hash untuk ekspresi tertentu. Tidak MD5 / SHA224 / SHA256 / SHA385 / SHA512 Gunakan fungsi MD5 Cloud SQL untuk PostgreSQL untuk checksum 128-bit, atau fungsi SHA untuk checksum
160-bit, guna menghasilkan nilai hash.
Fungsi konversi
Fungsi di Oracle Spesifikasi atau implementasi fungsi di Oracle Setara dengan Cloud SQL untuk PostgreSQL Fungsi terkait di Cloud SQL untuk PostgreSQL Spesifikasi atau implementasi fungsi di Cloud SQL untuk PostgreSQL
CAST Mengonversi satu jenis data bawaan atau nilai berjenis koleksi menjadi jenis data bawaan atau nilai berjenis koleksi lainnya:

CAST('1' as int) + 1
= 2
Sebagian CAST Fungsi CAST Cloud SQL untuk PostgreSQL mirip dengan fungsionalitas CAST Oracle. Namun, dalam kasus tertentu, fungsi ini harus disesuaikan karena terdapat perbedaan jenis data antara kedua database:

CAST('1' as int) + 1
= 2
CONVERT Mengonversi string karakter dari satu himpunan karakter ke himpunan karakter lainnya:

CONVERT ( 'Ä Ê Í Õ Ø A B C D E ', 'US7ASCII', 'WE8ISO8859P1')
= ?? ?? ?? A B C
Sebagian CONVERT Fungsi CONVERT Cloud SQL untuk PostgreSQL menampilkan nilai bytea, yang merupakan string biner, bukan VARCHAR atau TEXT. Himpunan karakter yang didukung oleh PostgreSQL juga berbeda dengan di Oracle.

CONVERT('Ä Ê Í Õ Ø A B C D E', 'UTF8', 'LATIN1')
= [Binary representation of the string in LATIN1 encoding]
TO_CHAR
(string/numerik)
Fungsi ini mengonversi angka atau tanggal menjadi string:

TO_CHAR(22.73,'$99.9')
= $22.7
Sebagian TO_CHAR Fungsi TO_CHAR Cloud SQL untuk PostgreSQL memiliki fungsionalitas yang mirip dengan di Oracle. Cloud SQL untuk PostgreSQL mendukung daftar string pemformatan yang sedikit berbeda. Secara default, Cloud SQL untuk PostgreSQL menyimpan satu kolom untuk tanda, sehingga akan ada spasi sebelum bilangan positif. Spasi ini dapat disembunyikan dengan menggunakan imbuhan FM:

TO_CHAR(22.73,'FM$99.9')
= $22.7
TO_DATE Fungsi TO_DATE Oracle mengonversi string menjadi tanggal berdasarkan format tanggal/waktu spesifik sumbernya:

TO_DATE('2019/01/01', 'yyyy-mm-dd')
= 01-JAN-2019
Sebagian TO_DATE Fungsi TO_DATE Cloud SQL untuk PostgreSQL memiliki fungsionalitas yang mirip dengan di Oracle. Cloud SQL untuk PostgreSQL mendukung daftar string pemformatan yang sedikit berbeda:

TO_DATE('2019/01/01', 'yyyy-mm-dd')
= 2019-01-01
TO_NUMBER Mengonversi ekspresi menjadi nilai dengan jenis data NUMBER:

TO_NUMBER('01234')
= 1234
Sebagian TO_NUMBER Fungsi TO_NUMBER di Cloud SQL untuk PostgreSQL mengharuskan string pemformatan sebagai input, tetapi hal itu opsional di Oracle:

TO_NUMBER('01234','99999')
= 1234

Alternatifnya adalah menggunakan fungsi CAST untuk konversi yang tidak memerlukan string pemformatan kompleks:

CAST('01234' AS NUMERIC)
= 1234
Fungsi SELECT bersyarat
Fungsi di Oracle Spesifikasi atau implementasi fungsi di Oracle Setara dengan Cloud SQL untuk PostgreSQL Fungsi terkait di Cloud SQL untuk PostgreSQL Spesifikasi atau implementasi fungsi di Cloud SQL untuk PostgreSQL
CASE Pernyataan CASE memilih dari serangkaian kondisi dan menjalankan pernyataan
yang terkait dengan sintaksis berikut:

CASE WHEN condition THEN result [WHEN ...] [ELSE result] END
Ya CASE Setara dengan Oracle:

CASE WHEN condition THEN result [WHEN ...] [ELSE result] END
Fungsi null
Fungsi di Oracle Spesifikasi atau implementasi fungsi di Oracle Setara dengan Cloud SQL untuk PostgreSQL Fungsi terkait di Cloud SQL untuk PostgreSQL Spesifikasi atau implementasi fungsi di Cloud SQL untuk PostgreSQL
COALESCE Menampilkan ekspresi bukan null pertama dalam daftar ekspresi:

COALESCE(null, '1', 'a')
= a
Ya COALESCE Setara dengan Oracle:

COALESCE(null, '1', 'a')
= 1
NULLIF Membandingkan expr1 dan expr2. Jika keduanya sama, fungsi akan menampilkan null. Jika keduanya tidak sama, fungsi akan menampilkan expr1:

NULLIF('1', '2')
= 1
Ya NULLIF Setara dengan Oracle:

NULLIF('1', '2')
= 1
NVL Mengganti null (ditampilkan sebagai kosong) dengan string dalam hasil kueri:

NVL(null, 'a')
= a
Tidak COALESCE Sebagai alternatif, gunakan fungsi COALESCE:

COALESCE(null, 'a')
= a
NVL2 Menentukan nilai yang ditampilkan oleh kueri berdasarkan nilai ekspresi
tertentu, yakni null atau bukan null.
Tidak COALESCE Sebagai alternatif, gunakan fungsi COALESCE:

COALESCE(null, 1, 'a')
= 1
Fungsi lingkungan dan ID
Fungsi di Oracle Spesifikasi atau implementasi fungsi di Oracle Setara dengan Cloud SQL untuk PostgreSQL Fungsi terkait di Cloud SQL untuk PostgreSQL Spesifikasi atau implementasi fungsi di Cloud SQL untuk PostgreSQL
SYS_GUID Menghasilkan dan menampilkan ID unik global (nilai RAW) yang terdiri
atas 16 byte:

SELECT SYS_GUID() FROM DUAL
= 8EFA4A31468B4C6DE05011AC0200009E
Sebagian dengan nama fungsi dan format berbeda UUID_GENERATE_V4 Cloud SQL untuk PostgreSQL mendukungekstensi uuid-ossp yang menyediakan daftar fungsi penghasil UUID seperti UUID_GENERATE_V4:

SELECT UUID_GENERATE_v4()
= eaf356a6-2847-478d-af3b-6883f5ac6af2
UID Menampilkan bilangan bulat yang mengidentifikasi pengguna sesi secara unik (pengguna
yang login):

SELECT UID FROM DUAL
= 43
Tidak T/A T/A
USER Menampilkan nama dari nama pengguna sesi saat ini:

SELECT USER FROM DUAL
= UserName
Ya USER Setara dengan Oracle:

SELECT USER;
= postgres
USERENV Menampilkan informasi tentang sesi pengguna saat ini dengan konfigurasi parameter saat ini:

SELECT USERENV('LANGUAGE') FROM DUAL
= ENGLISH_AMERICA.AL32UTF8
Tidak T/A Meskipun tidak ada fungsi USERENV yang setara di Cloud SQL untuk PostgreSQL, parameter individual seperti USERENV('SID') dapat diambil menggunakan fungsi informasi sistem seperti PG_BACKGROUND_PID().
ROWID Server Oracle menetapkan ROWID unik ke setiap baris di setiap tabel untuk mengidentifikasi baris tersebut dalam tabel. ROWID adalah alamat baris yang berisi nomor objek data, blok data baris, posisi baris, dan file data. Sebagian dengan nama fungsi berbeda ctid ctid di Cloud SQL untuk PostgreSQL mengidentifikasi lokasi fisik versi baris dalam tabelnya, yang mirip dengan fungsi ROWID di Oracle.
ROWNUM Menampilkan angka yang menunjukkan urutan pemilihan baris oleh Oracle dari tabel atau tabel gabungan. Tidak LIMIT or ROW_NUMBER() Alih-alih membatasi jumlah hasil yang ditampilkan oleh kueri menggunakan ROWNUM, Cloud SQL untuk PostgreSQL mendukung LIMIT dan OFFSET untuk keperluan serupa.

Fungsi jendela ROW_NUMBER() dapat menjadi solusi pengganti dari fungsi ROWNUM Oracle dalam skenario lainnya. Namun, pengurutan hasil dan delta performa harus dipertimbangkan sebelum menggunakan fungsi tersebut sebagai pengganti.
Fungsi agregat (grup)
Fungsi di Oracle Spesifikasi atau implementasi fungsi di Oracle Setara dengan Cloud SQL untuk PostgreSQL Fungsi terkait di Cloud SQL untuk PostgreSQL Spesifikasi atau implementasi fungsi di Cloud SQL untuk PostgreSQL
AVG Menampilkan nilai rata-rata kolom atau ekspresi. Ya AVG Setara dengan Oracle
COUNT Menampilkan jumlah baris yang ditampilkan oleh kueri. Ya COUNT Setara dengan Oracle
COUNT (DISTINCT) Menampilkan jumlah nilai unik dalam kolom atau ekspresi. Ya COUNT
(DISTINCT)
Setara dengan Oracle
MAX Menampilkan nilai maksimum kolom atau ekspresi. Ya MAX Setara dengan Oracle
MIN Menampilkan nilai minimum kolom atau ekspresi. Ya MIN Setara dengan Oracle
SUM Menampilkan jumlah nilai kolom atau ekspresi. Ya SUM Setara dengan Oracle
LISTAGG Menampilkan data dalam setiap grup berdasarkan satu baris yang ditentukan dalam klausa ORDER BY dengan menggabungkan nilai kolom pengukuran:

SELECT LISTAGG(
DEPARTMENT_NAME, ', ')
WITHIN GROUP
(ORDER BY DEPARTMENT_NAME) DEPT
FROM DEPARTMENTS;

-- Single line results
= Accounting, Administration, Benefits, Construction
Tidak STRING_AGG Gunakan fungsi STRING_AGG Cloud SQL untuk PostgreSQL untuk menampilkan hasil yang mirip dengan yang di Oracle, antisipasi perbedaan sintaksis pada kasus tertentu:

SELECT STRING_AGG(DEPARTMENT_NAME, ', ' order by DEPARTMENT_NAME) FROM DEPARTMENTS;

-- Single line results
= Accounting, Administration, Benefits, Construction
Fetch di Oracle 12c
Fungsi di Oracle Spesifikasi atau implementasi fungsi di Oracle Setara dengan Cloud SQL untuk PostgreSQL Fungsi terkait di Cloud SQL untuk PostgreSQL Spesifikasi atau implementasi fungsi di Cloud SQL untuk PostgreSQL
FETCH Mengambil baris data dari kumpulan hasil kueri multi-baris:

SELECT * FROM
EMPLOYEES
FETCH FIRST 10 ROWS ONLY;
Tidak LIMIT Gunakan klausa LIMIT di Cloud SQL untuk PostgreSQL guna mengambil kumpulan data tertentu saja:

SELECT * FROM EMPLOYEES LIMIT 10;

Pemfilteran, operator, dan subkueri dasar

Selama konversi, pemfilteran, fungsi operator, dan subkueri dasar relatif mudah ditangani, hanya perlu sedikit atau bahkan tanpa upaya tambahan.

Catatan konversi

Periksa dan tangani format tanggal karena format Oracle dan Cloud SQL untuk PostgreSQL menampilkan hasil default yang berbeda:

  • Fungsi SYSDATE Oracle secara default menampilkan 01-AUG-19.
  • Fungsi CURRENT_DATE PostgreSQL secara default menampilkan 2019-08-01 (tanpa waktu meskipun dengan pemformatan). Untuk mengambil tanggal dan waktu saat ini, gunakan fungsi CURRENT_TIMESTAMP yang secara default menampilkan 01-08-2019 00:00:00.000000+00.
  • Format tanggal dan waktu dapat ditetapkan menggunakan fungsi TO_CHAR Cloud SQL untuk PostgreSQL.
Fungsi atau subkueri di Oracle Setara dengan Cloud SQL untuk PostgreSQL Fungsi atau subkueri terkait di Cloud SQL untuk PostgreSQL Spesifikasi atau implementasi fungsi di Cloud SQL untuk PostgreSQL
EXISTS/ NOT EXISTS Ya EXISTS/ NOT EXISTS SELECT * FROM DEPARTMENTS D
WHERE EXISTS (SELECT 1
FROM EMPLOYEES E
WHERE
E.DEPARTMENT_ID =
D.DEPARTMENT_ID);
IN/NOT IN Ya IN/NOT IN SELECT * FROM DEPARTMENTS D
WHERE DEPARTMENT_ID IN
(SELECT DEPARTMENT_ID
FROM EMPLOYEES E);

-- OR
SELECT * FROM EMPLOYEES
WHERE (EMPLOYEE_ID, DEPARTMENT_ID)
IN((100, 90));
LIKE/NOT LIKE Ya LIKE/NOT LIKE SELECT * FROM EMPLOYEES
WHERE FIRST_NAME LIKE '_e_n%';
BETWEEN/ NOT BETWEEN Ya BETWEEN/
NOT BETWEEN
SELECT * FROM EMPLOYEES
WHERE EXTRACT(YEAR FROM HIRE_DATE)
NOT BETWEEN 2001 and 2004;
AND/OR Ya AND/OR SELECT * FROM EMPLOYEES
WHERE DEPARTMENT_ID IN(100, 101)
AND (SALARY >= 1000 OR HIRE_DATE <= '2006-02-05');
SubQuery Ya SubQuery Cloud SQL untuk PostgreSQL mendukung subkueri di level SELECT, untuk pernyataan JOIN dan untuk pemfilteran dalam klausa WHERE/AND:

-- SELECT SubQuery
SELECT D.DEPARTMENT_NAME,
(SELECT AVG(SALARY) AS AVG_SAL
FROM EMPLOYEES E
WHERE E.DEPARTMENT_ID =
D.DEPARTMENT_ID) AVG_SAL
FROM DEPARTMENTS D;

-- JOIN SubQuery
SELECT FIRST_NAME, LAST_NAME, SALARY
FROM EMPLOYEES E JOIN
(SELECT *
FROM DEPARTMENTS
WHERE LOCATION_ID = 2700) D
ON E.DEPARTMENT_ID = D.DEPARTMENT_ID;

-- Filtering Subquery
SELECT FIRST_NAME,
LAST_NAME,
SALARY
FROM EMPLOYEES
WHERE SALARY < (SELECT AVG(SALARY)
FROM EMPLOYEES);
Operator Ya Operator Cloud SQL untuk PostgreSQL mendukung semua operator dasar:

> | >= | < | <= | = | <> | !=

Fungsi analitik (atau fungsi jendela dan peringkat)

Fungsi analitik Oracle memperluas fungsionalitas operasi SQL standar dengan menyediakan kapabilitas untuk menghitung nilai agregat berdasarkan sekumpulan baris (misalnya RANK(), ROW_NUMBER(), FIRST_VALUE()). Fungsi ini diterapkan ke data yang dipartisi secara logis dalam lingkup ekspresi kueri tunggal. Fungsi tersebut umum digunakan dalam data warehousing, bersama dengan laporan dan analisis business intelligence.

Catatan konversi

Cloud SQL untuk PostgreSQL mendukung banyak fungsi analitik. Fungsi tersebut dikenal di Postgres sebagai fungsi agregat dan fungsi jendela. Jika aplikasi Anda menggunakan fungsi kurang umum yang tidak didukung di Postgres, Anda harus mencari ekstensi yang didukung atau memindahkan logika ke lapisan aplikasi.

Tabel berikut menampilkan daftar fungsi analitik yang paling umum di Oracle.

Kelompok fungsi Fungsi terkait Didukung oleh Cloud SQL untuk PostgreSQL
Analitik dan peringkat RANK
AVERAGE_RANK
DENSE_RANK
ROW_NUMBER
PERCENT_RANK
CUME_DIST
NTILE
FIRST_VALUE
LAST_VALUE
OVER (PARTITION BY...)
Ya (Kecuali AVERAGE_RANK)
Hierarkis CONNECT BY
HIER_ANCESTOR
HIER_CHILD_COUNT
HIER_DEPTH
HIER_LEVEL
HIER_ORDER
HIER_PARENT
HIER_TOP
Tidak
Lag LAG
LAG_VARIANCE LAG_VARIANCE_PERCENT LEAD
LEAD_VARIANCE LEAD_VARIANCE_PERCENT
Ya (khusus LAG dan LEAD)

Ekspresi tabel umum (CTE)

CTE menyediakan cara mengimplementasikan logika kode berurutan untuk menggunakan kembali kode SQL yang mungkin terlalu kompleks atau tidak efisien untuk banyak penggunaan. CTE dapat dinamai dan kemudian digunakan berkali-kali di berbagai bagian pernyataan SQL menggunakan klausa WITH. CTE didukung baik oleh Oracle maupun Cloud SQL untuk PostgreSQL.

Contoh
Oracle dan Cloud SQL untuk PostgreSQL
WITH DEPT_COUNT
(DEPARTMENT_ID, DEPT_COUNT) AS
(SELECT DEPARTMENT_ID,
COUNT(*)
FROM EMPLOYEES
GROUP BY DEPARTMENT_ID)

SELECT E.FIRST_NAME ||' '|| E.LAST_NAME AS EMP_NAME,
D.DEPT_COUNT AS EMP_DEPT_COUNT
FROM EMPLOYEES E JOIN DEPT_COUNT D
USING (DEPARTMENT_ID)
ORDER BY 2 DESC;

Pernyataan MERGE

Pernyataan MERGE (atau UPSERT) menyediakan cara untuk menentukan pernyataan SQL tunggal yang melakukan operasi DML secara bersyarat dalam satu operasi MERGE, bukan satu operasi DML, yang berjalan terpisah. Pernyataan ini memilih data dari tabel sumber, kemudian melakukan beberapa operasi DML pada tabel target secara otomatis dengan menentukan struktur logika. Fitur ini membantu Anda menghindari penggunaan pernyataan insert, update, atau delete secara berulang-ulang. Perhatikan bahwa MERGE adalah pernyataan deterministik. Artinya, baris yang telah diproses oleh pernyataan MERGE tidak dapat diproses lagi menggunakan pernyataan MERGE yang sama.

Catatan konversi

Tidak seperti Oracle, Cloud SQL untuk PostgreSQL tidak mendukung fungsi MERGE. Guna menyimulasikan sebagian fungsionalitas MERGE, Cloud SQL untuk PostgreSQL menyediakan pernyataan INSERT ... ON CONFLICT DO UPDATE:

  • INSERT… ON CONFLICT DO UPDATE: Jika baris yang disisipkan menyebabkan pelanggaran unik atau error pelanggaran batasan pengecualian, tindakan alternatif yang ditentukan dalam klausa ON CONFLICT DO UPDATE akan diambil, misalnya:
INSERT INTO tbl (a,b,c) VALUES (1,2,3)
  ON CONFLICT (a) DO UPDATE SET b = 2, c = 3;

Solusi lainnya adalah mengonversi fungsionalitas MERGE menjadi prosedur tersimpan untuk mengelola operasi DML, menggunakan perintah INSERT, UPDATE, dan DELETE dengan penanganan pengecualian serta duplikasi.

Petunjuk pernyataan SQL

Oracle menyediakan banyak petunjuk kueri SQL yang memungkinkan pengguna memengaruhi perilaku pengoptimal, dengan tujuan menghasilkan rencana eksekusi kueri yang lebih efisien. Cloud SQL untuk PostgreSQL tidak menawarkan tingkat pernyataan SQL yang sebanding, yang memberikan petunjuk terkait mekanisme untuk memengaruhi pengoptimal.

Untuk memengaruhi rencana kueri yang dipilih oleh perencana kueri, Cloud SQL untuk PostgreSQL menyediakan sekumpulan parameter konfigurasi yang dapat diterapkan di tingkat sesi. Efek dari parameter konfigurasi ini berkisar mulai dari mengaktifkan/menonaktifkan metode akses tertentu, hingga menyesuaikan konstanta biaya perencana. Misalnya, pernyataan berikut menonaktifkan penggunaan jenis rencana pemindaian berurutan, seperti pemindaian tabel lengkap, oleh perencana kueri:

SET ENABLE_SEQSCAN=FALSE;

Untuk menyesuaikan estimasi biaya pengambilan halaman disk acak oleh perencana (defaultnya adalah 4.0), gunakan pernyataan berikut:

SET RANDOM_PAGE_COST=2.0;

Mengurangi nilai ini akan menyebabkan Cloud SQL untuk PostgreSQL lebih memilih pemindaian indeks. Hal sebaliknya akan terjadi jika nilai ini diperbesar.

Catatan konversi

Karena ada perbedaan mendasar antara pengoptimal Oracle dan Cloud SQL untuk PostgreSQL, serta fakta bahwa Cloud SQL untuk PostgreSQL tidak mendukung petunjuk kueri SQL gaya Oracle, sebaiknya hapus semua petunjuk kueri saat Anda bermigrasi ke Cloud SQL untuk PostgreSQL. Kemudian, lakukan pengujian performa yang ketat melalui alat Cloud SQL untuk PostgreSQL, periksa kueri menggunakan rencana eksekusi, dan sesuaikan parameter sesi atau instance sesuai dengan kasus penggunaannya.

Rencana eksekusi

Kegunaan utama rencana eksekusi adalah untuk memberikan gambaran mendalam mengenai pilihan yang dibuat oleh pengoptimal kueri untuk mengakses data database. Pengoptimal kueri menghasilkan rencana eksekusi untuk pernyataan SELECT, INSERT, UPDATE, dan DELETE bagi pengguna database, serta memungkinkan administrator lebih memahami kueri dan operasi DML tertentu. Rencana ini sangat berguna saat Anda perlu menyesuaikan performa kueri—misalnya, untuk mengetahui performa indeks atau menentukan apakah ada indeks yang hilang yang perlu dibuat

Rencana eksekusi dapat dipengaruhi oleh volume data, statistik data, dan parameter instance (parameter global atau sesi).

Pertimbangan konversi

Rencana eksekusi bukanlah objek database yang perlu dimigrasikan, melainkan alat untuk menganalisis perbedaan performa antara Oracle dan Cloud SQL untuk PostgreSQL yang menjalankan pernyataan yang sama pada set data identik.

Cloud SQL untuk PostgreSQL tidak mendukung sintaksis, fungsionalitas, atau output rencana eksekusi yang sama dengan Oracle.

Berikut adalah contoh rencana eksekusi:

Rencana eksekusi di Oracle Rencana eksekusi di Cloud SQL untuk PostgreSQL
SQL> EXPLAIN PLAN FOR
SELECT * FROM EMPLOYEES WHERE EMPLOYEE_ID = 105;

SQL> SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY (FORMAT=>'ALL +OUTLINE'));

Plan hash value: 1833546154

---------------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
---------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 69 | 1 (0)| 00:00:01 |
| 1 | TABLE ACCESS BY INDEX ROWID| EMPLOYEES | 1 | 69 | 1 (0)| 00:00:01 |
|* 2 | INDEX UNIQUE SCAN | EMP_EMP_ID_PK | 1 | | 0 (0)| 00:00:01 |
---------------------------------------------------------------------------------------------
postgres=> EXPLAIN SELECT * FROM EMPLOYEES WHERE EMPLOYEE_ID = 105; QUERY PLAN -------------------------------------------------------------------------------- Index Scan using emp_emp_id_pk on employees (cost=0.14..8.16 rows=1 width=71) Index Cond: (employee_id = '105'::numeric) (2 rows)

Prosedur, fungsi, dan pemicu tersimpan

PL/SQL adalah bahasa prosedural tambahan di Oracle untuk membuat, menyimpan, dan menerapkan solusi berbasis kode dalam database. Secara umum, prosedur dan fungsi tersimpan database adalah elemen kode yang terdiri atas bahasa prosedural tambahan ANSI SQL dan SQL—misalnya PL/SQL untuk Oracle dan bahasa prosedural MySQL untuk MySQL. PL/pgSQL ditujukan untuk bahasa prosedural tambahan PostgreSQL.

Prosedur dan fungsi tersimpan ini digunakan untuk memberikan solusi bagi persyaratan yang lebih cocok dijalankan dari dalam database, bukan dari aplikasi (misalnya performa, kompatibilitas, dan keamanan). Meskipun sama-sama menggunakan PL/SQL, prosedur tersimpan digunakan terutama untuk menjalankan operasi DDL/DML, sedangkan fungsi tersimpan biasa digunakan untuk melakukan penghitungan guna menampilkan hasil tertentu.

PL/SQL ke PL/pgSQL

Dari perspektif migrasi PL/SQL Oracle ke Cloud SQL untuk PostgreSQL, PL/pgSQL mirip dengan PL/SQL Oracle dalam hal struktur dan sintaksisnya. Namun, ada beberapa perbedaan utama yang mengharuskan migrasi kode. Misalnya, jenis data antara Oracle dan Cloud SQL untuk PostgreSQL berbeda, sehingga terjemahan sering kali diperlukan untuk memastikan bahwa kode yang dimigrasikan menggunakan nama jenis data terkait yang didukung oleh Cloud SQL untuk PostgreSQL. Untuk pembahasan mendetail tentang perbedaan antara kedua bahasa tersebut, lihat Melakukan porting dari PL/SQL Oracle.

Hak istimewa dan keamanan objek kode

Di Oracle, untuk membuat prosedur atau fungsi tersimpan, pengguna harus memiliki hak istimewa sistem CREATE PROCEDURE (untuk membuat prosedur atau fungsi pada pengguna lain, pengguna database harus memiliki hak istimewa CREATE ANY PROCEDURE). Untuk menjalankan prosedur atau fungsi tersimpan, pengguna database harus memiliki hak istimewa EXECUTE.

Di PostgreSQL, untuk membuat prosedur kode atau fungsi, pengguna harus memiliki hak istimewa USAGE. Untuk menjalankan prosedur atau fungsi, pengguna harus memiliki hak istimewa EXECUTE atas prosedur atau fungsi itu.

Secara default, prosedur atau fungsi PL/pgSQL ditetapkan sebagai SECURITY INVOKER, yang berarti prosedur atau fungsi tersebut akan dijalankan dengan hak istimewa pengguna yang memanggilnya. Atau, SECURITY DEFINER dapat ditentukan agar fungsi dijalankan dengan hak istimewa pengguna yang memilikinya.

Sintaksis prosedur dan fungsi tersimpan di Cloud SQL untuk PostgreSQL

Contoh berikut menunjukkan sintaksis prosedur dan fungsi tersimpan di Cloud SQL untuk PostgreSQL:

CREATE [ OR REPLACE ] PROCEDURE
    name ( [ [ argmode ] [ argname ] argtype [ { DEFAULT | = } default_expr ] [, ...] ] )
  { LANGUAGE lang_name
    | TRANSFORM { FOR TYPE type_name } [, ... ]
    | [ EXTERNAL ] SECURITY INVOKER | [ EXTERNAL ] SECURITY DEFINER
    | SET configuration_parameter { TO value | = value | FROM CURRENT }
    | AS 'definition'
    | AS 'obj_file', 'link_symbol'
  } ...

CREATE [ OR REPLACE ] FUNCTION
    name ( [ [ argmode ] [ argname ] argtype [ { DEFAULT | = } default_expr ] [, ...] ] )
    [ RETURNS rettype
      | RETURNS TABLE ( column_name column_type [, ...] ) ]
  { LANGUAGE lang_name
    | TRANSFORM { FOR TYPE type_name } [, ... ]
    | WINDOW
    | IMMUTABLE | STABLE | VOLATILE | [ NOT ] LEAKPROOF
    | CALLED ON NULL INPUT | RETURNS NULL ON NULL INPUT | STRICT
    | [ EXTERNAL ] SECURITY INVOKER | [ EXTERNAL ] SECURITY DEFINER
    | PARALLEL { UNSAFE | RESTRICTED | SAFE }
    | COST execution_cost
    | ROWS result_rows
    | SUPPORT support_function
    | SET configuration_parameter { TO value | = value | FROM CURRENT }
    | AS 'definition'
    | AS 'obj_file', 'link_symbol'
  } ...

Pemicu

Pemicu adalah prosedur tersimpan yang diaktifkan saat terjadi peristiwa tertentu. Di Oracle, peristiwa pemicu dikaitkan dengan tabel, tabel virtual, skema, atau database. Jenis peristiwa pemicu mencakup:

  • Pernyataan Bahasa Pengolahan Data (DML) (misalnya INSERT, UPDATE, DELETE)
  • Pernyataan Bahasa Definisi Data (DDL) (misalnya CREATE, ALTER, DROP)
  • Peristiwa Database (misalnya LOGON, STARTUP, SHUTDOWN)

Pemicu di Oracle dapat berupa salah satu jenis berikut:

  • Pemicu sederhana: Diaktifkan tepat satu kali, sebelum atau setelah peristiwa pemicu yang ditentukan
  • Pemicu gabungan: Diaktifkan di beberapa peristiwa
  • Pemicu INSTEAD OF: Pemicu DML jenis khusus untuk memberikan mekanisme update transparan untuk tabel virtual yang kompleks dan tidak dapat diedit
  • Pemicu sistem: Diaktifkan pada peristiwa database tertentu

Di Cloud SQL untuk PostgreSQL, pemicu diaktifkan sebelum atau setelah operasi DML pada tabel, tabel virtual, atau tabel asing tertentu. Pemicu INSTEAD OF didukung untuk menyediakan mekanisme update bagi tabel virtual. Pemicu pada operasi DDL disebut pemicu peristiwa. Cloud SQL untuk PostgreSQL tidak mendukung pemicu sistem Oracle yang didasarkan pada peristiwa database.

Tidak seperti pemicu Oracle, pemicu Cloud SQL untuk PostgreSQL tidak mendukung penggunaan blok PL/pgSQL anonim sebagai isi pemicu. Fungsi bernama yang menggunakan nol argumen atau lebih dan menampilkan pemicu jenis harus diberikan dalam deklarasi pemicu. Fungsi ini dijalankan saat pemicu diaktifkan.

Sintaksis pemicu dan pemicu peristiwa di Cloud SQL untuk PostgreSQL

Contoh berikut menunjukkan sintaksis pemicu dan pemicu peristiwa di Cloud SQL untuk PostgreSQL:

CREATE [ CONSTRAINT ] TRIGGER name { BEFORE | AFTER | INSTEAD OF } { event [ OR ... ] }
    ON table_name
    [ FROM referenced_table_name ]
    [ NOT DEFERRABLE | [ DEFERRABLE ] [ INITIALLY IMMEDIATE | INITIALLY DEFERRED ] ]
    [ REFERENCING { { OLD | NEW } TABLE [ AS ] transition_relation_name } [ ... ] ]
    [ FOR [ EACH ] { ROW | STATEMENT } ]
    [ WHEN ( condition ) ]
    EXECUTE { FUNCTION | PROCEDURE } function_name ( arguments )

event boleh salah satu dari: INSERT, UPDATE [ OF column_name [, ... ] ], DELETE, TRUNCATE

CREATE EVENT TRIGGER name
    ON event
    [ WHEN filter_value IN (filter_value [, ... ]) [ AND ... ] ]
    EXECUTE { FUNCTION | PROCEDURE } function_name()

event boleh salah satu dari: ddl_command_start, ddl_command_end, table_rewrite, sql_drop

filter_value hanya boleh: TAG

filter_value boleh salah satu dari tag perintah yang didukung.

Langkah berikutnya