LoginSignup
3

More than 3 years have passed since last update.

posted at

updated at

Oracle FunctionsでAPEXのRestful Serviceと連携

Oracle Functionsって?という方はこちら

Oracle FunctionsでORDSのRESTfulサービスで定義されているRest Endpointと連携することができます。
なので自作したOracle Application Express (APEX)アプリのRestful Serviceと連携、そこから更に他のツールと連携することも可能という事です。

今回Oracle Functionsで、APEXのRestful Dataを操作してみます。

前提

・ATP(Autonomous Transaction Processing)をプロビジョニング
 ⇒arakiatptestというDB名にしています。
・ATPからOracle APEXをセットアップし自身のワークスペースを作成していること。
 ⇒testworkspaceというワークスペース名にしています。
・Oracle Functions開発、実行環境が構築されていること。
 ⇒・Oracle Functionsセットアップ

※こちらの手順で作成したATPは検証後、削除します。

APEX Restful Service設定

APEXログイン後、SQLワークショップ >RESTfulサービスより
「Register Schema to ORDS」 をクリック(新しいワークスペースの場合スキーマをORDSに登録する必要があります)。
キャプチ.PNG

スキーマ属性の保存

Schema Aliasに任意のスキーマ名を入れて「Save Schema Attributes」をクリック(ここではtestworkspaceという名前)。
キャプチ2.PNG

ORDS RESTfulサービスページが表示されます。
キャプチャ.PNG

Oracle APEXにプレインストールされたサンプルサービス「oracle.example.hr」
は従業員情報のリソースが提供されており、実体はjsonファイルとして格納されています。
これをエンドポイントを利用してOracle Funcitonsと連携し、操作することにします。

実際の中身を見てみます。
キャプチャ3.PNG
例えばサンプル内"employees"というテンプレート情報の"GET"ハンドラーには、
記載されたFull URL(RESTエンドポイント)でGETを実行した際のPL/SQLが記載されています。

ここでは、全従業員情報を取得するためのFULL URL(RESTエンドポイント)は以下となっています。
https://vhawxpz0akgqjtj-arakiatptest.adb.us-phoenix-1.oraclecloudapps.com/ords/testworkspace/hr/employees/

これを分割して詳しく説明すると、
インスタンス固有部分 ⇒ vhawxpz0akgqjtj-arakiatptest.adb.us-phoenix-1.oraclecloudapps.com
APEXワークスペース名 ⇒ testworkspace
残りのパスパラメータ ⇒ hr/employees/

Oracle Functions実行

必要なリソースを準備

今回は以下を使用します。
https://github.com/abhirockzz/fn-atp-ords-sample

ファンクション開発環境にてソースをクローン

git clone https://github.com/abhirockzz/fn-atp-ords-sample
cd fn-atp-ords-sample

エンドポイント設定

vi app.yaml
※以下編集。ORDS_REST_SERVICE_ENDPOINTに先ほどFull URL属性に記載されていた部分を記載します。
[変更前]
name: fn-atp-ords
config:
  ORDS_REST_SERVICE_ENDPOINT: <TO_BE_FILLED><img width="462" alt="キャプチャ1.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/131627/7a5683c3-2b95-64b5-f076-19a083bb0743.png">

[変更後]
※エンドポイントのURLは/hr/まででOKです。
name: fn-atp-ords
config:
  ORDS_REST_SERVICE_ENDPOINT: https://vhawxpz0akgqjtj-arakiatptest.adb.us-phoenix-1.oraclecloudapps.com/ords/testworkspace/hr/

OCIコンソールでPhoenixリージョン、Oracle Functionsの画面に遷移します。
https://console.us-phoenix-1.oraclecloud.com/functions
Create Applicationより
キャプチャ1.PNG
NAME: fn-atp-ords
VCN: Fn用に作成したVCN
SUBNETS: PHX-AD-1から3まで選択
上記で「create」を押します。

ファンクションのデプロイ

fn list apps
※作成したファンクションが表示されます
NAME            ID
fn-atp-ords     ocid1.fnapp.oc1.xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

デプロイ(全ての起動をデプロイするコマンド)
fn -v deploy --all

Rest Dataの操作

全従業員を表示(jqで整えてます)
fn invoke fn-atp-ords read-emps | jq

{
  "items": [
    {
      "uri": {
        "$ref": "https://vhawxpz0akgqjtj-arakiatptest.adb.us-phoenix-1.oraclecloudapps.com/ords/testworkspace/hr/employees/7369"
      },
      "rn": 1,
      "empno": 7369,
      "ename": "SMITH",
      "job": "CLERK",
      "hiredate": "1980-12-17T00:00:00Z",
      "mgr": 7902,
      "sal": 800,
      "comm": null,
      "deptno": 20
    }
…(以下省略)

IDで該当する従業員を取得
echo -n '7654' | fn invoke fn-atp-ords read-emps | jq
{
  "empno": 7654,
  "ename": "MARTIN",
  "job": "SALESMAN",
  "mgr": 7698,
  "hiredate": "1981-09-28T00:00:00Z",
  "sal": 1500,
  "comm": 1400,
  "deptno": 30
}

Employeeのレコードを更新(7654)
echo -n '{"empno":7654,"ename":"ARAKI","job":"ENGINEER","mgr":7698,"hiredate":"1981-09-28T00:00:00Z","sal":1500,"comm":1400,"deptno":30}' | fn invoke fn-atp-ords update-emps

更新確認
echo -n '7654' | fn invoke fn-atp-ords read-emps | jq
{
  "empno": 7654,
  "ename": "ARAKI",
  "job": "ENGINEER",
  "mgr": 7698,
  "hiredate": "1981-09-28T00:00:00Z",
  "sal": 1500,
  "comm": 1400,
  "deptno": 30
}

Oracle FunctionsでORDSのREST Endpointを利用しOracleツールと連携すれば、かなり色々な使い方ができると思いました。

関連記事

・Oracle Functionsに関するメモ
・Oracle Functionsセットアップ
・Oracle FunctionsでTensorFlowによる画像分類
・Oracle FunctionsでEmail Deliveryと連携しメール送信
・Oracle FunctionsでObject Storage操作 (テキストを格納・取得+テキストをPDFに変換)
・Fn Project - Fn Server構築 (Oracle Linux7.6)
・Oracle FunctionsでOCI Go SDKを使いインスタンス操作

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
What you can do with signing up
3