⇧ amazing...
Oracle XML DBとは?
Oracleのドキュメントによりますと、
Oracle XML DBは、XMLデータの格納、生成、アクセス、検索、検証、変換、拡張および索引付けなどの高パフォーマンスの処理に関連する一連のOracle Databaseテクノロジです。SQLとXMLの両方のデータ・モデルの相互運用を可能にすることで、ネイティブなXMLサポートを提供します。
⇧ とのことで、Oracle Databaseの機能の1つのよう。
Oracle XML DBを使用すると、ローカルおよびリモートのXMLType
表やビューの形式で、XMLデータへのプロトコル・アクセスおよびプログラム・アクセスが可能になります。これにより、リソースのバージョニングとアクセス制御がWebDAVリポジトリに提供されます。
⇧ XMLTypeってのがXMLとやり取りできるものらしい。
XMLType
は、XMLデータの抽象ネイティブSQLデータ型です。これは、XMLType
インスタンスをVARCHAR2
、CLOB
、BLOB
またはBFILE
インスタンスから作成するためのPL/SQLおよびJavaコンストラクタを提供します。また、様々なXML操作用のPL/SQLメソッドも提供します。
他のSQLデータ型と同じようにXMLType
を使用できます。たとえば、XMLType
表やビュー、またはリレーショナル表にXMLType
列を作成できます。
⇧ ということで、Databaseのデータ型の1つみたい。
2022年12月6日(火)追記:↓ ここから
XML databaseってソフトウェアシステムが存在するらしく、
An XML database is a data persistence software system that allows data to be specified, and sometimes stored, in XML format. This data can be queried, transformed, exported and returned to a calling system. XML databases are a flavor of document-oriented databases which are in turn a category of NoSQL database.
⇧ NoSQLにカテゴライズされるそうな。
よく分からんけど、
XML-enabled databases
XML-enabled databases typically offer one or more of the following approaches to storing XML within the traditional relational structure:
RDBMS that support the ISO XML Type are:
- IBM DB2 (pureXML)
- Microsoft SQL Server
- Oracle Database
- PostgreSQL
⇧ RDBMSでも、ISOのXML Typeをサポートしてるものがあるらしく、その1つとしてOracle Databaseがあるということのようです。
2022年12月6日(火)追記:↑ ここまで
Oracle Databaseの機能の1つOracle XML DBでXMLを扱ってみる
Database Configuration Assistant (DBCA)を使用し、汎用テンプレートを使用してOracle Databaseを構築すると、Oracle XML DBが自動的にインストールされます。
⇧ Oracle Databaseを普通にインストールしていれば、同梱されてるらしい。
機能が有効になってるかは、
Oracle XML DBがすでにインストールされているかどうかは、自分で判断できます。次の条件に当てはまる場合は、インストールされています。
-
データベース・スキーマ(ユーザー・アカウント)
XDB
が存在する。確認するには、次の問合せを実行します。
SELECT * FROM ALL_USERS;
-
ビュー
RESOURCE_VIEW
が存在する。確認するには、次のコマンドを使用します。
DESCRIBE RESOURCE_VIEW
⇧ で確認できますと。
確認してみた。
⇧ おそらく、有効になってるっぽい。
ということで、
⇧ 上記サイト様を参考にOracle XML DBを使ってみる。
テーブルを作成したら、PDBになっているのを確認して、
データをINSERT。テーブル名の前にスキーマが必要でした。
データがINSERTされてるのが確認できました。
そしたらば、Java側で取得しますが、
⇧ 依存関係が追加で必要っぽい。
Maven Repsoitoryで、
https://mvnrepository.com/artifact/com.oracle.database.xml
⇧ Xdb6ってのを選択していく感じになります、更新が止まってるっぽいですが...。
プロジェクトは、
⇧ 上記の記事で作成したものを利用していきます。
依存関係を追加で。
■/oracle-db-example/build.gradle
plugins { id 'java' id 'org.springframework.boot' version '2.7.5' id 'io.spring.dependency-management' version '1.0.15.RELEASE' } group = 'com.example' version = '0.0.1-SNAPSHOT' sourceCompatibility = '11' configurations { compileOnly { extendsFrom annotationProcessor } } repositories { mavenCentral() } dependencies { implementation 'org.springframework.boot:spring-boot-starter-data-jpa' implementation 'org.springframework.boot:spring-boot-starter-thymeleaf' implementation 'org.springframework.boot:spring-boot-starter-web' compileOnly 'org.projectlombok:lombok' developmentOnly 'org.springframework.boot:spring-boot-devtools' runtimeOnly 'com.oracle.database.jdbc:ojdbc11' // https://mvnrepository.com/artifact/com.oracle.ojdbc/xdb // implementation group: 'com.oracle.ojdbc', name: 'xdb', version: '19.3.0.0' // https://mvnrepository.com/artifact/com.oracle.database.xml/xdb // implementation group: 'com.oracle.database.xml', name: 'xdb', version: '21.7.0.0' // https://mvnrepository.com/artifact/com.oracle/xmlparserv2 // implementation group: 'com.oracle', name: 'xmlparserv2', version: '12.2.0.1' // implementation 'com.oracle.database.xml:xmlparserv2:19.16.0.0' // https://mvnrepository.com/artifact/com.oracle.database.xml/xdb6 implementation group: 'com.oracle.database.xml', name: 'xdb6', version: '18.3.0.0' annotationProcessor 'org.projectlombok:lombok' testImplementation 'org.springframework.boot:spring-boot-starter-test' } tasks.named('test') { useJUnitPlatform() }
変更は無いけど、データベースの接続設定を掲載。
■/oracle-db-example/src/main/resources/application.properties
# DB接続情報 spring.datasource.url=jdbc:oracle:thin:@//localhost:1519/orcldb_19c spring.datasource.username=ts0818 spring.datasource.password=password spring.datasource.driverClassName=oracle.jdbc.driver.OracleDriver
⇧ ご自身の環境のものに合わせてください。
そしたらば、Javaのファイルを追加で。
■/oracle-db-example/src/main/java/com/example/demo/entity/PurchaseOrder.java
package com.example.demo.entity; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.Id; import javax.persistence.Table; import lombok.Data; @Data @Entity @Table(name="purchaseorder") public class PurchaseOrder { @Id @Column(name="po_number") private Long poNumber; @Column(name="po_details", columnDefinition="XMLTYPE") private String poDetails; }
■/oracle-db-example/src/main/java/com/example/demo/repository/PurchaseOrderRepository.java
package com.example.demo.repository; import org.springframework.data.jpa.repository.JpaRepository; import com.example.demo.entity.PurchaseOrder; public interface PurchaseOrderRepository extends JpaRepository<PurchaseOrder, Long> { }
■/oracle-db-example/src/main/java/com/example/demo/service/PurchaseOrderServiceImpl.java
package com.example.demo.service; import java.util.List; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import com.example.demo.entity.PurchaseOrder; import com.example.demo.repository.PurchaseOrderRepository; @Service public class PurchaseOrderServiceImpl { @Autowired private PurchaseOrderRepository purchaseOrderRepository; public List<PurchaseOrder> findAll() { return purchaseOrderRepository.findAll(); } }
■/oracle-db-example/src/main/java/com/example/demo/rest_controller/PurchaseOrderController.java
package com.example.demo.rest_controller; import java.util.List; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import com.example.demo.entity.PurchaseOrder; import com.example.demo.service.PurchaseOrderServiceImpl; @RestController @RequestMapping("purchase-order") public class PurchaseOrderController { @Autowired private PurchaseOrderServiceImpl purchaseOrderServiceImpl; @GetMapping("find-all") public List<PurchaseOrder> findAll() { return purchaseOrderServiceImpl.findAll(); } }
で、実行して、
ブラウザから、RestControllerのメソッドのエンドポイントにアクセスすると、
⇧ Oracle Database側でXMLType型のカラムの値も取得できているようです。
ただ、Java側では文字列として取得してしまっているので、XMLType型の値をどうやってXML(Extensible Markup Language)として扱うかですが、
⇧ 上記サイト様で変換してらっしゃいました。
毎度モヤモヤ感が半端ない...
今回はこのへんで。