この記事は、JPOUG Advent Calendar 2025 24日目の記事です。23日目は Kazuhiro Takahashiさん の記事OCIのBaseDBのクローンとオリジナルとの違いでした。
この記事では、Oracle AI Database 26ai(23ai)でのSQL新機能・新しい動きを改めて確認してみます。
特に画期的な新機能というより、普段から使いそうなピンポイントな部分に注目します。
Oracle AI Database 26aiマニュアル
新しい機能については「Oracle AI Database新機能」から確認できます。
26aiで新しく追加されたり、動作が変更されたりしたSQL関連機能一覧
「SQLでの動作変更・新機能」をマニュアルから抜粋してみました。
23c/23ai時点で変更済だったものも多くあります。
オラクルマスター受験などにも影響でそうな機能もありますね。
個人的に気になった機能に色付けしました。
赤字は本記事で扱いたいと思います。
青字は以前記事にしたものもあるため、一部参考資料をのせています。
・スキーマ注釈
・UPDATE文およびDELETE文の直接結合
・IF [NOT] EXISTS構文のサポート
・アプリケーション開発者用の新しいデータベース・ロール
・INTERVALデータ型に対する集計
・自動PL/SQLからSQLトランスパイラ
・クライアントの記述コールでのタグ・オプションのサポート
・UPDATE文でのDEFAULT ON NULL
・DESCRIBEでの列の注釈のサポート
・OCCIでのデータ・ユース・ケース・ドメイン・メタデータのサポート
・データ・ユース・ケース・ドメイン
・PL/SQLでのディメンション単位の算術サポート
・PL/SQL関数の動的統計
・エラー・メッセージの改善
・拡張されたCASE制御
・GROUP BY ALL
・GROUP BY列の別名または位置
・SQLの使用によるUUIDの生成とテスト
・改善されたTNSエラー・メッセージ
・バインド変数が存在する場合のマテリアライズド・ビューの問合せリライトとカーソル共有
・マルチリーガル・エンジンでのSQL BOOLEANデータ型のサポート
・位置に関係しないINSERT句
・Oracle C++ Call Interface (OCCI)でのSQL BOOLEANデータ型のサポート
・SQL BOOLEANデータ型に対するOracleクライアント・ドライバのサポート
・FROM句なしのSELECT
・SQL BOOLEANデータ型
・SQL時間バケット処理
・SQL UPDATE RETURN句の機能拡張
・SQL*PlusでのSQL BOOLEANデータ型のサポート
・QUALIFY句のサポート
・表値コンストラクタ
・Unicode 15.0のサポート
過去記事・参考記事紹介
読み取り専用ユーザ/セッションが作成可能
読み取りしかできないセッションを作成できます。
あやまった変更を防ぐために有用機能です。
dual表の指定が不要に
FROM句のないSQLが登場しています。
新しいデータ型Boolean型
他RDBMSでは搭載されているものが多かったため、とうとうOracleでも使用可能に、、という気持ちです。
いままでCHAR型で 1,0 のデータで判定したりしていたのが楽になりそうですね。
GROUP BYの機能変更
GROUP BY ALLという指定や、GROUP BYで列別名指定可能になりました。
オラクルマスター試験に結構影響しそうです。
すでにいい記事がありましたので、紹介させていただきます。
INSERT,UPDATEでのデフォルト値/NULLの扱い変更
テーブル(列)に指定したデフォルト値はどんな時に使用されている?
再確認と、新しいオプションを確認してみます。
以下の実行例をみてみてください。
INSERT文で明示的にNULLと指定されていますが、デフォルト値が入っています。
この明示的にNULLを指定したときの動きの変化がポイントになります。
・INSERTでNULLを指定したときの、動きの変化
・UPDATEでNULLを指定したときの、動きの変化
INSERT INTO test4 VALUES ( 3 , null );
1 row created.
SQL> SELECT * FROM test4;
ID VAL
---------- --------------------
3 default value
デフォルトの動き(今までの動作)
まずはCREATE TABLEでのデフォルト値を指定するオプションをみてみます。
赤字がデフォルト値の動作を決めるオプション指定です。
下2つの for ~ が 26aiでの追加オプションです。
CREATE TABLE TEST ( ID NUMBER(1) , VAL VARCHAR2(20) DEFAULT 'default value' );
CREATE TABLE TEST3 ( ID NUMBER(1) , VAL VARCHAR2(20) DEFAULT on NULL for INSERT ONLY 'default value' );
CREATE TABLE TEST4 ( ID NUMBER(1) , VAL VARCHAR2(20) DEFAULT on NULL for INSERT and UPDATE 'default value' );
元々、デフォルト値はINSERTで列が明示的に参照されていない場合にのみ適用されていました。
それでは明示的に NULL を指定していた時は、どんな動作になるでしょうか?
また UPDATE はどうでしょう。
SQL> CREATE TABLE TEST ( ID NUMBER(1) , VAL VARCHAR2(20) DEFAULT 'default value' );
Table created.
SQL> INSERT INTO test VALUES ( 1 , 'test' );
1 row created.
SQL> INSERT INTO test (ID) VALUES ( 2 );
1 row created.
SQL> INSERT INTO test VALUES ( 3 , null );
1 row created.
SQL> INSERT INTO test VALUES ( 4 , default );
1 row created.
SQL> SELECT * FROM test;
ID VAL
---------- --------------------
1 test
2 default value ★INSERTで省略したため、デフォルト値が使用されています
3 ★明示的にnullを指定したため、nullになっています
4 default value ★明示的にdefaultを指定したため、デフォルト値が使用されています
SQL> UPDATE test SET val = 'AAA';
4 rows updated.
SQL> SELECT * FROM test;
ID VAL
---------- --------------------
1 AAA
2 AAA
3 AAA
4 AAA
SQL> UPDATE test SET val = null;
4 rows updated.
SQL> SELECT * FROM test; ★UPDATEでnullを指定したため、nullになりました
ID VAL
---------- --------------------
1
2
3
4
SQL> UPDATE test SET val = default;
4 rows updated.
SQL> SELECT * FROM test; ★UPDATEでdefaultを指定したため、defaultになりました
ID VAL
---------- --------------------
1 default value
2 default value
3 default value
4 default value
SQL>
INSERT時のNULL指定が、デフォルト指定として扱われる
オプション:DEFAULT on NULL for INSERT ONLY
このオプションを指定すると、INSERT時に明示的にNULLを指定したときに、NULLではなくてdefaultの値が入るようになります。
また、UPDATE文でNULLにすることができなくなります。
SQL> CREATE TABLE TEST3 ( ID NUMBER(1) , VAL VARCHAR2(20) DEFAULT on NULL for INSERT ONLY 'default value' );
Table created.
SQL> SQL> SQL> INSERT INTO test3 VALUES ( 1 , 'test' );
1 row created.
SQL> SQL> INSERT INTO test3 (ID) VALUES ( 2 );
1 row created.
SQL> SQL> INSERT INTO test3 VALUES ( 3 , null );
1 row created.
SQL> SQL> INSERT INTO test3 VALUES ( 4 , default );
1 row created.
SQL> SQL> SELECT * FROM test3;
ID VAL
---------- --------------------
1 test
2 default value ★今まで通り
3 default value ★明示的にnullを指定したが、デフォルト値が使用されています
4 default value ★今まで通り
SQL>
SQL> UPDATE test3 SET val = 'AAA';
4 rows updated.
SQL> SELECT * FROM test3;
ID VAL
---------- --------------------
1 AAA
2 AAA
3 AAA
4 AAA
SQL> UPDATE test3 SET val = null; ★UPDATE文でNULLにすることができません
UPDATE test3 SET val = null
*
ERROR at line 1:
ORA-01407: cannot update ("C##A"."TEST3"."VAL") to NULL
Help: https://docs.oracle.com/error-help/db/ora-01407/
SQL> SQL> SELECT * FROM test3;
ID VAL
---------- --------------------
1 AAA
2 AAA
3 AAA
4 AAA
SQL> SQL> UPDATE test3 SET val = default; ★デフォルト値は指定できます
4 rows updated.
SQL> SELECT * FROM test3;
ID VAL
---------- --------------------
1 default value
2 default value
3 default value
4 default value
SQL>
INSERT時のNULL指定が、デフォルト指定として扱われる
オプション:DEFAULT on NULL for INSERT and UPDATE
このオプションを指定すると、INSERT時に明示的にNULLを指定したときに、NULLではなくてdefaultの値が入るようになります。
また、UPDATE文でNULLにしたときにも、defaultの値が入るようになります。
(1つ前のINSERT onlyオプションと異なる)
SQL> CREATE TABLE TEST4 ( ID NUMBER(1) , VAL VARCHAR2(20) DEFAULT on NULL for INSERT and UPDATE 'default value' );
Table created.
SQL> INSERT INTO test4 VALUES ( 1 , 'test' );
1 row created.
SQL> INSERT INTO test4 (ID) VALUES ( 2 );
1 row created.
SQL> INSERT INTO test4 VALUES ( 3 , null );
1 row created.
SQL> INSERT INTO test4 VALUES ( 4 , default );
1 row created.
SQL> SELECT * FROM test4;
ID VAL
---------- --------------------
1 test
2 default value ★今まで通り
3 default value ★明示的にnullを指定したが、デフォルト値が使用されています
4 default value ★今まで通り
SQL> UPDATE test4 SET val = 'AAA';
4 rows updated.
SQL> SELECT * FROM test4;
ID VAL
---------- --------------------
1 AAA
2 AAA
3 AAA
4 AAA
SQL> UPDATE test4 SET val = null; ★UPDATEでnullを指定したが、defaultになりました(INSERT onlyと異なる動作)
4 rows updated.
SQL> SELECT * FROM test4;
ID VAL
---------- --------------------
1 default value
2 default value
3 default value
4 default value
SQL> UPDATE test4 SET val = 'AAA';
4 rows updated.
SQL> SELECT * FROM test4;
ID VAL
---------- --------------------
1 AAA
2 AAA
3 AAA
4 AAA
SQL> SQL> UPDATE test4 SET val = default; ★UPDATEでdefaultを指定したため、defaultになりました
4 rows updated.
SQL> SQL> SELECT * FROM test4;
ID VAL
---------- --------------------
1 default value
2 default value
3 default value
4 default value
SQL>