ESC را فشار دهید تا بسته شود

زمیوس آموزش، یادگیری و سرگرمی

آموزش کامل پکیج DBMS_METADATA در Oracle – استخراج DDL آبجکت‌ها

مقدمه : چرا باید DBMS_METADATA را بشناسیم؟

اگر با پایگاه داده Oracle کار کرده باشی، حتماً برایت پیش اومده که بخوای ساختار یک جدول، ویو یا حتی تریگر رو استخراج کنی.

مثلاً یه نسخه از CREATE TABLE داشته باشی تا در محیط دیگه‌ای استفاده‌اش کنی. اینجاست که پکیج قدرتمند DBMS_METADATA به کمک‌مون میاد!

در این مقاله آموزش اوراکل، می‌خوایم خیلی ساده و کامل یاد بگیریم که چطور با استفاده از DBMS_METADATA، ساختار آبجکت‌های دیتابیس رو در Oracle به شکل DDL استخراج کنیم؛ اونم با مثال‌های کاربردی و توضیحات قدم‌به‌قدم.

اگر می خواهید در مورد پکیج UTL_RAW در بخش آموزش PL/SQL بیشتر آشنا بشید نوشته زیر را مطالعه کنید:

در این نوشته شما می خوانید

DBMS_METADATA چیست؟

DBMS_METADATA یک پکیج داخلی در Oracle Database هست که به ما اجازه می‌ده ساختار آبجکت‌های دیتابیس رو به‌صورت کدهای DDL (مثل CREATE TABLE, CREATE VIEW, …) دریافت کنیم.

این ابزار بسیار کاربردیه برای:

  • مستندسازی ساختار دیتابیس
  • انتقال آبجکت‌ها به محیط‌های مختلف (مثلاً از تست به تولید)
  • بکاپ گرفتن از اسکیمای دیتابیس (ساختار، نه داده‌ها)

توابع مهم DBMS_METADATA به زبان ساده

۱. GET_DDL – استخراج ساختار یک آبجکت

با این تابع می‌تونی کد ساخت یک جدول یا هر آبجکت دیگه‌ای رو بگیری.

				
					SELECT DBMS_METADATA.GET_DDL('TABLE', 'EMP', 'HR') FROM DUAL;

				
			

خروجی چیزی شبیه اینه:

				
					CREATE TABLE "HR"."EMP" (
   "EMPLOYEE_ID" NUMBER NOT NULL,
   "NAME" VARCHAR2(100),
   ...
);

				
			

۲. GET_DEPENDENT_DDL – استخراج تریگرها، ایندکس‌ها و …

این تابع آبجکت‌های وابسته به یک آبجکت رو استخراج می‌کنه.

				
					SELECT DBMS_METADATA.GET_DEPENDENT_DDL('TRIGGER', 'EMP', 'HR') FROM DUAL;

				
			

۳. استخراج دسته‌ای با CURSOR

اگه بخوای ساختار همه‌ی جداول یک اسکیمای خاص رو دریافت کنی، از ترکیب OPEN, FETCH_CLOB, و CLOSE استفاده می‌کنی:

				
					DECLARE
  h   NUMBER;
  ddl CLOB;
BEGIN
  h := DBMS_METADATA.OPEN('TABLE');
  DBMS_METADATA.SET_FILTER(h, 'SCHEMA', 'HR');
  LOOP
    ddl := DBMS_METADATA.FETCH_CLOB(h);
    EXIT WHEN ddl IS NULL;
    DBMS_OUTPUT.PUT_LINE(ddl);
  END LOOP;
  DBMS_METADATA.CLOSE(h);
END;
/

				
			

شخصی‌سازی خروجی با SET_TRANSFORM_PARAM

با این تابع می‌تونی تعیین کنی کدوم بخش‌های خروجی DDL نمایش داده بشن یا نه.

				
					BEGIN
  DBMS_METADATA.SET_TRANSFORM_PARAM(DBMS_METADATA.SESSION_TRANSFORM,
  'STORAGE', FALSE);
  DBMS_METADATA.SET_TRANSFORM_PARAM(DBMS_METADATA.SESSION_TRANSFORM,
  'TABLESPACE', FALSE);
  DBMS_METADATA.SET_TRANSFORM_PARAM(DBMS_METADATA.SESSION_TRANSFORM,
  'SEGMENT_ATTRIBUTES', FALSE);
END;
/

				
			

برای مثال، با تنظیم STORAGE = FALSE، بخش‌هایی مثل PCTFREE و INITIAL حذف می‌شن.

انواع آبجکت و دستور استخراج DDL

نوع آبجکت مثال
جدول (Table) GET_DDL('TABLE', 'EMP', 'HR')
ویو (View) GET_DDL('VIEW', 'EMP_VIEW', 'HR')
ایندکس (Index) GET_DDL('INDEX', 'EMP_IDX', 'HR')
سیکوئنس (Sequence) GET_DDL('SEQUENCE', 'EMP_SEQ', 'HR')
تریگر (Trigger) GET_DDL('TRIGGER', 'EMP_TRG', 'HR')

چه زمانی باید از DBMS_METADATA استفاده کنیم؟

  • وقتی می‌خوای ساختار دیتابیس رو مستند کنی
  • هنگام انتقال جداول و ویوها بین محیط‌ها
  • ساخت اسکریپت نصب پروژه روی سرور جدید
  • تهیه‌ی بکاپ از ساختار جدول‌ها و روابط

مقایسه Export/Import و DBMS_METADATA

ویژگی Export/Import DBMS_METADATA
قابلیت فیلتر دقیق متوسط بسیار دقیق
شخصی‌سازی خروجی محدود بسیار بالا
مناسب برای مستندسازی نه بله
تولید DDL خام و تمیز نه بله

سوالات متداول درباره پکیج DBMS_METADATA در اوراکل

برای استخراج DDL یک جدول در Oracle می‌توان از تابع DBMS_METADATA.GET_DDL استفاده کرد. مثلاً برای دریافت DDL جدول EMP در اسکیمای HR:

SELECT DBMS_METADATA.GET_DDL(‘TABLE’, ‘EMP’, ‘HR’) FROM DUAL;

با استفاده از تابع SET_TRANSFORM_PARAM می‌تونی خروجی DDL رو شخصی‌سازی کنی. مثلاً حذف تنظیمات storage:

BEGIN
    DBMS_METADATA.SET_TRANSFORM_PARAM(DBMS_METADATA.SESSION_TRANSFORM,      ‘STORAGE’, FALSE);
END;
/

بله. با استفاده از توابع OPEN, SET_FILTER, FETCH_CLOB, و CLOSE می‌توان همه جداول را به صورت دسته‌ای (batch) استخراج کرد.

مثالی از این کار:

DECLARE
 h NUMBER;
 ddl CLOB;
BEGIN
 h :=  DBMS_METADATA.OPEN(‘TAB   LE’);
 DBMS_METADATA.SET_FILTE   R(h, ‘SCHEMA’, ‘HR’);
LOOP
 ddl :=   DBMS_METADATA.FETCH_CLO B(h);
 EXIT WHEN ddl IS NULL;
 DBMS_OUTPUT.PUT_LINE(ddl  );
 END LOOP;
 DBMS_METADATA.CLOSE(h);
END;
/

Export/Import برای پشتیبان‌گیری و جابه‌جایی داده‌ها و ساختار به صورت باینری است.

در مقابل، DBMS_METADATA برای استخراج DDL متنی و قابل ویرایش آبجکت‌هاست.

اگر هدفت ساخت اسکریپت یا مستندسازی است، DBMS_METADATA گزینه بهتری است.

جمع‌بندی

پکیج DBMS_METADATA یکی از قوی‌ترین ابزارهای اوراکل برای استخراج ساختار دیتابیسه. با استفاده از این پکیج، به راحتی می‌تونی تمام آبجکت‌ها رو با DDL کامل‌شون بازیابی کنی، اونا رو به محیط دیگه‌ای منتقل کنی یا برای مستندات پروژه‌ات استفاده‌شون کنی.

اگر تا حالا از این ابزار استفاده نمی‌کردی، همین الان امتحانش کن؛ مطمئن باش دنیات رو تغییر می‌ده!

📢 نظر شما چیست؟ اگر شما هم اطلاعات و تجربه خوبی در استفاده از پکیج  DBMS_METADATA دارید خوشحال میشم در بخش نظرات، تجربه های ارزشمندتان را با ما به اشتراک بگذارید! 🚀

سؤالی درباره این مقاله داری؟

اگر نکته‌ای در این مقاله برات مبهم بود یا خواستی بیشتر بدونی، همین حالا برام بنویس تا دقیق و صمیمی پاسخت رو بدم — مثل یه گفت‌وگوی واقعی 💬

برو به صفحه پرسش و پاسخ

میثم راد

من یه برنامه نویسم که حسابی با دیتابیس اوراکل رفیقم! از اونایی ام که تا چیزی رو کامل نفهمم،ول کن نیستم، یادگرفتن برام مثل بازیه، و نوشتن اینجا کمک می کنه تا چیزایی که یاد گرفتم رو با بقیه به شریک بشم، با هم پیشرفت کنیم.

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *