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

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

آموزش جامع DBMS_LOB در Oracle همراه با مثال‌های کاربردی

مقدمه : استفاده از پکیج DBMS_LOB در اوراکل چه اهمیتی دارد؟

در دنیای پایگاه داده، گاهی نیاز داریم داده‌های حجیم مانند فایل‌های PDF، تصاویر، و یا متن‌های طولانی را ذخیره و مدیریت کنیم.

در Oracle Database، برای این منظور از نوع داده‌ای به نام LOB (Large Object) استفاده می‌شود.

مدیریت این داده‌ها نیاز به ابزارهایی دارد که یکی از قدرتمندترین آن‌ها، پکیج DBMS_LOB است.

در این مقاله آموزش اوراکل، به صورت کامل و قدم‌به‌قدم، کار با DBMS_LOB را با مثال‌های عملی و ساده آموزش خواهیم داد.

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

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

DBMS_LOB چیست؟

DBMS_LOB یک پکیج  pl/sql سیستمی در Oracle است که مجموعه‌ای از توابع و رویه‌ها را برای مدیریت انواع داده‌های LOB در اختیار ما قرار می‌دهد.

این پکیج برای کار با انواع زیر طراحی شده است:

  • CLOB: کاراکترهای حجیم (مانند متن‌های بلند)
  • BLOB: داده‌های باینری مانند فایل‌ها و تصاویر
  • NCLOB: مشابه CLOB ولی با یونیکد
  • BFILE: فایل‌های خارجی ذخیره شده در سیستم‌فایل (نه در دیتابیس)

انواع عملیات قابل انجام با DBMS_LOB

  • نوشتن در LOB (Write)
  • خواندن از LOB (Read)
  • چسباندن دو LOB (APPEND)
  • برش بخشی از LOB (SUBSTR)
  • مقایسه دو LOB (Compare)
  • گرفتن طول LOB (GetLength)
  • بارگذاری فایل در BLOB (LoadFromFile)
  • باز و بسته کردن فایل‌ها (FileOpen,FileClose)
  • حذف بخشی از محتوا (Trim)
  • جستجو در متن LOB (INSTR)

ایجاد جدول با فیلد LOB در Oracle

برای شروع باید جدولی بسازیم که یک ستون از نوع CLOB یا BLOB داشته باشد:

				
					CREATE TABLE documents (
    id NUMBER PRIMARY KEY,
    name VARCHAR2(100),
    content CLOB,
    attachment BLOB
);

				
			

آموزش توابع و پروسیجرهای مهم DBMS_LOB

۱. نوشتن در LOB با DBMS_LOB.WRITE

				
					DECLARE
    v_clob CLOB;
BEGIN
    INSERT INTO documents (id, name, content)
    VALUES (1, 'Test Document', EMPTY_CLOB())
    RETURNING content INTO v_clob;

    DBMS_LOB.WRITE(v_clob, LENGTH('This is a test content'), 1,
    'This is a test content');
    COMMIT;
END;

				
			

۲. خواندن از LOB با DBMS_LOB.READ

				
					DECLARE
    v_clob   CLOB;
    v_buffer VARCHAR2(32767);
    v_amount INTEGER := 20;
BEGIN
    SELECT content INTO v_clob FROM documents WHERE id = 1;

    DBMS_LOB.READ(v_clob, v_amount, 1, v_buffer);
    DBMS_OUTPUT.PUT_LINE('Read data: ' || v_buffer);
END;

				
			

۳. مقایسه LOBها با DBMS_LOB.COMPARE

				
					DECLARE
    v_clob1 CLOB;
    v_clob2 CLOB;
    v_result INTEGER;
BEGIN
    SELECT content INTO v_clob1 FROM documents WHERE id = 1;

    INSERT INTO documents (id, name, content) VALUES (2, 'Copy', v_clob1);
    SELECT content INTO v_clob2 FROM documents WHERE id = 2;

    v_result := DBMS_LOB.COMPARE(v_clob1, v_clob2,
    DBMS_LOB.GETLENGTH(v_clob1), 1, 1);

    IF v_result = 0 THEN
        DBMS_OUTPUT.PUT_LINE('LOBs are equal');
    ELSE
        DBMS_OUTPUT.PUT_LINE('LOBs are different');
    END IF;
END;

				
			

۴. گرفتن بخشی از LOB با DBMS_LOB.SUBSTR

				
					DECLARE
    v_clob   CLOB;
    v_result VARCHAR2(4000);
BEGIN
    SELECT content INTO v_clob FROM documents WHERE id = 1;
    v_result := DBMS_LOB.SUBSTR(v_clob, 10, 1);
    DBMS_OUTPUT.PUT_LINE('Substring: ' || v_result);
END;

				
			

۵. بررسی طول LOB با DBMS_LOB.GETLENGTH

				
					DECLARE
    v_length INTEGER;
    v_clob   CLOB;
BEGIN
    SELECT content INTO v_clob FROM documents WHERE id = 1;
    v_length := DBMS_LOB.GETLENGTH(v_clob);
    DBMS_OUTPUT.PUT_LINE('Length: ' || v_length);
END;

				
			

۶. کوتاه کردن LOB با DBMS_LOB.TRIM

				
					DECLARE
    v_clob CLOB;
BEGIN
    SELECT content INTO v_clob FROM documents WHERE id = 1;
    DBMS_LOB.TRIM(v_clob, 10);
    COMMIT;
END;

				
			

۷. الحاق LOBها با DBMS_LOB.APPEND

				
					DECLARE
    v_clob1 CLOB;
    v_clob2 CLOB;
BEGIN
    SELECT content INTO v_clob1 FROM documents WHERE id = 1;
    SELECT content INTO v_clob2 FROM documents WHERE id = 2;
    DBMS_LOB.APPEND(v_clob1, v_clob2);
    COMMIT;
END;

				
			

۸. بارگذاری فایل خارجی در BLOB با DBMS_LOB.LOADFROMFILE

				
					DECLARE
    v_bfile   BFILE := BFILENAME('MYDIR', 'myfile.pdf');
    v_blob    BLOB;
BEGIN
    INSERT INTO documents (id, name, attachment)
    VALUES (3, 'PDF File', EMPTY_BLOB())
    RETURNING attachment INTO v_blob;

    DBMS_LOB.FILEOPEN(v_bfile, DBMS_LOB.FILE_READONLY);
    DBMS_LOB.LOADFROMFILE(v_blob, v_bfile, DBMS_LOB.GETLENGTH(v_bfile));
    DBMS_LOB.FILECLOSE(v_bfile);

    COMMIT;
END;

				
			

نکته مهم: قبل از استفاده از BFILE، باید یک مسیر (Directory Object) در Oracle تعریف کنید:

				
					CREATE DIRECTORY MYDIR AS '/path/to/files';
GRANT READ ON DIRECTORY MYDIR TO your_user;

				
			

جدول توابع و پروسیجرهای پرکاربرد DBMS_LOB

تابع یا پروسیجر توضیح
WRITE نوشتن در LOB
READ خواندن داده از LOB
APPEND چسباندن LOB دیگر به LOB فعلی
SUBSTR گرفتن زیرمجموعه‌ای از LOB
COMPARE مقایسه دو LOB
GETLENGTH بررسی طول محتوای LOB
TRIM حذف بخشی از انتهای LOB
INSTR جستجوی یک رشته در CLOB
LOADFROMFILE بارگذاری فایل خارجی در BLOB
FILEOPEN / FILECLOSE باز و بستن فایل‌های BFILE

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

DBMS_LOB یک پکیج داخلی در Oracle Database است که برای مدیریت انواع داده‌های حجیم یا Large Object مثل CLOB، BLOB، NCLOB و BFILE به کار می‌رود.

این پکیج امکان خواندن، نوشتن، ویرایش، برش، چسباندن و حتی مقایسه این نوع داده‌ها را فراهم می‌کند.

  • CLOB برای متن‌های طولانی (character-based data) به‌کار می‌رود.
  • BLOB برای داده‌های باینری مثل تصاویر، فایل‌های PDF یا ویدیو استفاده می‌شود.
  • BFILE فایل‌هایی هستند که بیرون از دیتابیس (روی سیستم‌فایل سرور) ذخیره شده‌اند ولی می‌تونیم در Oracle بهشون دسترسی داشته باشیم.

نکته مهم: BFILE فقط قابل خواندن هست و نمی‌تونید روش بنویسید، در حالی که روی BLOB و CLOB می‌تونید عملیات نوشتن انجام بدید.

برای اینکار باید ابتدا یک مسیر (Directory) در Oracle تعریف کنید و سپس با استفاده از توابع BFILENAME، DBMS_LOB.FILEOPEN و DBMS_LOB.LOADFROMFILE محتوای فایل را در ستون BLOB بارگذاری کنید. مثالی از کد:

DECLARE
v_bfile BFILE := BFILENAME(‘MYDIR’, ‘file.pdf’);
v_blob BLOB;
BEGIN
INSERT INTO documents (id, name, attachment)
VALUES (10, ‘PDF File’, EMPTY_BLOB())
RETURNING attachment INTO v_blob;

DBMS_LOB.FILEOPEN(v_bfile);
DBMS_LOB.LOADFROMFILE(v_blob, v_bfile, DBMS_LOB.GETLENGTH(v_bfile));
DBMS_LOB.FILECLOSE(v_bfile);
COMMIT;
END;

برای استخراج بخشی از متن از CLOB می‌تونید از تابع DBMS_LOB.SUBSTR استفاده کنید. مثلاً برای گرفتن ۲۰ کاراکتر اول از ستون content:

SELECT DBMS_LOB.SUBSTR(content, 20, 1) AS snippet
FROM documents
WHERE id = 1;

با این روش می‌تونید مثلاً پیش‌نمایش متن‌ها یا خلاصه آن‌ها را در اپلیکیشن نمایش بدید.

نتیجه‌گیری

پکیج DBMS_LOB در Oracle یک ابزار قدرتمند برای مدیریت داده‌های حجیم است.

با یادگیری توابع و پروسیجرهای این پکیج، می‌توانید به راحتی انواع فایل‌ها، متون، و داده‌های باینری را در پایگاه داده ذخیره و مدیریت کنید.

استفاده از LOBها در اپلیکیشن‌های سازمانی و وب‌سرویس‌ها بسیار حیاتی است و تسلط بر DBMS_LOB یک مهارت مهم برای هر توسعه‌دهنده Oracle است.

📢 نظر شما چیست؟ اگر شما در استفاده از پکیج DBMS_LOB تجربه دارید و از آن استفاده می کنید در بخش نظرات، تجربه های ارزشمندتان را با ما به اشتراک بگذارید! 🚀

میثم راد

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

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

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