Paket DBMS_METADATA mengambil metadata objek basis data dalam bentuk pernyataan DDL atau XML. Paket ini dapat digunakan untuk memeriksa definisi objek, menghasilkan skrip guna membuat ulang objek, atau melakukan audit terhadap perubahan skema.
Instal Plugin
Sebelum memanggil fungsi apa pun dalam paket ini, instal ekstensi polar_dbms_metadata:
CREATE EXTENSION IF NOT EXISTS polar_dbms_metadata;Fungsi yang Tersedia
PolarDB mengimplementasikan subset dari paket Oracle DBMS_METADATA. Saat ini, hanya satu fungsi yang didukung:
| Function | Return type | Description |
|---|---|---|
get_ddl | CLOB | Mengembalikan pernyataan DDL untuk satu objek bernama |
get_ddl
get_ddl mengambil pernyataan DDL untuk suatu objek berdasarkan tipe dan namanya. Fungsi ini dirancang untuk penggunaan SQL interaktif dan pencarian objek tunggal.
Sintaksis
FUNCTION get_ddl(
object_type IN VARCHAR2,
name IN VARCHAR2,
schema IN VARCHAR2 DEFAULT NULL,
version IN VARCHAR2 DEFAULT 'compatible',
model IN VARCHAR2 DEFAULT 'polardb',
transform IN VARCHAR2 DEFAULT 'ddl'
) RETURN CLOBParameter
| Parameter | Required | Description |
|---|---|---|
object_type | Yes | Tipe objek. Tidak peka huruf besar/kecil. Untuk nilai yang didukung, lihat Supported object types. |
name | Yes | Nama objek. Peka huruf besar/kecil. |
schema | No | Skema yang berisi objek tersebut. Peka huruf besar/kecil. Jika tidak ditentukan, nilai default-nya adalah skema saat ini. Tidak berlaku untuk semua tipe objek; lihat Supported object types. |
version | No | Diabaikan di PolarDB for PostgreSQL (Compatible with Oracle). |
model | No | Diabaikan di PolarDB for PostgreSQL (Compatible with Oracle). |
transform | No | Diabaikan di PolarDB for PostgreSQL (Compatible with Oracle). |
PolarDB for PostgreSQL (Compatible with Oracle) hanya memproses parameterobject_type,name, danschema. Parameterversion,model, dantransformditerima demi kompatibilitas dengan Oracle tetapi tidak memiliki efek apa pun.
Peka Huruf Besar/Kecil pada Parameter
| Parameter | Case-sensitive | Example |
|---|---|---|
object_type | No | table, TABLE, dan Table semuanya berfungsi |
name | Yes | BIG_t dan big_t merupakan objek yang berbeda |
schema | Yes | public dan PUBLIC dianggap sebagai skema yang berbeda |
Dalam DDL yang dikembalikan, nama objek dan nama skema diapit tanda kutip ganda untuk mempertahankan kapitalisasi aslinya.
Contoh
Ambil DDL untuk tabel dalam skema tertentu
Buat tabel dan panggil get_ddl dengan skema yang secara eksplisit ditentukan:
CREATE TABLE t(a int, b text);
SELECT dbms_metadata.get_ddl('table', 't', 'public');Output:
get_ddl
---------------------------------------
CREATE TABLE IF NOT EXISTS public.t (+
a integer, +
b text COLLATE "default" +
) +
WITH (oids = true)
(1 row)Ambil DDL tanpa menentukan skema
Jika objek target berada dalam skema saat ini, abaikan parameter schema:
SELECT current_schema;current_schema
----------------
public
(1 row)SELECT dbms_metadata.get_ddl('table', 't');get_ddl
---------------------------------------
CREATE TABLE IF NOT EXISTS public.t (+
a integer, +
b text COLLATE "default" +
) +
WITH (oids = true)
(1 row)Ambil DDL ketika objek berada dalam skema berbeda
Jika skema saat ini tidak berisi objek tersebut, mengabaikan parameter schema akan menyebabkan error -31603. Tentukan parameter schema secara eksplisit:
-- Ubah skema saat ini
SET search_path='';
-- Tanpa skema: gagal
SELECT dbms_metadata.get_ddl('table', 't');ERROR: Polar-31603: Object "t" of type "table" not found in schema "<NULL>"-- Dengan skema: berhasil
SELECT dbms_metadata.get_ddl('table', 't', 'public');get_ddl
---------------------------------------
CREATE TABLE IF NOT EXISTS public.t (+
a integer, +
b text COLLATE "default" +
) +
WITH (oids = true)
(1 row)Peka huruf besar/kecil untuk parameter `name` dan `schema`
Buat tabel dengan pengenal campuran huruf besar dan kecil:
CREATE TABLE public."BIG_t"("BIG_a" int, "BIG_b" text);Parameter object_type tidak peka huruf besar/kecil — baik 'table' maupun 'TABLE' berfungsi:
SELECT dbms_metadata.get_ddl('table', 'BIG_t', 'public');
SELECT dbms_metadata.get_ddl('TABLE', 'BIG_t', 'public');Keduanya mengembalikan:
get_ddl
---------------------------------------------
CREATE TABLE IF NOT EXISTS public."BIG_t" (+
"BIG_a" integer, +
"BIG_b" text COLLATE "default" +
) +
WITH (oids = true)
(1 row)Parameter name dan schema peka huruf besar/kecil. Menggunakan kapitalisasi yang salah akan menghasilkan error:
-- Nama dengan kapitalisasi salah
SELECT dbms_metadata.get_ddl('table', 'big_t', 'public');ERROR: Polar-31603: Object "big_t" of type "table" not found in schema "public"-- Skema dengan kapitalisasi salah
SELECT dbms_metadata.get_ddl('table', 'BIG_t', 'PUBLIC');ERROR: Polar-31603: Object "BIG_t" of type "table" not found in schema "PUBLIC"Tipe Objek yang Didukung
Tipe objek berikut didukung. Beberapa tipe tidak termasuk dalam skema — lihat kolom Schema untuk detailnya.
| Object type | Schema can be specified |
|---|---|
| Table | Yes |
| Index | Yes |
| View | Yes |
| Materialized view | Yes |
| Function | Yes |
| Stored procedure | Yes |
| Constraint | Yes |
| Trigger | No |
| Tablespace | No |
| Role | No |
| User | No (similar to role) |
Perilaku skema untuk tipe objek tanpa skema
Untuk role dan user, menentukan skema akan memicu exception -31600:
SET search_path TO public;
CREATE ROLE role1;
-- Tanpa skema: berhasil
SELECT dbms_metadata.get_ddl('role', 'role1');get_ddl
-------------------------------------------
CREATE ROLE role1 WITH +
NOSUPERUSER NOCREATEDB NOCREATEROLE +
INHERIT NOLOGIN NOREPLICATION NOBYPASSRLS+
CONNECTION LIMIT -1 PASSWORD NULL
(1 row)-- Dengan skema: memicu -31600
SELECT dbms_metadata.get_ddl('role', 'role1', 'public');ERROR: Polar-31600: Invalid input value "public" for parameter SCHEMA in function get_ddl
DETAIL: No need to specify schema for type ROLE/USERUntuk trigger, menentukan skema akan menghasilkan peringatan tetapi tidak memicu error. Nilai skema diabaikan dan hasil tetap dikembalikan:
CREATE TABLE t (id int, name varchar(10));
CREATE OR REPLACE FUNCTION print_insert()
RETURNS TRIGGER AS $$
BEGIN
RAISE NOTICE 'INSERT: %', NEW.id;
RETURN NEW;
END;
$$ LANGUAGE plpgsql;
CREATE TRIGGER trigger1 after INSERT ON public.t FOR EACH row EXECUTE PROCEDURE print_insert();
SELECT dbms_metadata.get_ddl('trigger', 'trigger1', 'public');WARNING: No need to specify schema for trigger, ignore it.
get_ddl
-------------------------------------------------------------------------------------------------------
CREATE TRIGGER trigger1 AFTER INSERT ON public.t FOR EACH ROW EXECUTE PROCEDURE public.print_insert()
(1 row)Pengecualian
get_ddl memunculkan dua jenis exception. Kode exception-nya sesuai dengan Oracle, dan pesannya hampir identik.
| Code | Condition | Example message |
|---|---|---|
| -31600 | Tipe objek tidak valid, tipe objek kosong, atau nama objek kosong; atau skema ditentukan untuk tipe objek yang tidak memiliki skema | Polar-31600: Invalid input value "public" for parameter SCHEMA in function get_ddl |
| -31603 | Objek tidak ditemukan | Polar-31603: Object "t" of type "table" not found in schema "<NULL>" |
Hanya dua jenis exception ini yang didukung. Jenis exception Oracle lainnya tidak diimplementasikan.