All Products
Search
Document Center

PolarDB:DBMS_METADATA

Last Updated:Mar 28, 2026

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:

FunctionReturn typeDescription
get_ddlCLOBMengembalikan 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 CLOB

Parameter

ParameterRequiredDescription
object_typeYesTipe objek. Tidak peka huruf besar/kecil. Untuk nilai yang didukung, lihat Supported object types.
nameYesNama objek. Peka huruf besar/kecil.
schemaNoSkema 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.
versionNoDiabaikan di PolarDB for PostgreSQL (Compatible with Oracle).
modelNoDiabaikan di PolarDB for PostgreSQL (Compatible with Oracle).
transformNoDiabaikan di PolarDB for PostgreSQL (Compatible with Oracle).
PolarDB for PostgreSQL (Compatible with Oracle) hanya memproses parameter object_type, name, dan schema. Parameter version, model, dan transform diterima demi kompatibilitas dengan Oracle tetapi tidak memiliki efek apa pun.

Peka Huruf Besar/Kecil pada Parameter

ParameterCase-sensitiveExample
object_typeNotable, TABLE, dan Table semuanya berfungsi
nameYesBIG_t dan big_t merupakan objek yang berbeda
schemaYespublic 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 typeSchema can be specified
TableYes
IndexYes
ViewYes
Materialized viewYes
FunctionYes
Stored procedureYes
ConstraintYes
TriggerNo
TablespaceNo
RoleNo
UserNo (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/USER

Untuk 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.

CodeConditionExample message
-31600Tipe objek tidak valid, tipe objek kosong, atau nama objek kosong; atau skema ditentukan untuk tipe objek yang tidak memiliki skemaPolar-31600: Invalid input value "public" for parameter SCHEMA in function get_ddl
-31603Objek tidak ditemukanPolar-31603: Object "t" of type "table" not found in schema "<NULL>"
Hanya dua jenis exception ini yang didukung. Jenis exception Oracle lainnya tidak diimplementasikan.