アシストでは、日本オラクル社の協力を得てOracle Database 23aiの検証プログラムを行っています。
第二回目の本記事では、SQLの機能拡張を4つご紹介します。
-
※本記事はOracle Database 23aiで強化されたSQL機能の検証結果に基づいています。
Oracle Database 23aiは「Oracle AI Database 26ai」に名称変更されましたが、ここで紹介している機能は26aiでも利用できます。23aiと26aiの関係については「Oracle AI World 2025視察記
」をご参照ください。
Oracle Databaseでは19cの次のLong Term Releaseとして23aiが登場しました。
移行先のバージョン検討にあたり、23aiを候補に挙げているお客様も多いのではないでしょうか。
本記事でご紹介する機能拡張にご注目ください!
なお第1弾、SQL関連の新機能については以下からぜひご確認ください。
1.FROM句なしのSELECT
Oracle Databaseでは従来、関数の実行や計算を行う際にダミー表(DUAL表)に対してSELECT文を実行していました。
23aiではfrom句の指定が必須ではなくなり、次のような記載が可能です。
| ~21c | select sysdate from dual; |
| 23ai | select sysdate; – from 句が不要となった |
なお23aiでもDUAL表の明示指定は可能ですので、以前のバージョンと同じ “FROM DUAL”でも実行できます。
2.IF [ NOT ] EXISTS
DDL(CREATE / DROP / ALTER)を実行する際、IF [ NOT ] EXISTS構文を使用できるようになりました。
-- CREATE 文では、対象オブジェクトが存在しない場合にオブジェクトを
-- 作成する (IF NOT EXISTS) 指定が可能
-- オブジェクトが存在しない場合、オブジェクトを作成
SQL> create table IF NOT EXISTS test_table (col1 number);
表が作成されました。
SQL> select table_name from user_tables;
TABLE_NAME
--------------
TEST_TABLE ★TEST_TABLE が作成される
-- すでにオブジェクトが存在する場合も、SQLはエラーとならない
SQL> create table IF NOT EXISTS test_table (col1 number);
表が作成されました。
SQL> select table_name from user_tables;
TABLE_NAME
---------------
TEST_TABLE ★同名のテーブルが2つ作成されることはない
IF [ NOT ] EXISTS句を指定しておくことで、オブジェクト作成時の「ORA-00955: すでに使用されているオブジェクト名です。」エラーや、オブジェクト削除時の「ORA-00942: 表またはビューが存在しません。」などを回避できます。
同名のオブジェクトの作成、削除を繰り返すような処理を実行している場合、IF [ NOT ] EXISTS句を入れておくことで動作の安定に繋がりそうですね。
3.表値コンストラクタ
これまで、INSERT文1つにつき1行のデータが挿入されるというのが通例でした。
23aiではVALUES句内に複数行分の情報を指定することで、1SQLでも複数行の挿入が可能です。
| ~21c |
INSERT INTO test_table VALUES ( 1, 'ALICE' );
INSERT INTO test_table VALUES ( 2, 'BECKY' );
INSERT INTO test_table VALUES ( 3, 'CHRIS' );
|
| 23ai |
INSERT INTO test_table -- 複数行まとめて挿入できる
VALUES ( 1, 'ALICE' ),
( 2, 'BECKY' ),
( 3, 'CHRIS' );
|
INSERT文でデータを入れる際に、入力すべきコマンドの量を圧倒的に減らすことができるようになりました。
4.パラレルDMLの制限緩和 ※Enterprise Editionのみ
21cまでは、DMLをパラレル実行した場合、そのトランザクションがCOMMITされるまで対象オブジェクトに対するSELECTやDMLがエラーとなります。
– 19c にてパラレル DML を実行
SQL> alter session enable parallel dml;
セッションが変更されました。
SQL> update /*+ PARALLEL(test_para, degree 2) */ test_para set col1=4;
3行が更新されました。
– パラレルDMLがCOMMIT/ROLLBACKされるまでDMLやSELECTはエラーとなる
SQL> insert into test_para values (5);
insert into test_para values (5)
*
行1でエラーが発生しました。:
ORA-12838: オブジェクトは、パラレルで変更された後は読取り/変更できません。
SQL> select * from test_para;
select * from test_para
*
行1でエラーが発生しました。:
ORA-12838: オブジェクトは、パラレルで変更された後は読取り/変更できません。
23aiではこの機能制限が緩和され、パラレルDMLのCOMMIT前でも対象オブジェクトに対するSELECTやDMLを実行できるようになりました。
– 23ai にてパラレル DML を実行
SQL> alter session enable parallel dml;
セッションが変更されました。
SQL> update /*+ PARALLEL(test_para, degree 2) */ test_para set col1=4;
3行が更新されました。
SQL> insert into test_para values (5); ★エラーにならずに実行できる
1行が作成されました。
SQL> select * from test_para; ★エラーにならずに実行できる
COL1
----------
4
4
4
5
パラレルDMLが非常に使いやすくなりましたので、DMLの処理速度にお困りの方はぜひ機能拡張をご確認ください。
なお、SQLのパラレル実行はEnterprise Editionのみの機能です。
最後に
本記事では、23aiで拡張されたSQLの機能を4つご紹介しました。
これから23aiを使用される皆様はぜひ、これらの機能をご活用ください。
なお、1.FROM句なしのSELECTや2.IF [ NOT ] EXISTS、3.表値コンストラクタについて、従来のOracle Databaseと、PostgreSQLやMySQLなどの他RDBMSでコマンドに違いがある部分であることから、移行時にスクリプトの書き換えが発生するケースがありました。
23aiではこのSQL差分が埋められたことで、Oracle Databaseへの移行負荷が緩和されました。
別DBからOracle Databaseへの移行を検討されている皆様も、ぜひ23aiをご検討ください。
今回はSQLの機能拡張に着目してお伝えしましたが、これからもアシスト現場ブログでは23aiの様々な機能についてご紹介してまいります。お楽しみに!
この記事で知りたい情報は得られましたか?
本記事に関連して、他にもOracle Database 23aiの新機能や機能拡張についてご紹介している記事もございます。あわせてご活用ください。
執筆者情報
2019年に新卒入社。Oracle Databaseの技術部門に配属後、サポートやフィールドエンジニアとして活動。 Oracle Databaseの教育講師も兼任しており、SQLやPL/SQLなど言語系の講義を担当する。