
مقدمه : استفاده از پکیج 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 تجربه دارید و از آن استفاده می کنید در بخش نظرات، تجربه های ارزشمندتان را با ما به اشتراک بگذارید! 🚀
دیدگاهتان را بنویسید