ノート:
- このチュートリアルでは、Oracle Cloudへのアクセス権が必要です。無料アカウントにサインアップするには、Oracle Cloud Infrastructure Free Tierの開始を参照してください。
- Oracle Cloud Infrastructureの資格証明、テナンシおよびコンパートメントの値の例を使用します。演習を完了したら、これらの値をクラウド環境に固有の値に置き換えてください。
Oracle Database 23aiのSQL機能の詳細
イントロダクション
このチュートリアルでは、知っておく必要がある10の機能と、既存の機能と比較する方法を学習します。これらの機能は次のとおりです。
FROM
句(オプション)。- SQLの場合は
BOOLEAN
。 IF NOT EXISTS
Data Definition Language (DDL)句。INSERT
複数値。- 新しい表
VALUE
コンストラクタです。 GROUP BY
句の別名。UPDATE
文およびMERGE
文のRETURNING
句。UPDATE
およびDELETE
の結合。- 注釈。データベース・オブジェクトの新しいメタデータです。
- SQLドメインを使用する軽量オブジェクト型。
目的
-
FROM
句を使用しないSQLの使用:式または組込み関数の選択時にFROM
句を使用する必要がなくなるため、より単純な問合せが可能になります。 -
SQLでのネイティブ
BOOLEAN
データ型の実装: SQL表、問合せおよび条件でネイティブBOOLEAN
データ型を利用して、より直感的なtrue/falseロジック処理を行います。 -
DDL文での
IF NOT EXISTS
の使用:追加のPL/SQLチェックなしでCREATE
文およびDROP
文を条件付きで実行することで、オブジェクトの作成と削除のロジックを簡素化します。 -
複数値
INSERT
操作の実行: 1つのINSERT
文に複数の行を挿入して、コードの読みやすさを向上させ、データベースへのラウンドトリップを削減します。 -
インライン・データ・セットの表値コンストラクタの使用:
MERGE
、SELECT
、比較などの操作をサポートするVALUES
コンストラクタを使用して、SQLで一時行セットを直接作成します。 -
GROUP BY句の参照列の別名:式を繰り返すかわりに
GROUP BY
でSELECT
別名を使用できるようにすることで、問合せの可読性を高めます。 -
UPDATE
およびMERGE
でRETURNING
句を利用:フォローアップ問合せを必要とせずに、UPDATE
文およびMERGE
文から影響を受けるデータを直接取得します。 -
UPDATE
文およびDELETE
文での結合の実行:UPDATE
およびDELETE
操作でJOIN
ロジックを直接使用して、関連する表条件に基づいてレコードを変更または削除します。 -
メタデータを使用したデータベース・オブジェクトの注釈付け:
ANNOTATION
を使用してデータベース・オブジェクトをドキュメント化し、メンテナンスとイントロスペクションを容易にするために記述メタデータ(所有者、目的など)を格納します。 -
SQLドメインを使用した軽量オブジェクト・タイプの定義:複数の表間で一貫性と強力な型指定を実施するために、制約のある再利用可能なドメイン・タイプを作成します。
前提条件
-
基本的なSQL知識
-
SQL構文の理解:
SELECT
、INSERT
、UPDATE
、DELETE
、JOIN
、GROUP BY
など。 -
リレーショナル・データベースの概念およびデータ型の理解。
-
-
Oracle Database 23aiとその以前のバージョンの経験。
-
DDL、データ操作言語(DML)およびPL/SQLがOracle Databaseの19c、Oracle Databaseの21c以前のバージョンでどのように機能したかを認識します。
-
DUAL
、MERGE
、RETURNING INTO
などのOracle固有の機能に関する知識。
-
-
Oracle Database 23ai環境へのアクセス。
-
Oracle Database 23ai (ローカル設定、クラウド・インスタンスまたはOracle Live SQL)にアクセスできます。
-
一部の機能(SQLドメインや
BOOLEAN
など)は、Oracle Database 23aiでのみ機能します。
-
-
SQL*Plus、SQLclまたはGUIツール(SQL DeveloperやDataGripなど)。互換性のあるインタフェースでSQL文を実行およびテストできます。
-
PL/SQLの基本(高度な機能用)。
RETURNING INTO
、プロシージャ・ブロックおよび動的SQLの処理用。 -
制約とデータ整合性ルールの知識。SQLドメインおよび表の制約を理解する必要があります。
-
Oracleデータ・ディクショナリ・ビューの理解。注釈またはメタデータの問合せ用。たとえば、
USER_TABLES
、USER_ANNOTATIONS
です。 -
Oracle Databaseのロールおよび権限。表、ドメインおよび注釈を作成/変更する機能には、適切なユーザー権限が必要です。
-
バージョン認識ツールおよびクライアントがOracle Database 23ai機能をサポートしていることを確認します(古いドライバまたはツールが失敗する可能性があります)。
-
(オプション)他の最新のSQL方言(PostgreSQL、MySQLなど)へのエクスポージャ。これは、
VALUES
、BOOLEAN
、IF EXISTS
などの新機能の相互互換性を確認するのに役立ちます。
機能1: FROM
句の使用
Oracle Database 23aiで導入された興味深い機能は、SELECT
文のFROM
句のオプション性です。このバージョンまでは、FROM
句が必要でした。
次に、Oracle Database 23aiでFROM
機能を使用しないSELECT
の潜在的な利点を示します。
-
データ操作を容易にするために現在の日付を選択します。
SELECT CURRENT_DATE;
-
表データを含まない数学演算または計算。
SELECT 25.50*25.25; 25.50*25.25 ----------- 643.875 Elapsed: 00:00:00.002 1 rows selected.
-
FROM
句を使用しないPL/SQLブロック。CREATE SEQUENCE empno_seq INCREMENT BY 1 START WITH 1 MINVALUE 1 MAXVALUE 1000; Sequence EMPNO_SEQ created. Elapsed: 00:00:00.005 declare v1 number; begin select empno_seq.nextval into v1; dbms_output.put_line ('v1= '||v1); end; / v1= 1 PL/SQL procedure successfully completed. Elapsed: 00:00:00.009
-
操作を実行したり値を取得するための組込み関数またはユーザー定義関数。
SELECT DBMS_RANDOM.VALUE() as random_number;
-
表データに依存しない文字列操作または変換。
SELECT UPPER('oracle') AS uppercase_text;
-
表を使用しない条件式または論理式。
SELECT CASE WHEN 10 > 5 THEN 'True' ELSE 'False' END AS result;
機能2: BOOLEAN
データ型の使用
Oracle Database 23aiでは、新しいBOOLEAN
データ型が導入されています。これにより、数値またはVarcharでシミュレートするのではなく、真のブール列/変数が使用されます。ブール述語を記述する機能により、SQL文の構文が簡略化されます。
-
TEST_BOOLEAN
という表を作成します。CREATE TABLE IF NOT EXISTS TEST_BOOLEAN (name VARCHAR2(100), IS_SLEEPING BOOLEAN); Table TEST_BOOLEAN created. Elapsed: 00:00:00.004
-
新しい表にデータを入力します。値
IS_SLEEPING
は、NOT NULL
がデフォルトとしてFALSE
に設定されます。ALTER TABLE TEST_BOOLEAN modify (IS_SLEEPING boolean NOT NULL);
ALTER TABLE TEST_BOOLEAN modify (IS_SLEEPING default FALSE); Table TEST_BOOLEAN altered. Elapsed: 00:00:00.014
ここでは、Mick、KeithおよびRonの様々なタイプのブール入力を確認できます。すべて有効です。Mickの場合、デフォルトの FALSE値が使用されます- Mickはスリープしていません。
1 row inserted. Elapsed: 00:00:00.006
Keithでは、NO値を使用します。Keithはスリープしていません。
INSERT INTO TEST_BOOLEAN (name, is_sleeping) values ('Keith','NO'); 1 row inserted. Elapsed: 00:00:00.002
Ronには 1の値を使用します。Ronはスリープ状態です。
-
ブール値に基づいた結果をご覧ください。
SELECT * FROM test_boolean;
どの種類のブール型システムを導入したかを覚えておく必要はありません。前述のように、0/1、True/False、Yes/Noまたはその他の共通入力を使用すると、正確な表値が返されます。
機能3: IF NOT EXISTS
DDL句の使用
Oracle Database 23ai以降、新しいIF NOT EXISTS
DDL句を使用すると、DDLエラーの処理方法を決定できます。これによってDDLスクリプトが簡略化されます。オブジェクトの存在や存在しないことによる潜在的なエラーがスクリプトに隠される可能性があるためです。
-
まず、この新機能を使用せずにテストします。次のステートメントを実行します。
DROP TABLE DEPT;
削除する既存の
DEPT
表がないため、ORA-00942: table or view does not exist
というエラーが表示されます。 -
ただし、Oracle Database 23aiでは、エラーなしで
DROP IF EXISTS
を使用できます。これにより、エラーを回避しながら安心できます。ここで、同じ文を実行しますが、この新しいIF EXISTS
機能を含めます。DROP TABLE IF EXISTS DEPT;
-
同様に、この機能を使用して、表が存在しない場合は作成できます。その
DEPT
表を作成します。CREATE TABLE IF NOT EXISTS DEPT (DEPTNO NUMBER(2) CONSTRAINT PK_DEPT PRIMARY KEY, DNAME VARCHAR2(14) , LOC VARCHAR2(13) ) ;
-
この機能を使用して、このチュートリアル全体でさらにサンプル表を作成します。ここでは、
EMP
という従業員表を作成します。CREATE TABLE IF NOT EXISTS EMP (EMPNO NUMBER(4) CONSTRAINT PK_EMP PRIMARY KEY, ENAME VARCHAR2(10), JOB VARCHAR2(9), MGR NUMBER(4), HIREDATE DATE, SAL NUMBER(7,2), COMM NUMBER(7,2), DEPTNO NUMBER(2) CONSTRAINT FK_DEPTNO REFERENCES DEPT); Table EMP created. Elapsed: 00:00:00.006
機能4: 複数行にINSERT
を使用
他の頻繁に使用されるデータベース管理システムとの共存および互換性を確保するもう1つの興味深い機能は、複数値のINSERT
文です。
-
例として、Oracleデータベースの以前のバージョンでは、複数の行を挿入するには、行ごとに個別の挿入文が必要でした。
INSERT INTO DEPT VALUES (10,'ACCOUNTING','NEW YORK'); INSERT INTO DEPT VALUES (20,'RESEARCH','DALLAS'); INSERT INTO DEPT VALUES (30,'SALES','CHICAGO'); INSERT INTO DEPT VALUES (40,'OPERATIONS','BOSTON'); INSERT INTO DEPT VALUES (50,'HR','LOS ANGELES'); INSERT INTO DEPT VALUES (60,'IT','SAN FRANCISCO'); INSERT INTO DEPT VALUES (70,'MANUFACTURING','DETROIT');
Oracle Database 23aiでは、1つの
INSERT
文にこれらのすべての行を挿入できる新しい構文が導入されたため、1つのDMLに複数のタプルを挿入できます。次のステートメントを実行します。INSERT INTO DEPT VALUES (10,'ACCOUNTING','NEW YORK'), (20,'RESEARCH','DALLAS'), (30,'SALES','CHICAGO'), (40,'OPERATIONS','BOSTON'), (50,'HR','LOS ANGELES'), (60,'IT','SAN FRANCISCO'), (70,'MANUFACTURING','DETROIT');
この文を使用すると、他のデータベースとの互換性の向上に加えて、自動コミット・モードでの一部の挿入操作の一貫性を確保できます。これは、たとえば、このモードを使用してデータを処理するOracle APEXアプリケーションにとって重要です。
-
この機能を使用して
EMP
表の値を入力するには、次の文を実行します。INSERT INTO EMP VALUES (7369,'SMITH','CLERK',7902,to_date('17-12-1980','dd-mm-yyyy'),800,NULL,20), (7499,'ALLEN','SALESMAN',7698,to_date('20-2-1981','dd-mm-yyyy'),1600,300,30), (7521,'WARD','SALESMAN',7698,to_date('22-2-1981','dd-mm-yyyy'),1250,500,30), (7566,'JONES','MANAGER',7839,to_date('2-4-1981','dd-mm-yyyy'),2975,NULL,20), (7654,'MARTIN','SALESMAN',7698,to_date('28-9-1981','dd-mm-yyyy'),1250,1400,30), (7698,'BLAKE','MANAGER',7839,to_date('1-5-1981','dd-mm-yyyy'),2850,NULL,30), (7782,'CLARK','MANAGER',7839,to_date('9-6-1981','dd-mm-yyyy'),2450,NULL,10), (7788,'SCOTT','ANALYST',7566,to_date('13-JUL-87')-85,3000,NULL,20), (7839,'KING','PRESIDENT',NULL,to_date('17-11-1981','dd-mm-yyyy'),5000,NULL,10), (7844,'TURNER','SALESMAN',7698,to_date('8-9-1981','dd-mm-yyyy'),1500,0,30), (7876,'ADAMS','CLERK',7788,to_date('13-JUL-87')-51,1100,NULL,20), (7900,'JAMES','CLERK',7698,to_date('3-12-1981','dd-mm-yyyy'),950,NULL,30), (7902,'FORD','ANALYST',7566,to_date('3-12-1981','dd-mm-yyyy'),3000,NULL,20), (7934,'MILLER','CLERK',7782,to_date('23-1-1982','dd-mm-yyyy'),1300,NULL,10);
機能5: 新しいVALUE
コンストラクタの使用
Oracleデータベース23ai以降、表値コンストラクタが拡張されました。INSERT
文でこれを使用して、1つのコマンドで複数の行を作成できるようになりました。SELECT
文およびビュー因数分解構文でも使用できます。この場合、文の構文が簡略化され、DUAL
表の使用が回避されます。
次の文は、その場でテーブル機能の一種のように見えます。
SELECT * FROM (VALUES (50,'HR'), (60,'DEV'), (70,'AI')) virt_dept (deptno, dname);
機能6: GROUP BY
句での別名の使用
Oracle Database 23aiでは、SELECT
文のGROUP BY
句で別名を使用する機能が導入されています。この機能により、複雑な式を使用した問合せの記述が簡略化され、Teradata、MySQL、PostgreSQLなどの他のリレーショナル・データベースとの互換性が向上します。
たとえば次のようにします。
SELECT to_char(hiredate,'YYYY') "Year", count(*)
FROM emp
GROUP BY to_char(hiredate,'YYYY');
Oracle Database 23aiでは、次の図に示すように、これをより簡単に記述できます。
機能7: UPDATE
文およびMERGE
文のRETURNING
句の使用
この句は、EXECUTE IMMEDIATE
文の一部として以前に実装されていました。ただし、Oracle Database 23aiでは、従来の静的DML文の一部として認識できます。
-
この場合、処理された行から列の古い値と新しい値を取得できます。まずは、今の王の給料を見てみましょう。
SELECT ename, sal FROM emp WHERE ename = 'KING';
-
LiveSQLで変数を使用するには、PL/SQLで文をラップアウトします。このスクリプトを実行します。最初に古い給与と新しい給与の変数を作成し、次に
RETURNING
句を使用してKingの給与を更新して変数を設定します。次に、結果を確認します。BEGIN DECLARE old_salary NUMBER; new_salary NUMBER; BEGIN UPDATE emp SET sal = sal + 1000 WHERE ename = 'KING' RETURNING OLD sal, NEW sal INTO old_salary, new_salary; DBMS_OUTPUT.PUT_LINE('Old Salary: ' || old_salary); DBMS_OUTPUT.PUT_LINE('New Salary: ' || new_salary); END; END;
Old Salary: 6000 New Salary: 7000
この例では
UPDATE
文を使用していましたが、RETURNING
句はMERGE
文と同様に使用できます。
機能8: UPDATE
およびDELETE
での結合の使用
外部表の条件に基づいて結合を使用して表データを更新できます。サブ選択またはIN
句は必要ありません。
-
次の文を実行して、調査部門の従業員給与情報を確認します。
select e.sal, e.empno from emp e, dept d where e.deptno=d.deptno and d.dname='RESEARCH';
-
給与情報を更新するには、Oracle Database 23aiより前に、ネストされた文を使用する必要があります。
UPDATE emp e set e.sal=e.sal*2 WHERE e.deptno in (SELECT d.deptno FROM dept d WHERE e.deptno=d.deptno and d.dname='RESEARCH');
Oracle Database 23aiでは、次のように使用できます。
UPDATE emp e set e.sal=e.sal*2 FROM dept d WHERE e.deptno=d.deptno and d.dname='RESEARCH';
-
給与が正常に更新されたことを確認できます。
select e.sal, e.empno from emp e, dept d where e.deptno=d.deptno and d.dname='RESEARCH';
機能9: 注釈の使用
注釈は、データベース・オブジェクトのオプションのメタデータです。注釈は、名前/値ペアまたは名前自体です。名前とオプションの値は自由形式のテキスト・フィールドです。注釈は、注釈が追加されているデータベース・オブジェクトに対する下位要素として表されます。サポート対象のスキーマ・オブジェクトには、表、ビュー、マテリアライズド・ビューおよび索引があります。注釈を使用すると、データベース・オブジェクトに関するメタデータを格納および取得できます。これを使用して、ビジネス・ロジックやユーザー・インタフェースをカスタマイズしたり、メタデータ・リポジトリにメタデータを提供したりできます。表レベルまたは列レベルでCREATE
文またはALTER
文を使用して追加できます。
注釈を使用すると、データベース・オブジェクトに関するメタデータを格納および取得できます。これを使用して、ビジネス・ロジックやユーザー・インタフェースをカスタマイズしたり、メタデータ・リポジトリにメタデータを提供したりできます。
-
列および表注釈を使用して、注釈付き表
EMP_ANNOTATED_NEW
を作成します。CREATE TABLE emp_annotated_new (empno number annotations(identity, display 'person_identity', details 'person_info'), ename varchar2(50), salary number annotations (display 'person_salary', col_hidden)) annotations (display 'employee_table');
-
USER_ANNOTATIONS
やUSER_ANNOTATIONS_USAGE
などのデータ・ディクショナリ・ビューは、使用状況の監視に役立ちます。SELECT object_name, object_type, column_name, annotation_name, annotation_value FROM user_annotations_usage;
機能10: SQLドメインの使用
SQLドメインは、スキーマに属しているディクショナリ・オブジェクトで、オプションのプロパティと制約のセットがカプセル化され、CREATE DOMAIN
文を使用して作成されます。ドメインは、制約、表示、順序付けおよび注釈属性を提供します。SQLドメインを定義した後、そのドメインの列に関連付ける表の列を定義して、ドメインのオプションのプロパティおよび制約を明示的にその列に適用できます
SQLドメインを使用すると、ユーザーは列の目的の使用を宣言できます。これらはデータ・ディクショナリ・オブジェクトであるため、抽象ドメイン固有のナレッジを簡単に再利用できます。
-
yearbirth
という名前のドメインとperson
という名前の表を作成します。CREATE DOMAIN yearbirth as number(4) constraint check ((trunc(yearbirth) = yearbirth) and (yearbirth >= 1900)) display (case when yearbirth < 2000 then '19-' ELSE '20-' end)||mod(yearbirth, 100) order (yearbirth -1900) annotations (title 'yearformat');
CREATE TABLE person (id number(5), name varchar2(50), salary number, person_birth number(4) DOMAIN yearbirth ) annotations (display 'person_table');
```降下人;
名前がNULLですか。タイプ
ID番号(5)名前 VARCHAR2(50)給与番号 PERSON_BIRTH番号(4)ドメイン年生
INSERT INTO person values (1,'MARTIN',3000, 1988);
2. With the new function `DOMAIN_DISPLAY` you can display the property.
SELECT DOMAIN_DISPLAY(person_birth) FROM person;

3. Domain usage and annotations can be monitored with data dictionary views. Let us view `user_annotations_usage`.
user_annotations_usageから*を選択します。
Define reusable domain types (lightweight objects).
ドメインEmailAddressをVARCHAR2(100)として作成チェック(REGEXP_LIKE(値、'^[^@]+@[^@]+.[^@]+$'));
CREATE TABLE users ( user_id NUMBER, email EmailAddress ); ``
Oracle Database 23aiの機能の制限事項
-
FROM
句。-
関数、リテラル、変数などの単純な式にのみ適用されます。
-
表、結合または副問合せを含む問合せでは使用できません。
-
FROM
句が必要なカーソル・ループがあるPL/SQLコンテキストではサポートされていません。
-
-
ネイティブの
BOOLEAN
データ型。-
表の列および式で使用できます。
-
索引付けできません。
BOOLEAN
データ型の列は索引付けできません。 -
すべてのクライアント・ツールまたはレポート・ツールで直接サポートされているわけではありません(0/1またはY/Nへの変換が必要な場合があります)。
-
一部の古いAPIまたはドライバではサポートされていません(JDBC/ODBCクライアントには更新が必要な場合があります)。
-
-
DDLの
IF NOT EXISTS
。-
多重DDLスクリプトを簡略化します。
-
特定のオブジェクト(
TABLE
、INDEX
、SEQUENCE
、VIEW
など)でのみ使用できます。 -
すべてのオブジェクト・タイプがこれをサポートしているわけではありません(たとえば、
TRIGGER
、SYNONYM
では、手動チェックが必要になる場合があります)。 -
古いOracleバージョンではサポートされていません。
-
-
複数値
INSERT
。-
バッチ挿入の構文を消去します。
-
明示的な値セットに限定して、同じ
VALUES
句でSELECT
または副問合せを使用して挿入することはできません。 -
1つのステップで挿入されたすべての行に対して、
RETURNING
句と組み合せることはできません。
-
-
表値コンストラクタ(
VALUES
句)。-
小規模なアドホック行セットに最適です。
-
行制限があります(通常はコンテキストに応じて999以下)。
-
大規模なロードには最適ではなく、大規模なデータセットには一時表またはステージングを使用することをお薦めします。
-
-
GROUP BY
句の別名。-
問合せの読取りおよび書込みが容易になります。
-
副問合せ列を含むすべての分析関数または複合問合せではサポートされていません。
-
別名がオーバーロードされる問合せ(内部問合せで同じ名前など)で混乱が生じる可能性があります。
-
-
UPDATE
/MERGE
のRETURNING
句。-
DML後の
SELECT
の必要性が減少します。 -
実際に変更された行からのみ値を返すことができます。
-
FORALL
のないバルク更新には使用できません。明示的なRETURNING BULK COLLECT
を持つPL/SQLを使用する必要があります。
-
-
UPDATE
およびDELETE
の結合。-
複数表のロジックをよりシンプルにします。
-
一部のコンテキストでは、
INNER JOIN
およびLEFT JOIN
タイプのみがサポートされています。 -
古いツールを使用しているか、以前のOracleバージョンとの互換性が必要な場合、
MERGE
ロジックのリライトが必要になることがあります。
-
-
注釈。
-
ドキュメントに最適です。
-
注釈はメタデータのみで、実行時に適用できません。
-
Oracleデータ・ディクショナリ・ビュー(
*_ANNOTATIONS
)を使用して取得する必要があります。 -
Oracle Data Pumpのエクスポート/インポートまたはレプリケーション・ツールにまだ統合されていません。
-
-
SQLドメインを使用した軽量オブジェクト型。
-
再使用可能で一貫性のあるタイプの強制。
-
ただし、完全なオブジェクト型(メソッド、属性なし)より強力ではありません。
-
プリミティブ制約の強制のみを目的とした継承または構成はありません。
-
ドメイン自体にデフォルト値を定義できません(デフォルトは列レベルで指定されています)。
-
一般的な制限
-
ツールの互換性:多くのGUIツールおよび古いOracleクライアント・ライブラリは、Oracle Database 23ai構文(特に
VALUES
、BOOLEAN
、DOMAIN
)をまだ完全にサポートしていない可能性があります。 -
エクスポート/インポート:注釈やドメインなどの一部の機能は、古い
expdp
/impdp
ワークフローでは保持されない場合があります。 -
実験的な動作:これらの機能は新しいため、マイナー・リリースで進化する可能性のあるものもあります。パッチ・ノートやドキュメントを頻繁に確認してください。
関連リンク
確認
- 著者 - Aditya Srivastawa (プリンシパル・クラウド・アーキテクト)
その他の学習リソース
docs.oracle.com/learnで他のラボを確認するか、Oracle Learning YouTubeチャネルで無料のラーニング・コンテンツにアクセスしてください。また、education.oracle.com/learning-explorerにアクセスして、Oracle Learning Explorerになります。
製品ドキュメントについては、Oracle Help Centerを参照してください。
Explore SQL Features in Oracle Database 23ai
G35699-01
Copyright ©2025, Oracle and/or its affiliates.