Oracle REST Data Services(ORDS)あれこれ

PL/SQL Webアプリケーションを動かす

mod_plsql の代わりにORDSとPL/SQL Webツールキットを使ってWebアプリケーション作るメモ。

使っているバージョンは、2023/01/08 時点で最新の日本語マニュアルがある22.3。

OSはLinux(Oracle Linux 7)で、データベースは19c。

ちなみに21.4以前とはディレクトリ構成やインストール方法ががっつり変わっているらしいので、以前のバージョンでは全く参考にならないはず。

インストレーションおよび構成ガイド
Oracle REST Data Servicesをインストールおよび構成し、Oracle REST Data Servicesを使用するアプリケーションを開発する方法を説明します。

インストール

Java 11以上が必要なので、先にインストールしておく。今回はJava 17を使用。以下からrpmをダウンロードしてインストール。

Download the Latest Java LTS Free
Subscribe to Java SE and get the most comprehensive Java support available, with 24/7 global access to the experts.
# rpm -ivh /tmp/jdk-17_linux-x64_bin.rpm

ORDSのzipファイルを用意してインストール先ディレクトリに展開する。

$ mkdir -p /u01/app/ords
$ unzip -d /u01/app/ords /tmp/V1032368-01.zip

構成ファイルの格納先を作成する。今回はホームディレクトリ配下に適当なディレクトリを作る。

$ mkdir -p /home/oracle/ords_conf

対話モードでインストールを開始する。

$ export PATH=/u01/app/ords/bin:$PATH
$ ords --config /home/oracle/ords_conf install

プロンプトで聞かれるのは以下の内容。たいていはデフォルト値のままEnterで進めている。

  番号を入力して、インストールのタイプを選択します
    [1] データベースのORDSのインストールまたはアップグレードのみを実行する
    [2] データベース・プールを作成または更新して、データベースのORDSをインストール/アップグレードする
    [3] データベース・プールの作成または更新のみを実行する
  Choose [2]:
  番号を入力して、使用するデータベース接続タイプを選択します
    [1] 基本(ホスト名、ポート、サービス名)
    [2] TNS (TNS別名、TNSディレクトリ)
    [3] カスタム・データベースURL
  Choose [1]:
  データベース・ホスト名を入力 [localhost]: oradbs.dn.home
  データベースのリスニング・ポートを入力してください [1521]:
  データベース・サービス名を入力してください [db19]:
  管理者権限を持つデータベース・ユーザー名を指定します。
    管理者ユーザー名を入力してください: sys
  SYS AS SYSDBAのデータベース・パスワードを入力してください:
データベース・ユーザー: SYS AS SYSDBA URL: jdbc:oracle:thin:@//oradbs.dn.home:1521/db19に接続しています

情報の取得中.
  ORDS_METADATAおよびORDS_PUBLIC_USERのデフォルト表領域を入力してください [SYSAUX]:
  ORDS_METADATAおよびORDS_PUBLIC_USERの一時表領域を入力してください [TEMP]:
  番号を入力して、有効化する追加機能を選択します:
    [1] データベース・アクション(すべての機能を有効化)
    [2] REST対応SQLおよびデータベースAPI
    [3] REST対応SQL
    [4] データベースAPI
    [5] なし
  Choose [1]:
  番号を入力して、ORDSをスタンドアロン・モードで構成および起動します
    [1] ORDSをスタンドアロン・モードで構成および起動する
    [2] スキップ
  Choose [1]:
  番号を入力して、プロトコルを選択します
    [1] HTTP
    [2] HTTPS
  Choose [1]:
  HTTPポートを入力してください [8080]:

最終的に、以下のようにリスニング状態になる。

:
2023-01-08T12:31:14.030Z INFO        Oracle REST Data Services initialized
Oracle REST Data Services version : 22.3.3.r3111929
Oracle REST Data Services server info: jetty/10.0.12
Oracle REST Data Services java info: Java HotSpot(TM) 64-Bit Server VM 17.0.5+9-LTS-191

DB側の準備

ユーザとアプリケーションで使用するテーブルデータの作成。

create user testuser identified by testuser;
grant dba to testuser;
conn testuser/testuser

create table test (col1 number, col2 varchar(100));
insert into test values(1, 'TOYOTA');
insert into test values(2, 'HONDA');
insert into test values(3, 'NISSAN');
insert into test values(4, 'SUZUKI');
commit;

アプリケーション(HTMLページ)出力プロシージャの作成。

create or replace procedure html_page is
  now_sysdate date;
  cursor test_cur is select col1, col2 from test;
begin
  -- 現在日時取得
  select sysdate into now_sysdate from dual;
  
  -- HTML書き出し
  htp.print('<html>');
  htp.print('<head>');
  htp.print('<meta http-equiv="content-type" content="text/html">');
  htp.print('<title>title of the html file</title>');
  htp.print('</head>');
  htp.print('<body text="#000000" bgcolor="#ffffff">');
  htp.print('<p>現在日時:' || now_sysdate || '</p>');
  htp.print('<table border="1">');
  for test_rec in test_cur loop
    htp.print('<tr><td>' || test_rec.col1 || '</td><td>' || test_rec.col2 || '</td></tr>');
  end loop;
  htp.print('</table>');
  htp.print('</body>');
  htp.print('</html>');
end;
/

事前に実行するプロシージャの作成。

create or replace procedure pre_proc is
begin
  execute immediate 'alter session set nls_date_format=''YYYY-MM-DD HH24:MI:SS''';
end;
/

ORDS側の構成

構成ファイルのディレクトリにある、databases 配下に、アクセスするURLに対応するディレクトリを作成する。

今回は http://ホスト名:8080/ords/testpage/ にマッピングさせるため、以下のように作成。

$ mkdir /home/oracle/ords_conf/databases/testpage

作成したディレクトリ配下に、構成ファイルの pool.xml を作成して、以下のような記載を追加する。

特に、plsql.gateway.mode を指定しないと、PL/SQLゲートウェイとして機能してくれない。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd">
<properties>
<entry key="db.connectionType">basic</entry>
<entry key="db.hostname">oradbs.dn.home</entry>
<entry key="db.port">1521</entry>
<entry key="db.servicename">db19</entry>
<entry key="db.username">testuser</entry>
<entry key="db.password">testuser</entry>
<entry key="plsql.gateway.mode">direct</entry>
<entry key="procedure.preProcess">pre_proc</entry>
<entry key="jdbc.DriverType">thin</entry>
<entry key="jdbc.InitialLimit">3</entry>
<entry key="jdbc.MinLimit">1</entry>
<entry key="jdbc.MaxLimit">10</entry>
<entry key="jdbc.MaxStatementsLimit">10</entry>
<entry key="jdbc.InactivityTimeout">1800</entry>
<entry key="jdbc.statementTimeout">900</entry>
<entry key="jdbc.MaxConnectionReuseCount">1000</entry>
</properties>

起動中のORDSをCtrl+Cで停止して、再起動する。

$ ords --config /home/oracle/ords_conf serve

ブラウザで対象のURLを開いて、以下のように表示されれば成功。

コメント