2026/02/09 ------------------------------ OracleDatabase11gを19cに更新しました。 DBA以外のアプリケーション開発者にとって開発の効率化や品質改善につながる12c〜19cの新機能を教えてください。 SELECT文のFETCH FIRST N ROWS ONLYの句のサポートなどが代表例です。これに匹敵するような活用すべき機能を挙げてください。 ------------------------------ ・ORDER BYでソート後最大N件表示 ------ SELECT * FROM table1 ORDER BY score DESC FETCH FIRST 100 ROWS ONLY; ------ ・JSONのネイティブサポート 列に格納したJSONを通常の列のように直接クエリ可能 SELECT b.document.businessName, b.document.address.streetNumber FROM businesses b; 生成も可能 SELECT json_object( 'id' VALUE customer_id, 'name' VALUE customer_name ) FROM customers; ・LATERAL / CROSS APPLY / OUTER APPLY 外側のテーブル列を参照するインラインビューが書ける ------ SELECT c.customer_id, o.* FROM customers c CROSS APPLY ( SELECT * FROM orders o WHERE o.customer_id = c.customer_id FETCH FIRST 3 ROWS ONLY ) o; ------ 「顧客ごとにTOP3注文」などが自然に書ける ・OFFSET句 ページング用途 SELECT * FROM employees ORDER BY emp_id OFFSET 50 ROWS FETCH NEXT 10 ROWS ONLY; ・IDENTITY列=オートインクリメント(自動採番)列 乱用禁物だがうまく使えば効率向上 ・VARCHAR2の文字数が4000⇒32767 ・Invisible Columns SELECT * には追加されずに列を追加できる 後方互換性を確認しつつ表を拡張できる ・RESULT_CACHE SELECT文のヒント /*+ RESULT_CACHE */ や、FUNCTIONの関数定義にRESULT_CACHE句を含めることで高速化 ・LISTAGG構文拡張 SELECT deptno, LISTAGG(DISTINCT ename, ',') WITHIN GROUP (ORDER BY ename) FROM emp GROUP BY deptno; CSV生成SQLが激減 アプリ側の文字列結合ロジック削減 パフォーマンス改善 →「SQLで完結させる」設計に寄せられる。 ・MATCH_RECOGNIZE ・インラインPL/SQL…WITHでその場限りの関数を定義できる WITH FUNCTION calc_tax(amount NUMBER) RETURN NUMBER IS BEGIN RETURN amount * 0.1; END; SELECT product_name, calc_tax(price) FROM products; ・複数レコードの一括insert 18cでできるように INSERT INTO employees (id, name) VALUES (1, 'Tanaka'), (2, 'Suzuki'), (3, 'Sato'); ・INSERT ALL文もある ⇒こちらはWHENによって別の表にinsertできたりする ・DEFAULT句でシーケンスを参照できる CREATE TABLE logs ( log_id NUMBER DEFAULT log_seq.NEXTVAL, message VARCHAR2(100) ); ・DEFAULT ON NULL 絶対NULL許可しない ------ status VARCHAR2(10) DEFAULT 'NEW' ON NULL ------ (以上)