
مقدمه: چرا این مقاله رو باید بخونی؟
اگر با پایگاه داده Oracle کار میکنی، باید بدونی که نسخههای جدید یعنی Oracle 23c و ۲۱c پر از امکانات جدید SQL هستن که زندگی توسعهدهندهها رو راحتتر و کارآمدتر میکنن.
از SELECT بدون FROM گرفته تا BOOLEAN واقعی، از جدولهای Blockchain تا دادههای چندمقداری — همه و همه اینجا هستن.
با مثالهای کامل و توضیح کاربردی برای هر ویژگی.
اگر می خواهید با نحوه نصب پایگاه داده اوراکل بیشتر آشنا بشید نوشته زیر را مطالعه کنید:
در این نوشته شما می خوانید
۱. نوع داده BOOLEAN در SQL (جدید در Oracle 23c)
بالاخره تو Oracle میتونیم از نوع داده BOOLEAN داخل خود SQL استفاده کنیم؛ نه فقط تو PL/SQL.
مثال:
CREATE TABLE users (
id NUMBER,
name VARCHAR2(100),
is_active BOOLEAN
);
INSERT INTO users VALUES (1, 'Ali', TRUE);
SELECT * FROM users WHERE is_active;
۲. SELECT بدون FROM (Oracle 23c)
دیگه لازم نیست برای سادهترین کوئریها از DUAL استفاده کنی!
مثال:
SELECT 3 * 7 AS result;
SELECT CURRENT_DATE;
۳. INSERT چندگانه (Multi-row Insert)
تو Oracle 23c میتونی چند سطر رو با یک دستور وارد کنی.
مثال:
INSERT INTO employees (id, name, department)
VALUES
(۱, 'Nima', 'IT'),
(۲, 'Sara', 'HR'),
(۳, 'Ali', 'Finance');
۴. CREATE / DROP IF EXISTS
این قابلیت کمک میکنه که خطای “جدول وجود دارد یا ندارد” رو دور بزنی.
مثال:
CREATE TABLE IF NOT EXISTS projects (
id NUMBER PRIMARY KEY,
title VARCHAR2(100)
);
DROP TABLE IF EXISTS projects;
۵. ستون چندمقداری (Multivalue Columns - Oracle 23c)
جدیدترین شیوه برای ذخیره چند مقدار در یک ستون — مثل آرایه.
مثال:
CREATE TABLE students (
id NUMBER,
name VARCHAR2(100),
phones MULTIVALUE VARCHAR2(20)
);
-- use in Oracle 23c+
-- SELECT * FROM students WHERE '09351202772' MEMBER OF phones;
۶. جدول Immutable (Oracle 23c)
جدولی که بعد از درج داده، قابل تغییر نیست — مناسب برای لاگ و آرشیو امن.
مثال:
CREATE IMMUTABLE TABLE audit_logs (
id NUMBER,
action VARCHAR2(100),
log_time TIMESTAMP
);
۷. جدول Blockchain (Oracle 21c)
نوعی جدول مقاوم در برابر دستکاری با ثبت رمزنگاریشده دادهها.
مثال:
CREATE BLOCKCHAIN TABLE logs_bc (
id NUMBER,
content VARCHAR2(200),
created_at DATE
) NO DROP UNTIL 30 DAYS IDLE;
۸. نوع داده JSON + جستجوی JSON
از Oracle 21c به بعد، نوع داده JSON به صورت native اضافه شد.
مثال:
CREATE TABLE products (
id NUMBER,
data JSON
);
INSERT INTO products VALUES (1, '{"brand": "Sony", "category": "TV"}');
SELECT *
FROM products
WHERE JSON_EXISTS(data, '$.category?(@ == "TV")');
۹. SQL Macros (Oracle 21c)
بهت اجازه میده تا فانکشن SQL بنویسی که موقع اجرا تبدیل به کوئری میشه.
مثال:
CREATE FUNCTION top_customers(n NUMBER)
RETURN VARCHAR2 SQL_MACRO
IS
BEGIN
RETURN q'[
SELECT * FROM customers ORDER BY total_spent DESC FETCH FIRST
' || n || ' ROWS ONLY
]';
END;
-- How to use :
SELECT * FROM top_customers(5);
۱۰. تحلیل سری زمانی با MATCH_RECOGNIZE
ویژگی بسیار قدرتمند برای کشف الگوهای رفتاری در دادهها.
مثال:
SELECT *
FROM sales
MATCH_RECOGNIZE (
PARTITION BY customer_id
ORDER BY sale_date
PATTERN (RISE+ FALL+)
DEFINE
RISE AS RISE.amount > PREV(RISE.amount),
FALL AS FALL.amount < PREV(FALL.amount)
);
۱۱. DEFAULT ON NULL
اگه مقدار NULL وارد شد، مقدار پیشفرض جایگزین میشه.
مثال:
CREATE TABLE people (
id NUMBER,
nickname VARCHAR2(50) DEFAULT 'Unknown_User' ON NULL
);
INSERT INTO people (id, nickname) VALUES (1, NULL);
SELECT * FROM people;
۱۲. VALIDATE_CONVERSION برای چک تایپ
قبل از تبدیل رشته به عدد، بررسی کن که معتبر باشه یا نه.
مثال:
SELECT VALIDATE_CONVERSION('123' AS NUMBER) FROM dual; -- Natije : 1
SELECT VALIDATE_CONVERSION('abc' AS NUMBER) FROM dual; -- Natije : 0
۱۳. استفاده از FETCH FIRST / OFFSET
دستور جدید و مدرن برای محدود کردن تعداد ردیفها.
مثال:
SELECT * FROM orders ORDER BY order_date DESC FETCH FIRST 5 ROWS ONLY;
۱۴. چرخش داده با PIVOT و UNPIVOT
برای ساخت گزارشهای جدولمحور (cross-tab).
مثال:
SELECT *
FROM (
SELECT year, category, revenue FROM sales
)
PIVOT (
SUM(revenue) FOR category IN ('Books' AS books, 'Clothes' AS clothes)
);
۱۵. GROUPING SETS، ROLLUP و CUBE
برای محاسبه تجمیع در سطوح مختلف.
مثال:
SELECT department, job, SUM(salary)
FROM employees
GROUP BY GROUPING SETS (
(department, job),
(department),
()
);
۱۶. شمارش تقریبی با APPROX_COUNT_DISTINCT
سریعتر از COUNT(DISTINCT ...) در دیتاستهای بزرگ.
مثال:
SELECT APPROX_COUNT_DISTINCT(user_id) FROM logs;
۱۷. دستور RESULT_CACHE برای افزایش سرعت
نتیجه کوئری کش میشه تا دفعات بعد سریعتر اجرا بشه.
مثال:
SELECT /*+ RESULT_CACHE */ * FROM categories WHERE type = 'Electronics';
۱۸. MATERIALIZED VIEW با ON COMMIT
ویو MATERIALIZED با رفرش لحظهای وقتی داده جدید درج میشه.
مثال:
CREATE MATERIALIZED VIEW recent_orders
REFRESH FAST ON COMMIT
AS
SELECT * FROM orders WHERE order_date > SYSDATE - 7;
۱۹. Qualified Expressions برای ساخت رکورد
مخصوص ساخت مستقیم یک آبجکت در SQL:
مثال:
SELECT department_typ(101, 'IT') AS dept_obj FROM dual;
۲۰. Polymorphic Table Functions (PTF)
Polymorphic Table Functions (PTF) یک ویژگی جدید در اوراکل است که به شما این امکان را میدهد که یک تابع (function) ایجاد کنید که میتواند با انواع مختلف دادهها (data types) به طور پویا کار کند.
در واقع، **PTFها اجازه میدهند توابع SQL به گونهای نوشته شوند که میتوانند با انواع مختلف دادههای ورودی و خروجی عمل کنند، بدون نیاز به نوشتن کدهای مختلف برای هر نوع داده.
مثال ساده: ساخت یک Polymorphic Table Function
-- Step 1: Define Data Type For Result
CREATE OR REPLACE TYPE my_table_type AS OBJECT (
id NUMBER,
name VARCHAR2(100)
);
-- Step 2: Define Function polymorphic
CREATE OR REPLACE FUNCTION get_data (table_name IN VARCHAR2)
RETURN my_table_type PIPELINED IS
BEGIN
IF table_name = 'table1' THEN
FOR rec IN (SELECT id, name FROM table1) LOOP
PIPE ROW (my_table_type(rec.id, rec.name));
END LOOP;
ELSIF table_name = 'table2' THEN
FOR rec IN (SELECT id, name FROM table2) LOOP
PIPE ROW (my_table_type(rec.id, rec.name));
END LOOP;
END IF;
RETURN;
END;
-- Run:
SELECT * FROM TABLE(get_data('table1'));
۲۱. PARTITION OUTER JOIN
برای تحلیل دادههای پارتیشنشده با حفظ اطلاعات ناقص.
مثال:
SELECT *
FROM sales PARTITION BY (region)
LEFT OUTER JOIN targets USING (region);
۲۲. بهبود در جدول موقتی (Global Temporary Table Enhancements)
اکنون پشتیبانی از DELETE ROWS و PRESERVE ROWS کاملتر شده.
مثال:
CREATE GLOBAL TEMPORARY TABLE session_logs (
id NUMBER,
log TEXT
) ON COMMIT DELETE ROWS;
۲۳. INSERT ... RETURNING
دریافت مقدار خروجی بلافاصله بعد از INSERT.
مثال:
INSERT INTO users (name) VALUES ('Ali') RETURNING id INTO :new_id;
۲۴. SQL Translation Profiles
برای ترجمه سینتکس SQL دیگر پایگاه دادهها به Oracle. مثلاً کوئریهای SQL Server یا MySQL رو ترجمه میکنه.
جدول ویژگیهای جدید SQL در Oracle 23c و ۲۱c
| قابلیت | نسخه | توضیح |
|---|---|---|
| BOOLEAN در SQL | ۲۳c | استفاده مستقیم از نوع داده بولی در SQL |
| SELECT بدون FROM | ۲۳c | اجرای SELECT بدون نیاز به جدول DUAL |
| MULTIVALUE Columns | ۲۳c | پشتیبانی از ذخیره چند مقدار در یک ستون |
| Blockchain Table | ۲۱c | جدولی با امنیت زنجیرهای و غیرقابل تغییر |
| Immutable Table | ۲۳c | جدولی که فقط درج را میپذیرد، بدون امکان ویرایش |
| JSON datatype | ۲۱c | پشتیبانی از نوع داده JSON بهصورت native |
| SQL Macros | ۲۱c | ساخت کوئریهای داینامیک بهصورت فانکشن SQL |
| MATCH_RECOGNIZE | ۱۲c+ | الگوهای تحلیل زمانی روی دادهها |
| Materialized View ON COMMIT | ۱۲c+ | بهروزرسانی خودکار ویو با COMMIT |
| INSERT چندگانه | ۲۳c | درج چند رکورد با یک دستور |
| CREATE IF NOT EXISTS | ۲۱c | ایجاد جدول فقط در صورت عدم وجود |
| VALIDATE_CONVERSION | ۱۲c | بررسی اعتبار تبدیل نوع داده |
| FETCH FIRST | ۱۲c | محدود کردن ردیفهای خروجی به روش مدرن |
| PIVOT / UNPIVOT | ۱۱g+ | تغییر ساختار سطر به ستون و بالعکس |
| APPROX_COUNT_DISTINCT | ۱۲c | شمارش تقریبی سریع و سبک |
| RESULT_CACHE | ۱۱g+ | کش کردن نتایج کوئری برای بهبود عملکرد |
سوالات متداول درباره قابلیتهای جدید زبان SQL در Oracle 23c
بله، از نسخه Oracle 23c به بعد میتونی از نوع داده BOOLEAN در خود SQL استفاده کنی (نه فقط در PL/SQL).
این یعنی میتونی جداولی بسازی که ستونهایی از نوع BOOLEAN داشته باشن و کوئریهایی
مثل WHERE is_active = TRUE بنویسی.
CREATE TABLE users (
id NUMBER,
name VARCHAR2(100),
is_active BOOLEAN
);
SELECT * FROM users WHERE is_active;
بله! در نسخه Oracle 23c، امکان اجرای SELECT بدون نیاز به FROM dual فراهم شده.
این ویژگی باعث سادهتر شدن کوئریهای محاسباتی یا تستی میشه.
SELECT 1 + 1 AS result;
هر دو نوع جدول برای امنیت بالا و جلوگیری از تغییر دادهها طراحی شدن، ولی:
- Immutable Table: فقط درج مجاز هست، بدون امکان Update/Delete.
- Blockchain Table: علاوه بر عدم امکان ویرایش، زنجیرهای از هشها هم داره که اطمینان میده رکوردها دستکاری نشدهان.
مثال Immutable:
CREATE IMMUTABLE TABLE audit_logs (
id NUMBER,
message VARCHAR2(200),
log_time TIMESTAMP
);
مثال Blockchain:
CREATE BLOCKCHAIN TABLE secure_logs (
id NUMBER,
message VARCHAR2(200),
created_at DATE
) NO DROP UNTIL 30 DAYS IDLE;
از Oracle 21c به بعد، نوع داده JSON بهصورت native پشتیبانی میشه و نیازی به تبدیل نیست.
میتونی مستقیماً از توابعی مثل JSON_EXISTS یا JSON_VALUE استفاده کنی.
CREATE TABLE products (
id NUMBER,
info JSON
);
SELECT * FROM products
WHERE JSON_EXISTS(info, ‘$.brand?(@ == “Apple”)’);
جمعبندی: چرا باید از این قابلیتها استفاده کنیم؟
این ویژگیها به ما کمک میکنن تا:
- کدهای تمیزتر و مدرنتر بنویسیم
- عملکرد دیتابیس رو بهبود بدیم
- با معماریهای روز مثل JSON و Blockchain همسو بشیم
- و البته برنامهنویس Oracle بهروزی باقی بمونیم!
📢 نظر شما چیست؟ اگر شما هم اطلاعات و تجربه خوبی در مورد جدیدترین امکانات و قابلیت های جدید در اوراکل SQL دارید خوشحال میشم در بخش نظرات، تجربه های ارزشمندتان را با ما به اشتراک بگذارید! 🚀
سؤالی درباره این مقاله داری؟
اگر نکتهای در این مقاله برات مبهم بود یا خواستی بیشتر بدونی، همین حالا برام بنویس تا دقیق و صمیمی پاسخت رو بدم — مثل یه گفتوگوی واقعی 💬
برو به صفحه پرسش و پاسخ
دیدگاهتان را بنویسید