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

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

تمام قابلیت‌های جدید زبان SQL در Oracle 23c و ۲۱c با مثال کامل

مقدمه: چرا این مقاله رو باید بخونی؟

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

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

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

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

میثم راد

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

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

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