Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Oracle Database 23c SQL新機能

Oracle Database 23c SQL新機能

・スキーマレベルの権限設定
・アノテーション(注釈)
・SQLドメイン
・4096 列
・JSONスキーマ
・BOOLEAN データ型
・JOINによる更新
・JavaScript ストアド プロシージャ
・IF [NOT] EXISTS
・GROUP BY 列の別名/位置
・テーブル・バリュー・コンストラクター (ISO SQL 標準)
・RETURNING 句の改善
・開発者ロール
・SQL分析
・FROM句 を使用しない SELECT
・文字列一致 SQL 関数
・シームレスな文字列連結
・エラーメッセージの大幅改善

oracle4engineer

August 25, 2023
Tweet

More Decks by oracle4engineer

Other Decks in Technology

Transcript

  1. • 以前は、DB 全体の任意のオブジェクト、またはすべてのオブジェクトに対して明示的にアクセスを許可する必要があり ました • スキーマ全体の任意のオブジェクトへのアクセスを許可できるようになりました スキーマレベルの権限設定 Copyright © 2023,

    Oracle and/or its affiliates 2 スキーマ全体のオブジェクトに権限を付与する機能 GRANT SELECT ANY TABLE TO HR; GRANT SELECT ON PROD.CUSTOMERS, PROD.SALES, PROD.ADDRESSES, PROD.STOCK, PROD.PAYMENTS … TO HR; GRANT SELECT ANY TABLE ON SCHEMA PROD TO HR; NEW IN 23c
  2. • データとデータモデルのメタデータを提供する • サポートされているもの: テーブル、ビュー、テーブル/ビューの列、マテリアライズド ビュー、インデックス、ドメインなど • メリット • 列や表に対して、機密情報の注意事項の注釈をつけることができる。

    • アプリケーション開発者に、非表示などデータの扱いについて注釈をつけることができる。 • テーブル設計書やデータ設計書などのメタデータ文書の作成負荷の軽減が期待できます。 アノテーション(注釈) Copyright © 2023, Oracle and/or its affiliates 3 annotations ::= 'ANNOTATIONS' ( annotations_list ) annotations_list ::= { 'ADD' | 'DROP' } annotation ( ',' { 'ADD' | 'DROP' } annotation ) annotation ::= annotation_name annotation_value NEW IN 23c
  3. • 注釈をフリーテキストのキーまたはキーと値のペアとして定義する • テーブルの列などの属性に注釈を追加する アノテーション(注釈) Copyright © 2023, Oracle and/or

    its affiliates 5 CREATE TABLE employee ( id NUMBER(5) ANNOTATIONS (Identity, Display 'Employee ID', "Group" 'Emp_Info'), name VARCHAR2(50) ANNOTATIONS (Display 'Employee Name', "Group" 'Emp_Info'), salary NUMBER ANNOTATIONS (Display 'Employee Salary', UI_Hidden) ) ANNOTATIONS (Display 'Employee Table'); NEW IN 23c アノテーション作成例
  4. • アノテーションを検索できる アノテーション(注釈) Copyright © 2023, Oracle and/or its affiliates

    6 SELECT ANNOTATION_NAME, ANNOTATION_VALUE FROM USER_ANNOTATIONS_USAGE WHERE Object_Name = 'EMPLOYEE' AND Object_Type = 'TABLE' AND Column_Name IS NULL; ANNOTATION_NAME ANNOTATION_VALUE --------------- ---------------- DISPLAY Employee Table NEW IN 23c 表のアノテーションの検索例
  5. • アノテーションを検索できる アノテーション(注釈) Copyright © 2023, Oracle and/or its affiliates

    7 SELECT COLUMN_NAME, ANNOTATION_NAME, ANNOTATION_VALUE FROM USER_ANNOTATIONS_USAGE WHERE Object_Name = 'EMPLOYEE' AND Object_Type = 'TABLE' AND Column_Name IS NOT NULL; COLUMN_NAME ANNOTATION_NAME ANNOTATION_VALUE ----------- --------------- ---------------- ID IDENTITY ID DISPLAY Employee ID ID Group Emp_Info ENAME DISPLAY Employee Name ・・・ NEW IN 23c 列のアノテーションの検索例
  6. • メリット • これまでデータ型の定義は、VARCHAR2, NUMBER など汎用的なものしか用意されていなかったので、クレ ジット カード番号や電子メールアドレスなどは、アプリケーション側で入力チェックする必要あった。 • アプリケーション固有のクレジット

    カード番号や電子メール アドレスなどのデータ型をSQLドメインとして 制約して定義すると、データをテーブルに挿入、更新時にデータが検証チェックされるので、 データの一貫性が保たれ、データの品質が向上します。 • これまでは、データの検証チェックは、主にアプリケーション側でされていたが、SQLドメインでの検証チェックすること によりアプリケーションの開発工数の削減が期待できます。 SQLドメイン Copyright © 2023, Oracle and/or its affiliates 8 ドメイン固有の知識を再利用可能なオブジェクトに抽象化する NEW IN 23c データ型 制約 属性 SQLドメイン カプセル化
  7. SQLドメイン Copyright © 2023, Oracle and/or its affiliates 9 ドメイン固有の知識を再利用可能なオブジェクトに抽象化する

    CREATE DOMAIN email AS VARCHAR2(255) NOT NULL CONSTRAINT email_c CHECK (REGEXP_LIKE (email, '^(¥S+)¥@(¥S+)¥.(¥S+)$')) DISPLAY '---' || SUBSTR(email, INSTR(email, '@')) ORDER SUBSTR(email, INSTR(email, '@')+1) || SUBSTR(email, 1, INSTR(email, '@')); NEW IN 23c 例として、メールアドレスのドメインを作成 CREATE DOMAIN DomainName AS <Data Type> [ DEFAULT <expression> [ ON NULL ] ] [ NOT NULL ] [ CONSTRAINT [ name ] CHECK (<expression>) [ ENABLE | DISABLE ] ] [ COLLATE collation ] [ DISPLAY <expression> ] [ ORDER <expression> ] [ ANNOTATIONS ( annotations ) ] 構文
  8. SQLドメイン Copyright © 2023, Oracle and/or its affiliates 10 作成したメールアドレス

    ドメインを使って表を作成 CREATE TABLE customers ( cust_id NUMBER NOT NULL PRIMARY KEY, name VARCHAR2(4000) NOT NULL, contact_email VARCHAR2(1000) DOMAIN email, invoice_email email ); INSERT INTO customers values (1, 'TEST', 'abc', 'abc'); ORA-02290: check constraint (EMAIL_C) violated NEW IN 23c メールアドレス ドメインの列がある表に、ドメイン制約違反の行を挿入するとエラー
  9. • 表示と順序を取得するための新しい関数 DOMAIN_DISPLAY() と DOMAIN_ORDER() SQLドメイン Copyright © 2023, Oracle

    and/or its affiliates 11 ドメイン固有の知識を再利用可能なオブジェクトに抽象化する SELECT DOMAIN_DISPLAY(invoice_email) AS email FROM customers; EMAIL ------------- [email protected] [email protected] [email protected] SELECT name FROM customers ORDER BY DOMAIN_ORDER(contact_email); NAME ------------- Aldi Shell Swarovski NEW IN 23c ドメイン表示関数を使った検索 ドメイン順序関数を使った検索
  10. • 23c はテーブルごとに最大 4096 列をサポートできます • COMPATIBILITY を23.0.0 に設定する必要があります 4096

    列 Copyright © 2023, Oracle and/or its affiliates 12 ALTER SYSTEM SET MAX_COLUMNS=EXTENDED; NEW IN 23c
  11. • ストレージの検証 • クエリの検証 • 検証レポート JSONスキーマ Copyright © 2023,

    Oracle and/or its affiliates 13 JSONドキュメントを検証する CREATE TABLE jdocs ( doc JSON VALIDATE '{ "type": "object", "properties": { "id": {"type": "number"} } }' ); SELECT * FROM staging WHERE doc IS JSON VALIDATE '{ "type": "object", "properties": { "id": {"type": "number} } }'; SELECT DBMS_JSON_SCHEMA .VALIDATE_REPORT(doc, schema) FROM jdocs; REPORT ----------------------------- { "valid" : false, "errors" : [ { "schemaPath" : "$.id", "instancePath" : "$", "code" : "JZN-00503", "error" : "invalid type found, actual: string, expected: number" } ] } NEW IN 23c
  12. • メリット • データの有効フラグのような列で、より使いやすい BOOLEAN データ型 Copyright © 2023, Oracle

    and/or its affiliates 14 CREATE TABLE emails (address VARCHAR2(1000), active BOOLEAN); INSERT INTO emails VALUES ('[email protected]', TRUE); INSERT INTO emails VALUES ('[email protected]', FALSE); INSERT INTO emails VALUES ('[email protected]', 'YES'); INSERT INTO emails VALUES ('[email protected]', 0); SELECT address FROM emails WHERE active; ADDRESS -------------------- [email protected] [email protected] NEW IN 23c 真偽値のみを持つ新しいデータ型
  13. • 以前は、結合からの条件をサブクエリで記述 JOINによる更新 Copyright © 2023, Oracle and/or its affiliates

    15 UPDATE emp e SET e.salary = e.salary*2 WHERE e.dept_id = (SELECT d.dept_id FROM dept d WHERE d.name = 'Development’); NEW IN 23c UPDATE emp e SET e.salary = e.salary*2 FROM dept d WHERE e.dept_id = d.dept_id AND d.name = 'Development'; • MERGEを使った結合の更新 MERGE INTO emp e USING (SELECT d.dept_id, d.name FROM dept d WHERE d.name = ‘Development’) ON (e.dept_id = d.dept_id) WHEN MATCHED THEN UPDATE SET e.salary = e.salary*2; • FROM句での表結合できる
  14. • モジュールを使用して JavaScript コードを再利用する JavaScript ストアド プロシージャ Copyright © 2023,

    Oracle and/or its affiliates 16 データベース内に JavaScript を保存して実行する CREATE MLE MODULE jsmodule LANGUAGE JAVASCRIPT AS export function concat (str1, str2) { return str1 + str2; } export function substr(str, start) { return str.substring(start); } CREATE FUNCTION js_contact (str1 IN VARCHAR2, str2 IN VARCHAR2) RETURN VARCHAR2 AS MLE MODULE jsmodule SIGNATURE 'concat(string , string)'; SELECT js_concat('Hello ', 'World!'); JS_CONTACT('HELLO ', 'WORLD!') ------------------------------ Hello World! NEW IN 23c
  15. • 制御エラー付きDDL • オブジェクトが存在するときでもエラーにならない IF [NOT] EXISTS Copyright © 2023,

    Oracle and/or its affiliates 17 CREATE TABLE test123 (id NUMBER); ORA-00955: name is already used by an existing object CREATE TABLE IF NOT EXISTS test123(id NUMBER); Table created. DROP TABLE test123; ORA-00942: table or view does not exist DROP TABLE IF EXISTS test123; Table dropped. NEW IN 23c
  16. • GROUP BY 句で長い式を繰り返す必要がなくなりました。 GROUP BY 列の別名/位置 Copyright © 2023,

    Oracle and/or its affiliates 18 SELECT extract(year FROM hiredate) AS hired_year, COUNT(*) FROM emp GROUP BY extract(year FROM hiredate) HAVING extract(year FROM hiredate) > 1985; SELECT extract(year FROM hiredate) AS hired_year, COUNT(*) FROM emp GROUP BY hired_year HAVING hired_year > 1985; NEW IN 23c
  17. • 以前は、INSERT ALL句を使いINSERT文を複数回記述し、最後にDUAL表を検索する複雑さ テーブル・バリュー・コンストラクター (ISO SQL 標準) Copyright © 2023,

    Oracle and/or its affiliates 19 複数の行を一度に生成する INSERT INTO bookings VALUES (12113, 'Vienna', '2022-09-21'), (62361, 'San Francisco', '2022-10-12'), (08172, 'Berlin', '2022-12-15'); NEW IN 23c INSERT ALL INSERT INTO bookings VALUES (12113, 'Vienna', '2022-09-21') INSERT INTO bookings VALUES (62361, 'San Francisco', '2022-10-12') INSERT INTO bookings VALUES (08172, 'Berlin', '2022-12-15’) SELECT * FROM DUAL; • VALUE句で複数行の値を記述し簡潔に
  18. • 一時的な表を使う場合、実体化 テーブル・バリュー・コンストラクター (ISO SQL 標準) Copyright © 2023, Oracle

    and/or its affiliates 20 複数の行を一度に生成する CREATE TABEL t1 ( employee_id NUMBER(1,0), first_name VARCHAR2(10)); INSERT INTO t1 VALUES (1,'SCOTT’); INSERT INTO t1 VALUES (2,'SMITH’); INSERT INTO t1 VALUES (3,'JOHN’); SELECT FROM t1; SELECT * FROM (VALUES (1,'SCOTT'), (2,'SMITH'), (3,'JOHN') ) t1 (employee_id, first_name); EMPLOYEE_ID FIRST ----------- ----- 1 SCOTT 2 SMITH 3 JOHN NEW IN 23c • SQL文の中で、一時的な表を使う
  19. テーブル・バリュー・コンストラクター (ISO SQL 標準) Copyright © 2023, Oracle and/or its

    affiliates 21 複数の行を一度に生成する • テーブル・バリュー・コンストラクター の実行計画 WITH X (c1, c2, c3) AS ( VALUES (0, 1, 2), (3, 4, 5), (6, 7, 8) ) SELECT * FROM X; C1 C2 C3 --------- ---------- ---------- 0 1 2 3 4 5 6 7 8 Execution Plan --------------------------- Plan hash value: 2575724336 --------------------------- | Id | Operation | Name | --------------------------- | 0 | SELECT STATEMENT | | 1 | VIEW | | 2 | VALUES SCAN | --------------------------- Table Value Constructor -------------------------------------------- 2 - #tuples:3, #elems:3 values:(0, 1, 2), (3, 4, 5), (6, 7, 8) NEW IN 23c
  20. • すべての DML ステートメント (INSERT/UPDATE/DELETE/MERGE) で 更新前を含めて更新前後の値を返すことができる RETURNING 句の改善 Copyright

    © 2023, Oracle and/or its affiliates 22 UPDATE employees SET salary=salary*2 WHERE country = 'Austria' RETURNING OLD salary, NEW salary INTO :old_salary, :new_salary; RETURNING CLAUSE ::= { RETURN | RETURNING } { OLD | NEW } expr [, { OLD | NEW } expr ] ... INTO variable [, variable ] ... NEW IN 23c SELECT salary INTO :old_salary FROM employees WHERE country = 'Austria’; UPDATE employees SET salary=salary*2 WHERE country = 'Austria' RETURNING salary INTO :new_salary; • 更新後の値は取得できるが、 更新前の値は、別のDMLで取得 • 更新前と後の値を、 一度のDMLで取得可能に
  21. • すべての DML ステートメント (INSERT/UPDATE/DELETE/MERGE) で • 更新前後の値を返します RETURNING 句の改善

    Copyright © 2023, Oracle and/or its affiliates 23 MERGE INTO sales s USING (SELECT account, sale FROM ext) e ON (e.account=s.account) WHEN MATCHED THEN UPDATE SET s.sale=e.sale WHEN NOT MATCHED THEN INSERT (s.account, s.sale) VALUES (e.account, e.sale) RETURNING s.account, e.sale INTO :n1, :n2; NEW IN 23c
  22. • 1 つのコマンドで開発者権限を付与/取り消します。 開発者ロール Copyright © 2023, Oracle and/or its

    affiliates 24 GRANT DB_DEVELOPER_ROLE TO dev_user; REVOKE DB_DEVELOPER_ROLE FROM dev_user; NEW IN 23c • 含まれるもの: • データモデルの構築に必要なシステム権限 • アプリケーションの監視とデバッグに必要なオブジェクト権限
  23. • 含まれるシステム権限 • ADMINISTER SQL TUNING SET • CREATE ANALYTIC

    VIEW • CREATE ATTRIBUTE DIMENSION • CREATE CUBE • CREATE CUBE BUILD PROCESS • CREATE CUBE DIMENSION • CREATE DIMENSION • CREATE DOMAIN • CREATE HIERARCHY • CREATE JOB • CREATE MATERIALIZED VIEW • CREATE MINING MODEL • CREATE MLE • CREATE PROCEDURE • CREATE SEQUENCE 開発者ロール Copyright © 2023, Oracle and/or its affiliates 25 • CREATE SESSION • CREATE SYNONYM • CREATE TABLE • CREATE TRIGGER • CREATE TYPE • CREATE VIEW • DEBUG CONNECT SESSION • EXECUTE DYNAMIC MLE • EXECUTE ON JAVASCRIPT • FORCE TRANSACTION • ON COMMIT REFRESH NEW IN 23c
  24. • 高コストなプランの一般的な理由を特定する • 計画を改善する可能性のあるアクションを推奨する SQL分析 Copyright © 2023, Oracle and/or

    its affiliates 27 SELECT s.* FROM sales s, products p WHERE s.prod_id = p.prod_id AND p.prod_category = 1 AND p.prod_subcategory != 'abc' UNION SELECT s.* FROM sales s, products p, customers c WHERE s.prod_id = p.prod_id AND s.quantity_sold > 100; ----------------------------------------------------------------- | Id | Operation | Name | ----------------------------------------------------------------- | 0 | SELECT STATEMENT | | | 1 | HASH UNIQUE | | | 2 | UNION-ALL | | |* 3 | HASH JOIN | | | 4 | JOIN FILTER CREATE | :BF0000 | |* 5 | TABLE ACCESS FULL | PRODUCTS | | 6 | JOIN FILTER USE | :BF0000 | | 7 | PARTITION RANGE ALL | | |* 8 | TABLE ACCESS FULL | SALES | | 9 | MERGE JOIN CARTESIAN | | | 10 | NESTED LOOPS SEMI | | | 11 | PARTITION RANGE ALL | | |* 12 | TABLE ACCESS FULL | SALES | |* 13 | INDEX UNIQUE SCAN | PRODUCTS_PK | | 14 | BUFFER SORT | | | 15 | BITMAP CONVERSION TO ROWIDS | | | 16 | BITMAP INDEX FAST FULL SCAN| CUSTOMERS_GENDER_BIX | ----------------------------------------------------------------- Predicate Information (identified by operation id): --------------------------------------------------- 3 - access("S"."PROD_ID"="P"."PROD_ID") 5 - filter(TO_NUMBER("P"."PROD_CATEGORY")=1 AND "P"."PROD_SUBCATEGORY"<>'abc') 8 - filter(SYS_OP_BLOOM_FILTER(:BF0000,"S"."PROD_ID")) 12 - filter("S"."QUANTITY_SOLD">100) 13 - access("S"."PROD_ID"="P"."PROD_ID") SQL Analysis Report (identified by operation id/Query Block Name/Object Alias): ------------------------------------------------------------------------------- 1 - SET$1 - The query block contains UNION which may be expensive. Consider using UNION ALL if duplicates are allowed or uniqueness is guaranteed. 5 - SEL$1 / "P"@"SEL$1" - The following columns have predicates which preclude their use as keys in index range scan. Consider rewriting the predicates. "PROD_CATEGORY" "PROD_SUBCATEGORY" 9 - SEL$2 - The query block has 1 cartesian product which may be expensive. Consider adding join conditions or removing the disconnected tables or views. NEW IN 23c UNIONより UNION ALL? index range scan 無効 条件書き換え推奨 クロス結合(直積) 解決推奨
  25. • SELECT は FROM DUAL を必要としなくなりました • DUAL テーブルは残り、引き続き使用もできます FROM句

    を使用しない SELECT Copyright © 2023, Oracle and/or its affiliates 28 SELECT SYSDATE; SYSDATE ------------------- 2022-09-21 22:18:52 SELECT 2*3 AS result; RESULT ------ 6 SELECT my_func(); MY_FUNC ------------ Hello World! NEW IN 23c
  26. PHONIC_ENCODE • 単語やフレーズを発音に基づいてコードに変換します。 • アルゴリズム: • Double Metaphone (DM) •

    Double Metaphone Alternative:いくつかのあいまいなケースに対応するために代替コードを使用します。 FUZZY_MATCH • テキスト的にどの程度似ているかを示すゲージを提供します。 • アルゴリズム: • Levenshtein: UTL_MATCH.EDIT_SIMILARITY/EDIT_DISTANCE に対応 • JARO_WINKLER: UTL_MATCH.JARO_WINKLER/JARO_WINKLER_SIMILARITY に対応 • BIGRAM • TRIGRAM • WHOLE_WORD_MATCH • LONGEST_COMMON_SUBSTRING 文字列一致 SQL 関数 Copyright © 2023, Oracle and/or its affiliates 29 NEW IN 23c
  27. 文字列一致 SQL 関数 Copyright © 2023, Oracle and/or its affiliates

    30 NEW IN 23c SELECT text, phonic_encode(DOUBLE_METAPHONE, a) AS DM, phonic_encode(DOUBLE_METAPHONE_ALT, a) AS DMA FROM ( VALUES ('Knight'), ('Night'), ('Right'), ('Sight'), ('foobar') ) t (text); TEXT DM DMA ------ --- --- Knight NT NT Night NT NT Right RT RT Sight ST ST foobar FPR FPR
  28. 文字列一致 SQL 関数 Copyright © 2023, Oracle and/or its affiliates

    31 NEW IN 23c SELECT text1, text2, fuzzy_match(LEVENSHTEIN, text1, text2) AS LEV, fuzzy_match(LEVENSHTEIN, text1, text2, UNSCALED) AS ULEV, fuzzy_match(JARO_WINKLER, text1, text2) AS JW, fuzzy_match(BIGRAM, text1, text2) AS BIG, fuzzy_match(BIGRAM, text1, text2) AS UBIG, fuzzy_match(TRIGRAM, text1, text2) AS TRIG, fuzzy_match(LONGEST_COMMON_SUBSTRING, text1, text2) AS LCS FROM ( VALUES ('kitten', 'sitten'), ('Apco Oil Lube 170’, 'Apco Oil Lube 347'), ('Apco Oii 2 l Lube 170', 'Apco Oil Lube 347') ) t (text1, text2); TEXT1 TEXT2 LEV ULEV JW BIG UBIG TRIG LCS ------------------ ----------------- --- ---- -- --- ---- ---- --- kitten sitten 84 1 88 80 80 75 83 Apco Oil Lube 170 Apco Oil Lube 347 83 3 95 81 81 80 82 Apco Oiil Lube 170 Apco Oil Lube 347 78 4 94 76 76 68 44
  29. • Before 23c CONCAT関数の引数は2つだけ シームレスな文字列連結 Copyright © 2023, Oracle and/or

    its affiliates 32 SELECT CONCAT(CONCAT(CONCAT('Hello', ' '), 'World'), '!') AS string; STRING ------------ Hello World! NEW IN 23c SELECT CONCAT('Hello', ' ', 'World', '!') AS string; STRING ------------ Hello World! • With 23c CONCAT関数で引数すべてを文字列結合できるように
  30. • GROUP BY句での詳細なエラー原因表示 エラーメッセージの大幅改善 Copyright © 2023, Oracle and/or its

    affiliates 33 SELECT country, state, SUM(revenue) FROM sales GROUP BY country; ERROR at line 1: ORA-00979: not a GROUP BY expression SELECT country, state, SUM(revenue) FROM sales GROUP BY country; ERROR at line 1: ORA-00979: "SALES"."STATE": must appear in the GROUP BY clause or be used in an aggregate function NEW IN 23c • GROUP BY句での詳細なエラー原因表示
  31. • 型変換エラーの具体的な情報 エラーメッセージの大幅改善 Copyright © 2023, Oracle and/or its affiliates

    34 SELECT TO_NUMBER('abc'); ERROR at line 1: ORA-01722: invalid number SELECT TO_NUMBER('abc'); ERROR at line 1: ORA-01722: unable to convert value 'abc' to a number NEW IN 23c • 型変換エラーの具体的な情報
  32. • 存在エラー時のスキーマ名、オブジェクト名情報表示 エラーメッセージの大幅改善 Copyright © 2023, Oracle and/or its affiliates

    35 SELECT foo FROM bar; ERROR at line 1: ORA-00942: table or view does not exist SELECT foo FROM bar; ERROR at line 1: ORA-00942: table or view ("GERALD"."BAR") does not exist NEW IN 23c • 存在エラー時のスキーマ名、オブジェクト名情報表示
  33. • リスナー存在エラー時のサービス名、ホスト名、ポート番号の情報表示 エラーメッセージの大幅改善 Copyright © 2023, Oracle and/or its affiliates

    36 sqlplus gerald@//localhost:1521/NOT_A_VALID_DB_NAME ORA-12514: TNS:listener does not currently know of service requested in connect descriptor sqlplus gerald@//localhost:1521/NOT_A_VALID_DB_NAME ORA-12514: Cannot connect to database. Service NOT_A_VALID_DB_NAME is not registered with the listener at host 127.0.0.1 port 1521. (CONNECTION_ID=6Th6GtlxLcHgUy5CRmQQGg==) NEW IN 23c • リスナー存在エラー時のサービス名、ホスト名、ポート番号の情報表示