デュアルテーブルは、疑似列を選択するために使用されます。値Xを持つ1つの行と1つの列DUMMYがあります。
2つの質問があります
- 疑似列は実際にはどういう意味ですか?
たとえば、デュアルはどのようにして価値を与えることができますか?
select sysdate from dual
現在の日時になります。これはどのように可能ですか?
デュアルテーブルは、疑似列を選択するために使用されます。値Xを持つ1つの行と1つの列DUMMYがあります。
2つの質問があります
たとえば、デュアルはどのようにして価値を与えることができますか?
select sysdate from dual
現在の日時になります。これはどのように可能ですか?
疑似列は、システムで生成された値を返す関数です。 sysdate
現在の日時を返す関数です。rownum
結果セットの行番号を返す疑似列です。
命名法は、PL/SQLが登場する前のOracleの初期の時代にさかのぼります。これは、テーブルの列と同じように、SELECTステートメントの射影でこれらの関数を使用できることを意味します。今日では、独自の関数を記述して、点滅することなくSQLステートメントで使用できるため、「pseudo-column」というフレーズは少し混乱します。
関数と疑似列を区別する機能は、疑似列が結果セットの行ごとに異なる値を返すのに対し、関数は同じ値を返すことです(テーブルの一部の列がパラメーターとして渡されて値を導出する場合を除く) )。
デュアルは、Oracleの歴史のもう1つの由緒あるスライスです。これは、1つの行を含み、データベースが1つの行を含むことを認識しているテーブルです。したがって、引用するselectステートメントは、「現在の日時を教えてください」と言っているだけです。機能的には同等です
select sysdate
from emp
where rownum = 1
/
PL / SQLでは、デュアルからの選択は必須です。これをコーディングするだけです。
l_date := sysdate;
DUALの一般的な使用法の1つは、トリガー内のシーケンスの次の値を取得することでした。11gからできるので...
:new.id := my_seq.nextval;
カバーの下でこれはまだ実行されますselect my_seq.nextval into :new.id from dual;
SQLには、それらを呼び出すためにそれらの後に括弧を必要としない多くの組み込み関数があります。Oracleのそのような関数の1つは、SYSDATEです。
テーブルがある場合、制限条件のないSELECTステートメント(WHERE句)は通常、テーブルの各行に対して1行のデータを返すことに注意してください。したがって、テーブルが与えられます:
CREATE TABLE Ex1(Dummy CHAR(10) NOT NULL);
INSERT INTO Ex1 VALUES('Abacus');
INSERT INTO Ex1 VALUES('Sedentary');
INSERT INTO Ex1 VALUES('Caucasus');
SELECTステートメントの実行:
SELECT Dummy FROM Ex1;
3行を返します。ここで、ステートメントを次のように記述したとします。
SELECT 'ABC', Dummy, SYSDATE FROM Ex1;
これも3行を返します。
ダミー列を省略した場合:
SELECT 'ABC', SYSDATE FROM Ex1;
私は得る:
そして、文字列リテラルを省略した場合:
SELECT SYSDATE FROM Ex1;
私は得る:
そして、2つの行を削除してクエリを再実行すると、次のようになります。
DELETE FROM Ex1 WHERE Dummy > 'B';
SELECT SYSDATE FROM Ex1;
私は得る:
テーブルEx1には1行のデータしかないためです。
名目上、私はできる:
UPDATE Ex1 SET Dummy = 'X';
RENAME TABLE Ex1 AS Dual;
もちろん、それはできません。OracleがRENAME TABLEステートメントをサポートしているかどうかはわかりません。おそらく、テーブルの名前を変更できないため、組み込みのDUALテーブルと混同される可能性があります。ただし、概念的には、単一行を含むテーブルEx1はDUALと同型です。
Oracleがこの用語に特別な意味を持たない限り、疑似列はテーブルの一部のように見えますが、実際にはテーブルにデータとして格納されていない列です。典型的な例は行番号です。
SELECT ROWNUM, * FROM SomeTable
出力には列ROWNUM(InformixではROWID、私が最もよく知っている)があるように見えますが、これはDBMSに直接格納されていません。異なるDBMSには、異なる目的のために、他の異なる疑似列があります。
疑似列と関数を区別するのが難しい場合があります。
疑似列は、Oracleによって割り当てられた値(疑似フィールド)ですが、ディスクには保存されません。
疑似列はテーブル内の実際の列ではありませんが、列のように動作します。
たとえば、疑似列から値を選択できます。ただし、疑似列に挿入、更新、または削除することはできません。また、疑似列はSQLステートメントでは許可されていますが、手続き型ステートメントでは許可されていないことに注意してください。
注:-疑似列はSQLステートメントでは許可されていますが、手続き型ステートメントでは許可されていません。
SQL> SELECT sysdate、systimestamp FROM dual; SYSDATE SYSTIMESTAMP
2007年12月13日2007年12月13日10.02.31.956842AM+02:00
疑似列:ROWID、ROWNUM、LEVEL