
در سالهای اخیر Oracle تغییرات مهمی در معماری پایگاه داده خود ایجاد کرده است.
یکی از قابلیتهایی که سالها توسعهدهندگان منتظر آن بودند، اضافه شدن نوع داده BOOLEAN در سطح SQL است.
در نسخههای قدیمیتر Oracle، توسعهدهندگان مجبور بودند برای ذخیره مقادیر منطقی از روشهای جایگزین مانند NUMBER(1) یا CHAR(1) استفاده کنند. اما در Oracle 26ai این محدودیت برطرف شده و اکنون میتوان از نوع داده BOOLEAN بهصورت مستقیم در جدولها و کوئریهای SQL استفاده کرد.
در این مقاله آموزش اوراکل، از بخش آموزش مدیریت اوراکل،بهصورت کامل با Boolean در Oracle 26ai، نحوه استفاده، مثالهای عملی، تفاوت با روشهای قدیمی و نکات طراحی دیتابیس آشنا میشویم.
اگر با Oracle Database کار میکنید و میخواهید دیتابیستان فقط یک محل ذخیرهسازی داده نباشد، بلکه مستند، قابلفهم، قابلمدیریت و حرفهای هم باشد، باید با قابلیت Annotation در Oracle آشنا شوید.
پیشنهاد می کنم این مقاله زیر رو حتما مطالعه کنی.
در این مقاله شما می خوانید
تا قبل از Oracle 23c، نوع داده Boolean فقط در PL/SQL وجود داشت و در SQL قابل استفاده نبود.
مثال استفاده در PL/SQL:
DECLARE
v_flag BOOLEAN;
BEGIN
v_flag := TRUE;
END;
اما در سطح جدول نمیتوانستیم ستون Boolean داشته باشیم. به همین دلیل توسعهدهندگان معمولاً از روشهای زیر استفاده میکردند.
روش اول: استفاده از NUMBER
CREATE TABLE users (
id NUMBER PRIMARY KEY,
username VARCHAR2(50),
is_active NUMBER(1)
);
در این روش معمولاً:
- ۱ = TRUE
- ۰ = FALSE
در نظر گرفته میشد.
روش دوم: استفاده از CHAR
is_active CHAR(1)
مقادیر معمول:
- Y = Yes
- N = No
این روشها چند مشکل اساسی داشتند:
- نبود محدودیت واقعی برای مقدار منطقی
- نیاز به تعریف Constraint
- کاهش خوانایی مدل داده
- ناسازگاری با Boolean در PL/SQL
مقادیر قابل ذخیره در BOOLEAN
نوع داده Boolean در Oracle از منطق سهحالته (Three-Valued Logic) استفاده میکند.
مقادیر ممکن عبارتاند از:
- TRUE
- FALSE
- NULL
درج داده نمونه:
INSERT INTO users VALUES (1, 'Ali', TRUE);
INSERT INTO users VALUES (2, 'Sara', FALSE);
INSERT INTO users VALUES (3, 'Reza', NULL);
نحوه استفاده از BOOLEAN در کوئریهای SQL
یکی از مزایای مهم Boolean این است که شرطهای منطقی خواناتر و سادهتر میشوند.
مثال ۱: کاربران فعال
SELECT *
FROM users
WHERE is_active = TRUE;
یا حتی سادهتر:
SELECT *
FROM users
WHERE is_active;
مثال ۲: کاربران غیرفعال
SELECT *
FROM users
WHERE NOT is_active;
رفتار NULL در Boolean
در SQL مقدار NULL به معنی نامشخص است. بنابراین در شرطها باید به آن توجه کرد.
مثال:
SELECT *
FROM users
WHERE is_active = FALSE;
این کوئری فقط رکوردهایی که مقدار FALSE دارند را برمیگرداند و رکوردهای NULL نمایش داده نمیشوند.
برای در نظر گرفتن NULL:
SELECT *
FROM users
WHERE is_active IS NOT TRUE;
تعیین مقدار پیشفرض برای BOOLEAN
میتوان برای ستونهای Boolean مقدار پیشفرض تعریف کرد.
مثال:
CREATE TABLE orders (
id NUMBER,
is_paid BOOLEAN DEFAULT FALSE
);
یا:
is_paid BOOLEAN DEFAULT TRUE NOT NULL
استفاده از BOOLEAN در CASE
Boolean میتواند در ساختارهای منطقی SQL مانند CASE استفاده شود.
SELECT
username,
CASE
WHEN is_active THEN 'Active'
ELSE 'Inactive'
END AS status
FROM users;
استفاده از عملگرهای منطقی
Boolean با عملگرهای منطقی SQL به خوبی کار میکند.
مثال AND:
SELECT *
FROM users
WHERE is_active AND username LIKE 'A%';
مثال OR:
SELECT *
FROM users
WHERE is_active OR username = 'Admin';
مقایسه BOOLEAN با NUMBER(1)
در گذشته معمولاً از NUMBER(1) برای ذخیره مقادیر منطقی استفاده میشد.
نمونه قدیمی:
is_active NUMBER(1)
مشکلات این روش:
- امکان ذخیره مقادیر غیرمجاز
- نیاز به CHECK Constraint
- کاهش خوانایی دیتابیس
در مقابل:
is_active BOOLEAN
مزایای زیر را دارد:
- فقط مقادیر TRUE یا FALSE ذخیره میشود
- طراحی دیتابیس خواناتر میشود
- هماهنگی کامل با PL/SQL
- سادهتر شدن کوئریها
ارتباط Boolean در SQL با PL/SQL
یکی از مزایای نسخههای جدید Oracle این است که Boolean در SQL و PL/SQL کاملاً سازگار شدهاند.
مثال:
DECLARE
v_active BOOLEAN;
BEGIN
SELECT is_active
INTO v_active
FROM users
WHERE id = 1;
END;
در نسخههای قدیمی لازم بود مقدار عددی به Boolean تبدیل شود.
مثال: سیستم مدیریت وظایف
تعریف جدول:
CREATE TABLE tasks (
task_id NUMBER PRIMARY KEY,
title VARCHAR2(100),
is_done BOOLEAN DEFAULT FALSE,
is_urgent BOOLEAN DEFAULT FALSE
);
درج داده:
INSERT INTO tasks VALUES (1, 'Install DB', FALSE, TRUE);
INSERT INTO tasks VALUES (2, 'Backup DB', TRUE, FALSE);
INSERT INTO tasks VALUES (3, 'Upgrade DB', NULL, TRUE);
کوئری برای پیدا کردن کارهای فوری که هنوز انجام نشدهاند:
SELECT *
FROM tasks
WHERE is_urgent AND NOT is_done;
مدیریت مقدار NULL:
SELECT *
FROM tasks
WHERE is_urgent
AND COALESCE(is_done, FALSE) = FALSE;
نکات مهم در طراحی پایگاه داده
هنگام استفاده از Boolean در Oracle بهتر است به چند نکته توجه شود:
- ستونهای Boolean معمولاً تنوع مقدار کمی دارند
- ایندکسگذاری روی Boolean در بسیاری از موارد مفید نیست
- استفاده از آن برای Partition Key معمولاً توصیه نمیشود
بهترین کاربرد Boolean برای فلگها و وضعیتها در سیستم است.
سوالات متداول درباره نوع داده BOOLEAN در Oracle 26ai
بله. در نسخههای جدید Oracle مانند Oracle 23c و Oracle 26ai نوع داده BOOLEAN به SQL اضافه شده است.
در نسخههای قدیمیتر مانند ۱۹c، Boolean فقط در PL/SQL وجود داشت و نمیشد آن را در ساختار جدولها استفاده کرد.
اما در Oracle 26ai میتوان ستونهایی با نوع داده Boolean تعریف کرد و مستقیماً از مقادیر TRUE ،FALSE و NULL استفاده کرد.
در گذشته توسعهدهندگان برای ذخیره مقادیر منطقی از NUMBER(1) استفاده میکردند که معمولاً مقدار ۱ برای TRUE و ۰ برای FALSE در نظر گرفته میشد.
اما این روش محدودیت داشت، زیرا از نظر فنی میتوانست مقادیر دیگری نیز ذخیره کند. در مقابل، BOOLEAN در Oracle 26ai فقط مقادیر منطقی معتبر (TRUE، FALSE و NULL) را میپذیرد و باعث میشود طراحی دیتابیس خواناتر و استانداردتر شود.
برای ایجاد یک ستون Boolean کافی است در تعریف جدول از نوع داده BOOLEAN استفاده کنیم. مثال:
CREATE TABLE users (
id NUMBER PRIMARY KEY,
username VARCHAR2(50),
is_active BOOLEAN DEFAULT TRUE
);
در این مثال ستون is_active یک مقدار منطقی ذخیره میکند و مقدار پیشفرض آن TRUE است.
بله. یکی از مزیتهای Boolean در Oracle 26ai این است که میتوان از آن بهصورت مستقیم در شرطهای SQL استفاده کرد.
مثال:
SELECT * FROM users WHERE is_active;
این کوئری تمام کاربران فعال را برمیگرداند. همچنین میتوان از عملگرهایی مانند NOT، AND و OR برای ترکیب شرطهای منطقی استفاده کرد.
جمعبندی
اضافه شدن نوع داده BOOLEAN در Oracle 26ai یک تغییر مهم در دنیای Oracle محسوب میشود.
این قابلیت باعث میشود مدل داده سادهتر، خواناتر و هماهنگتر با منطق برنامهنویسی مدرن باشد.
اگر از نسخههای جدید Oracle استفاده میکنید، بهتر است در طراحی دیتابیس به جای روشهای قدیمی مانند NUMBER(1) از BOOLEAN استفاده کنید تا ساختار دیتابیس استانداردتر و قابل فهمتر شود.
سؤالی درباره این مقاله داری؟
اگر نکتهای در این مقاله برات مبهم بود یا خواستی بیشتر بدونی، همین حالا برام بنویس تا دقیق و صمیمی پاسخت رو بدم — مثل یه گفتوگوی واقعی 💬
برو به صفحه پرسش و پاسخ
دیدگاهتان را بنویسید