Oracle Databaseの機能の1つOracle XML DBでXMLを扱ってみる

nazology.net

⇧ amazing...

Oracle XML DBとは?

Oracleのドキュメントによりますと、

docs.oracle.com

Oracle XML DBは、SQLXMLの両方のデータ・モデルの相互運用を可能にすることで、Oracle DatabaseにネイティブなXMLサポートを提供します。

https://docs.oracle.com/cd/F19136_01/adxdb/intro-to-XML-DB.html#GUID-A8E97BAC-3685-46C8-8FD9-3D31D36F9344

Oracle XML DBは、XMLデータの格納、生成、アクセス、検索、検証、変換、拡張および索引付けなどの高パフォーマンスの処理に関連する一連のOracle Databaseテクノロジです。SQLXMLの両方のデータ・モデルの相互運用を可能にすることで、ネイティブなXMLサポートを提供します。

https://docs.oracle.com/cd/F19136_01/adxdb/intro-to-XML-DB.html#GUID-A8E97BAC-3685-46C8-8FD9-3D31D36F9344

⇧ とのことで、Oracle Databaseの機能の1つのよう。

Oracle XML DBのアーキテクチャの説明を見ると、

Oracle XML DBを使用すると、ローカルおよびリモートのXMLType表やビューの形式で、XMLデータへのプロトコル・アクセスおよびプログラム・アクセスが可能になります。これにより、リソースのバージョニングとアクセス制御がWebDAVリポジトリに提供されます。

https://docs.oracle.com/cd/F19136_01/adxdb/intro-to-XML-DB.html#GUID-43B25825-FE37-4782-B627-8B2EFB44068D

⇧ XMLTypeってのがXMLとやり取りできるものらしい。

XMLTypeは、XMLデータの抽象ネイティブSQLデータ型です。これは、XMLTypeインスタンスVARCHAR2CLOBBLOBまたはBFILEインスタンスから作成するためのPL/SQLおよびJavaコンストラクタを提供します。また、様々なXML操作用のPL/SQLメソッドも提供します。

https://docs.oracle.com/cd/F19136_01/adxdb/intro-to-XML-DB.html#GUID-02592188-AC38-4D00-A2FD-9E53604065C8

他のSQLデータ型と同じようにXMLTypeを使用できます。たとえば、XMLType表やビュー、またはリレーショナル表にXMLType列を作成できます。

https://docs.oracle.com/cd/F19136_01/adxdb/intro-to-XML-DB.html#GUID-02592188-AC38-4D00-A2FD-9E53604065C8

⇧ ということで、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.

https://en.wikipedia.org/wiki/XML_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:

  1. XML is stored into a CLOB (Character large object)
  2. XML is `shredded` into a series of Tables based on a Schema
  3. XML is stored into a native XML Type as defined by ISO Standard 9075-14

https://en.wikipedia.org/wiki/XML_database

RDBMSでも、ISOのXML Typeをサポートしてるものがあるらしく、その1つとしてOracle Databaseがあるということのようです。

2022年12月6日(火)追記:↑ ここまで

Oracle Databaseの機能の1つOracle XML DBでXMLを扱ってみる

Oracle XML DBの機能については、

Database Configuration Assistant (DBCA)を使用し、汎用テンプレートを使用してOracle Databaseを構築すると、Oracle XML DBが自動的にインストールされます。

https://docs.oracle.com/cd/F19136_01/adxdb/getting-started-with-XML-DB.html#GUID-B91CBF9E-A699-4A65-A085-C2AAA430FA5D

Oracle Databaseを普通にインストールしていれば、同梱されてるらしい。

機能が有効になってるかは、

Oracle XML DBがすでにインストールされているかどうかは、自分で判断できます。次の条件に当てはまる場合は、インストールされています。

  • データベース・スキーマ(ユーザー・アカウント)XDBが存在する。確認するには、次の問合せを実行します。

SELECT * FROM ALL_USERS;
  •  ビューRESOURCE_VIEWが存在する。確認するには、次のコマンドを使用します。

DESCRIBE RESOURCE_VIEW

https://docs.oracle.com/cd/F19136_01/adxdb/getting-started-with-XML-DB.html#GUID-B91CBF9E-A699-4A65-A085-C2AAA430FA5D

⇧ で確認できますと。

確認してみた。

⇧ おそらく、有効になってるっぽい。

ということで、

tech-oracle.blog.ss-blog.jp

⇧ 上記サイト様を参考にOracle XML DBを使ってみる。

テーブルを作成したら、PDBになっているのを確認して、

データをINSERT。テーブル名の前にスキーマが必要でした。

データがINSERTされてるのが確認できました。

そしたらば、Java側で取得しますが、

stackoverflow.com

github.com

⇧ 依存関係が追加で必要っぽい。

Maven Repsoitoryで、

https://mvnrepository.com/artifact/com.oracle.database.xml

⇧ Xdb6ってのを選択していく感じになります、更新が止まってるっぽいですが...。

プロジェクトは、

ts0818.hatenablog.com

⇧ 上記の記事で作成したものを利用していきます。

依存関係を追加で。

■/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)として扱うかですが、

mkyong.com

⇧ 上記サイト様で変換してらっしゃいました。

毎度モヤモヤ感が半端ない...

今回はこのへんで。