PL/SQL Webアプリケーションを動かす
mod_plsql の代わりにORDSとPL/SQL Webツールキットを使ってWebアプリケーション作るメモ。
使っているバージョンは、2023/01/08 時点で最新の日本語マニュアルがある22.3。
OSはLinux(Oracle Linux 7)で、データベースは19c。
ちなみに21.4以前とはディレクトリ構成やインストール方法ががっつり変わっているらしいので、以前のバージョンでは全く参考にならないはず。
インストール
Java 11以上が必要なので、先にインストールしておく。今回はJava 17を使用。以下からrpmをダウンロードしてインストール。
# 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を開いて、以下のように表示されれば成功。
コメント