1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Oracle AI Database 26ai の SQL機能変化を確認してみる(NULLとデフォルト値の扱い)

Posted at

この記事は、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>
1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?