it-swarm.asia

كيف يعمل جدول Oracle DUAL؟

SQL> desc dual
 Name                                      Null?    Type
 ----------------------------------------- -------- ----------------------------
 DUMMY                                              VARCHAR2(1)

SQL> select 4*5 from dual;

       4*5
----------
        20

SQL>

أجد أنه غريب حقا. إذا لم يكن هناك عمود باسم 4 * 5 مزدوج ، فكيف يعمل بيان التحديد؟

أيضا ، لماذا لا أرى نفس السلوك عندما أقوم بإنشاء جدول مزدوج خاص بي؟

SQL> create table dual2(dummy varchar2(1)); 

Table created.

SQL> desc dual2
 Name                                      Null?    Type
 ----------------------------------------- -------- ----------------------------
 DUMMY                                              VARCHAR2(1)

SQL> select 4*5 from dual2;

no rows selected

SQL> 
32
Lazer

من ويكيبيديا :

جدول DUAL هو جدول خاص من صف واحد موجود افتراضيًا في جميع عمليات تثبيت قاعدة بيانات أوراكل. وهي مناسبة للاستخدام في اختيار عمود زائف مثل SYSDATE أو USER. يحتوي الجدول على عمود VARCHAR2 (1) واحد يسمى DUMMY له قيمة 'X'.

وبالتالي ، فإن الجدول المزدوج هو طريقة لإجراء العمليات مقابل المبالغ التي تكون جدولاً فارغًا وليس فارغًا. هذا مفيد عندما لا يهتم المرء بالجدول ، ولكنه يحتاج إلى إجراء العمليات من خلال عبارة محددة. إذا كان الجدول يحتوي على أكثر من صف أو عمود واحد ، فسيتم إرجاع نتائج متعددة (بسبب التشغيل عبر مجموعة الصفوف الكاملة عند إجراء العملية.)

لا ينبغي استخدامه في الإنتاج ، إلا إذا كنت بحاجة بشكل خاص إلى استدعاء إجراءات معينة من خلال SQL.

4*5 هي عملية رياضية ، تمامًا مثل 'Foo' سلسلة. وبالتالي ، تمامًا كما يمكن للمرء اختيار 4 * 5 من أي جدول ، تمامًا كما يمكن للمرء اختيار "Foo" من أي جدول ، فإن DUAL هي طريقة لاختياره من جدول جيد معروف لن يكون له نتائج متعددة أبدًا.

من التوثيق (المفاهيم):

DUAL هو جدول صغير في قاموس البيانات يمكن أن تشير إليه Oracle Database والبرامج التي كتبها المستخدم لضمان نتيجة معروفة. الجدول المزدوج مفيد عندما يجب إرجاع القيمة مرة واحدة فقط ، على سبيل المثال ، التاريخ والوقت الحاليين. يمكن لجميع مستخدمي قاعدة البيانات الوصول إلى DUAL.

يحتوي الجدول DUAL على عمود واحد يسمى DUMMY وصف واحد يحتوي على القيمة X.

و مرجع SQL :

DUAL هو جدول يتم إنشاؤه تلقائيًا بواسطة Oracle Database مع قاموس البيانات. DUAL موجود في مخطط المستخدم SYS ولكن يمكن الوصول إليه بواسطة الاسم DUAL لجميع المستخدمين. يحتوي على عمود واحد ، DUMMY ، تم تعريفه ليكون VARCHAR2 (1) ، ويحتوي على صف واحد بقيمة X. التحديد من جدول DUAL مفيد لحساب تعبير ثابت باستخدام عبارة SELECT. لأن DUAL يحتوي على صف واحد فقط ، يتم إرجاع الثابت مرة واحدة فقط. بدلاً من ذلك ، يمكنك تحديد عمود ثابت أو عمود زائف أو تعبير من أي جدول ، ولكن سيتم إرجاع القيمة عدة مرات كما توجد صفوف في الجدول. راجع "حول وظائف SQL" للحصول على أمثلة عديدة لتحديد قيمة ثابتة من DUAL.

بدءًا من Oracle Database 10g الإصدار 1 ، لا يتم تنفيذ الإدخال/الإخراج المنطقي على جدول DUAL عند حساب تعبير لا يتضمن العمود DUMMY. تم إدراج هذا التحسين على أنه FAST DUAL في خطة التنفيذ. إذا حددت العمود DUMMY من DUAL ، فلن يتم إجراء هذا التحسين ويحدث الإدخال/الإخراج المنطقي.

29
Brian Ballsun-Stanton

DUAL هو جدول به صف واحد بالضبط كما ستظهر عبارة SQL التالية:

SELECT * FROM dual;

بك dual2 الجدول ليس به صفوف. إذا قمت بإدخال واحد ، سترى نفس السلوك.

4 * 5 هو تعبير يمكن لـ Oracle تقييمه بدون استخدام بيانات من الجدول بالفعل. سيقيمها مرة واحدة لكل صف ، تمامًا كما تفعل مع تعبير العمود العادي. لذلك إذا لم يكن هناك صف ، فلن يتم إرجاع أي نتيجة ، إذا كان هناك صفين ، فستحصل على 20 مرتين.

18
Hendrik Brummermann

جدول dual "يعمل" تقريبًا فقط الطريقة التي يعمل بها أي جدول آخر: إنه جدول يمكنك من خلاله تحديد السجلات.

هذا يعني ، على سبيل المثال ، يمكنك وصف الجدول. هنا في SQL*Plus:

SQL> set lines 50
SQL> desc dual
Name                    Null?    Typ
----------------------- -------- ----------------
DUMMY                            VARCHAR2(1)

لذا ، يحتوي الجدول على عمود واحد يسمى dummy وهو varchar2(1).

يحتوي الجدول ، حسب التصميم ، على سجل واحد (على الأقل إذا لم يعبث به أحد):

SQL> select count(*) from dual;

COUNT(*)
----------
         1

لذلك ، من أجل الحصول على نفس السلوك مع dual2 كما هو الحال مع dual ، يجب عليك إدراج سجل واحد في مزدوج. والأفضل من ذلك ، قم بإنشائه باستخدام create table as select (ctas):

SQL> create table dual2 as select * from dual;

الآن ، يعمل الاستعلام الخاص بك:

SQL> select 4*5 from dual2;
       4*5
----------
        20

في وقت سابق ، قلت أن المزدوج تقريبًا يعمل مثل أي جدول آخر. لذا ، متى لا يعمل مثل أي جدول آخر؟

يتصرف بشكل مختلف ، إذا لم يتم تحديد قيمة من الجدول نفسه. مرة أخرى ، مع استفساراتك ، أترك Oracle شرح لهم ...

SQL> set lines 150
SQL> explain plan for select 4*5 from dual2;

EXPLAIN PLAN ausgef³hrt.

... لمعرفة كيفية الوصول إلى الجدول:

SQL> select * from table(dbms_xplan.display);

PLAN_TABLE_OUTPUT
---------------------------------------------------------------------------
Plan hash value: 3445655939

-------------------------------------------------------------------
| Id  | Operation         | Name  | Rows  | Cost (%CPU)| Time     |
-------------------------------------------------------------------
|   0 | SELECT STATEMENT  |       |     1 |     3   (0)| 00:00:01 |
|   1 |  TABLE ACCESS FULL| DUAL2 |     1 |     3   (0)| 00:00:01 |
-------------------------------------------------------------------

يمكن ملاحظة أن العبارة تقوم بـ full table access في dual2.

الآن ، الشيء نفسه مع dual:

SQL> explain plan for select 4*5 from dual;

EXPLAIN PLAN ausgef³hrt.

SQL> select * from table(dbms_xplan.display);

PLAN_TABLE_OUTPUT
-------------------------------------------------------------------
Plan hash value: 1388734953

-----------------------------------------------------------------
| Id  | Operation        | Name | Rows  | Cost (%CPU)| Time     |
-----------------------------------------------------------------
|   0 | SELECT STATEMENT |      |     1 |     2   (0)| 00:00:01 |
|   1 |  FAST DUAL       |      |     1 |     2   (0)| 00:00:01 |
-----------------------------------------------------------------

هذا هو المكان الذي يتصرف فيه الجدول dual بشكل مختلف: قيمة dummy ليست ضرورية ، لذلك يتم تنفيذ عملية fast dual ، حتى لا يقرأ المثيل القيمة الفعلية على القرص.

14
René Nyffenegger

بالمناسبة ، DUAL هي واحدة من "الجداول" القليلة التي تعمل عند بدء المثيل ولكن لم يتم فتح قاعدة البيانات.

تحصل على شيء مثل

ADDR     INDX   INST_ID D
-------- ------ ------- -
0C0362D4      0       1 X
10
Gary

بالإضافة إلى الإجابات الأخرى ، فإن Oracle ليست من الصعب إرضاءها حول مساحات نص SQL (في بعض الأماكن على الأقل). يرمز المحلل اللغوي لـ SQL أيضًا إلى اختلافات فئة الأحرف في بعض الحالات ، وليس فقط بالمسافة البيضاء.

على سبيل المثال ، يمكنك تشغيل مثل هذه العبارات:

 SQL> حدد * من المزدوج ؛ 
 
 D 
 - 
 X 
 
 
 SQL> حدد (1) من المزدوج ؛ 
 
 (1) 
 ---------- 
 1 
 
 SQL> حدد خالية من المزدوج ؛ 
 
 -NULL 
 ---------- 
 
 
 SQL> حدد -1 من ثنائي ؛ 
 
 -1 
 ---------- 
 -1 
 
 SQL> 
 

من الممكن أيضًا تشغيل SQL بدون أي مسافة بيضاء:

 SQL> حدد * من/**/dual ؛ 
 
 D 
 - 
 X 
 

لدي المزيد من الأمثلة هنا:

http://blog.tanelpoder.com/2008/01/14/can-you-write-a-working-sql-statement-without-using-any-whitespace/

تانيل بودر

9
Tanel Poder

عملية مزدوجة سريعة تعيد كتابة الكود الخاص بك للاستعلام عن $ x dual. لأن هذا "الجدول" هو بنية بيانات C في SGA ، يمكنك الاستعلام عنه في وضع العد.

8
I know more than you

تم الإجابة على السؤال بالفعل. هذه بعض الملاحظات على الغرض من الجدول المزدوج. يمكن استخدام Dual لتقييم التعبيرات في جملة مختارة. لا يحتاج العديد من أنظمة قواعد البيانات الأخرى إلى مثل هذا الجدول لهذا الغرض. يمكن لـ MS SQL Server و MySql و Posgres تقييم العبارة التالية

select 3+5 ;

لا يمكن لأوراكل. تحتاج عبارة تحديد Oracle دائمًا إلى عبارة "from".

لا يمكن استخدام بعض الوظائف في تعبير pl/sql مثل تفريغ .

وبالتالي

declare
str varchar2(100);
begin
str:=dump('Hallo');
end;
/

سيثير استثناء ولكن

declare
str varchar2(100);
begin
select dump('Hallo') into str from dual;
end;
/

سيعمل.

يمكن استخدامه لتوسيع مجموعة نتائج الاستعلام

select user_id,username from user_users
union all
select -1,'NO USER'
from dual
/

الذي أعطى

| USER_ID |     USERNAME |
|---------|--------------|
|  476267 | USER_4_E8C50 |
|      -1 |      NO USER |

أو إنشاء بيانات باستخدام استعلامات مختارة إما باستخدام CONNECT BY:

select level as n 
from dual
connect by level <= 5 ;

أو CTE العودية:

with nlist(n) as (
  select 1 from dual
  union all
  select n+1
  from nlist 
  where n<5    )
select n
from nlist
 ;

الذي يعود

| N |
|---|
| 1 |
| 2 |
| 3 |
| 4 |
| 5 |

في sqlfiddle

4
miracle173

لما يستحق ، فهو يعمل بنفس الطريقة تمامًا في MySQL.

mysql> use test;
Database changed

mysql> create table fred(billy int);
Query OK, 0 rows affected (0.79 sec)

mysql> select 4 + 5 from fred;
Empty set (0.00 sec)

mysql> select 4 + 5 as mary from fred;
Empty set (0.00 sec)

mysql> insert into fred values(1);
Query OK, 1 row affected (0.13 sec)

mysql> select 4 + 5 from fred;
+-------+
| 4 + 5 |
+-------+
|     9 |
+-------+
1 row in set (0.00 sec)

mysql> select 4 + 5 as mary from fred;
+------+
| mary |
+------+
|    9 |
+------+
1 row in set (0.00 sec)

mysql> insert into fred values(2);
Query OK, 1 row affected (0.08 sec)

mysql> select 4 + 5 from fred;
+-------+
| 4 + 5 |
+-------+
|     9 |
|     9 |
+-------+
2 rows in set (0.00 sec)

mysql> select 4 + 5 as mary from fred;
+------+
| mary |
+------+
|    9 |
|    9 |
+------+
2 rows in set (0.00 sec)

mysql> explain select 4 + 5 as mary from fred;
+----+-------------+-------+------+---------------+------+---------+------+------+-------+
| id | select_type | table | type | possible_keys | key  | key_len | ref  | rows | Extra |
+----+-------------+-------+------+---------------+------+---------+------+------+-------+
|  1 | SIMPLE      | fred  | ALL  | NULL          | NULL | NULL    | NULL |    2 | NULL  |
+----+-------------+-------+------+---------------+------+---------+------+------+-------+
1 row in set (0.00 sec)

mysql> 

ويبدو أيضًا أن DUAL هو نوع من بنية الذاكرة في MySQL أيضًا. لاحظ الفرق في الخطتين التوضيحيتين - "لا توجد جداول مستخدمة" لـ DUAL في MySQL.

ومع ذلك ، من المثير للاهتمام أنه لا يمكنني عمل DESC على MySQL المزدوج ، والذي يختلف عن Oracle - ولكن تم تقديمه على وجه التحديد AIUI للسماح بصيغة Oracle للعمل على MySQL.

mysql> select 4 + 5 from dual;
+-------+
| 4 + 5 |
+-------+
|     9 |
+-------+
1 row in set (0.00 sec)

mysql> explain select 4 + 5 from dual;
+----+-------------+-------+------+---------------+------+---------+------+------+----------------+
| id | select_type | table | type | possible_keys | key  | key_len | ref  | rows | Extra          |
+----+-------------+-------+------+---------------+------+---------+------+------+----------------+
|  1 | SIMPLE      | NULL  | NULL | NULL          | NULL | NULL    | NULL | NULL | No tables used |
+----+-------------+-------+------+---------------+------+---------+------+------+----------------+
1 row in set (0.00 sec)

mysql> desc dual;
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'dual' at line 1
mysql> 
3
Vérace

في قاعدة بيانات أوراكل ، يستخدم الجدول الثنائي بشكل أساسي للحصول على قيمة الأعمدة الزائفة. يحتوي على الخصائص التالية:

  1. وهي مملوكة لمستخدم نظام
  2. وهي متاحة لجميع المستخدمين
  3. يحتوي على عمود واحد فقط وهو اسم وهمي بنوع البيانات Varchar2 (1) ، يمكن أن يكون لهذا العمود الحد الأقصى لعرض حرف واحد.

إذا كنت تريد الحصول على مزيد من التفاصيل ، تحقق هنا

2
Vipul