Autonomous Database: Autonomous Databaseで生成されたPAR URLに対する外部表を作成してみた

# はじめに
Autonomous Databaseでは、表やクエリに対してPAR URLを生成して外部に公開できます。

https://docs.oracle.com/ja-jp/iaas/autonomous-database-serverless/doc/autonomous-preauthenticated-request-url.html

Autonomous Databaseの新機能として、この生成したPAR URLに対して外部表を作成できるようになったので、その手順と動作を検証してみました。

# 1. 表に対するPAR URLの生成

Autonomous Databaseに接続します。
このAutonomous Databaseは東京リージョン（ap-tokyo-1）にあります。
```
[oracle@oracle23ai ~]$ sqlplus admin/Demo#1Demo#1@atp23aitokyo

SQL*Plus: Release 23.0.0.0.0 - Production on Fri Feb 7 07:54:39 2025
Version 23.4.0.24.05

Copyright (c) 1982, 2024, Oracle.  All rights reserved.

Last Successful login time: Thu Feb 06 2025 23:05:33 +09:00

Connected to:
Oracle Database 23ai Enterprise Edition Release 23.0.0.0.0 - Production
Version 23.7.0.25.02

SQL>
```

PAR URL生成の対象となる表の構造を確認します。
ここでは、movieという表に対してPAR URLを生成します。
```
SQL> desc movie
 Name					                   Null?    Type
 ----------------------------------------- -------- ----------------------------
 MOVIE_ID				                   NOT NULL NUMBER(38)
 TITLE						                        VARCHAR2(100)
 RELEASE_DATE					                    DATE
 GENRE						                        VARCHAR2(50)
 DIRECTOR_ID					                    NUMBER(38)

SQL>
```

PAR URL生成の対象となる表の内容を確認します。
```
SQL> col title for a25
SQL> col genre for a20
SQL> SELECT * FROM movie;

  MOVIE_ID TITLE		             RELEASE_D GENRE		        DIRECTOR_ID
---------- ------------------------- --------- -------------------- -----------
	     1 The Proposal 	         01-JAN-09 Romance			              3
	     2 The Hangover 	         05-JUN-09 Comedy			              2
	     3 Inglourious Basterds      21-AUG-09 War			                  4
	     4 Up in the Air	         04-DEC-09 Drama			              5
	     5 District 9		         14-AUG-09 Science Fiction		          1

SQL> 
```

DBMS_DATA_ACCESS.GET_PREAUTHENTICATED_URLプロシージャを使用して、表に対するPAR URLを作成します。

DBMS_DATA_ACCESS.GET_PREAUTHENTICATED_URLプロシージャの詳細は、こちらのマニュアルに記載があります。

https://docs.oracle.com/ja-jp/iaas/autonomous-database-serverless/doc/dbms-data-access.html#GUID-8786637C-FBA3-4B7A-A1BF-DD652B2C67D0

```
SQL> set serveroutput on
SQL> DECLARE
  2      status CLOB;
  3  BEGIN
  4      DBMS_DATA_ACCESS.GET_PREAUTHENTICATED_URL(
  5          schema_name => 'ADMIN',
  6          schema_object_name => 'MOVIE',
  7          service_name => 'HIGH',
  8          result => status
  9      );
 10      DBMS_OUTPUT.PUT_LINE(status);
 11  END;
 12  /
{"status":"SUCCESS","id":"EfoLtHT73g_UgD2YJ5Uv5PTLPts6CRJoiTHS6_3ul6_TsQiGrQUYCy
4wjvYEpyL1","preauth_url":"https://dataaccess.adb.ap-tokyo-1.oraclecloudapps.com
/adb/p/2e6uaFy2AyQ7WjKcAVx9yfI3KoTlxT8_Lgi6M_Iqn_k6xIdX68Hs6lbJ2lm19OmwjUpw9hsSg
7M/data","expiration_ts":"2025-05-19T23:08:20.167Z","expiration_count":null}

PL/SQL procedure successfully completed.

SQL>
```
表示された実行結果内のpreauth_urlの値が、生成されたPAR URLです。

また、expiration_tsがPAR URLの有効期限（デフォルトは生成から90日間）です。
なお、PAR URLの有効期限は、DBMS_DATA_ACCESS.EXTEND_URLプロシージャで延長することができます。

https://docs.oracle.com/ja-jp/iaas/autonomous-database-serverless/doc/dbms-data-access.html#GUID-255F15A9-6C5A-4D78-BA4C-E5CD56F82684

curlコマンドで生成されたPAR URLにアクセスしてみます。
```
[opc@oracle23ai ~]$ curl https://dataaccess.adb.ap-tokyo-1.oraclecloudapps.com/adb/p/2e6uaFy2AyQ7WjKcAVx9yfI3KoTlxT8_Lgi6M_Iqn_k6xIdX68Hs6lbJ2lm19OmwjUpw9hsSg7M/data
{"items":[{"MOVIE_ID":1,"TITLE":"The Proposal","RELEASE_DATE":"2009-01-01T00:00:00","GENRE":"Romance","DIRECTOR_ID":3},{"MOVIE_ID":2,"TITLE":"The Hangover","RELEASE_DATE":"2009-06-05T00:00:00","GENRE":"Comedy","DIRECTOR_ID":2},{"MOVIE_ID":3,"TITLE":"Inglourious Basterds","RELEASE_DATE":"2009-08-21T00:00:00","GENRE":"War","DIRECTOR_ID":4},{"MOVIE_ID":4,"TITLE":"Up in the Air","RELEASE_DATE":"2009-12-04T00:00:00","GENRE":"Drama","DIRECTOR_ID":5},{"MOVIE_ID":5,"TITLE":"District 9","RELEASE_DATE":"2009-08-14T00:00:00","GENRE":"Science Fiction","DIRECTOR_ID":1}],"hasMore":false,"limit":1000,"offset":0,"count":5,"links":[{"rel":"self","href":"https://dataaccess.adb.ap-tokyo-1.oraclecloudapps.com/adb/p/2e6uaFy2AyQ7WjKcAVx9yfI3KoTlxT8_Lgi6M_Iqn_k6xIdX68Hs6lbJ2lm19OmwjUpw9hsSg7M/data"}]}
[opc@oracle23ai ~]$ 
```
PAR URLにアクセスすると、movie表の内容がJSON形式で返されることがわかります。

# 2. PAR URLに対する外部表の作成

Autonomous Databaseに接続します。
このAutonomous Databaseは大阪リージョン（ap-osaka-1）にあります。
```
[oracle@oracle23ai admin]$ sqlplus admin/Demo#1Demo#1@atp23aiosaka

SQL*Plus: Release 23.0.0.0.0 - Production on Wed Feb 19 08:11:50 2025
Version 23.4.0.24.05

Copyright (c) 1982, 2024, Oracle.  All rights reserved.


Connected to:
Oracle Database 23ai Enterprise Edition Release 23.0.0.0.0 - Production
Version 23.7.0.25.02

SQL>
```

DBMS_CLOUD.CREATE_EXTERNAL_TABLEプロシージャを使用して、PAR URLに対する外部表を作成します。
table_nameには作成する外部表の名前を、file_uri_listにはPAR URLを指定します。
```
SQL> BEGIN
  2      DBMS_CLOUD.CREATE_EXTERNAL_TABLE(
  3          table_name => 'ext_tab_parurl_movie',
  4          file_uri_list => 'https://dataaccess.adb.ap-tokyo-1.oraclecloudapps.com/adb/p/2e6uaFy2AyQ7WjKcAVx9yfI3KoTlxT8_Lgi6M_Iqn_k6xIdX68Hs6lbJ2lm19OmwjUpw9hsSg7M/data'
  5      );
  6  END;
  7  /

PL/SQL procedure successfully completed.

SQL>
```
PAR URLに対する外部表が作成できました。

作成したPAR URLを元にした外部表の構造を確認します。

```
SQL> desc ext_tab_parurl_movie
 Name					                   Null?    Type
 ----------------------------------------- -------- ----------------------------
 MOVIE_ID					                        NUMBER
 TITLE						                        VARCHAR2(100)
 RELEASE_DATE					                    DATE
 GENRE						                        VARCHAR2(50)
 DIRECTOR_ID					                    NUMBER

SQL>
```

作成したPAR URLを元にした外部表の内容を確認します。
```
SQL> col title for a25
SQL> col genre for a20
SQL> SELECT * FROM ext_tab_parurl_movie;

  MOVIE_ID TITLE		             RELEASE_D GENRE		        DIRECTOR_ID
---------- ------------------------- --------- -------------------- -----------
	     1 The Proposal 	         01-JAN-09 Romance			              3
	     2 The Hangover 	         05-JUN-09 Comedy			              2
	     3 Inglourious Basterds      21-AUG-09 War			                  4
	     4 Up in the Air	         04-DEC-09 Drama			              5
	     5 District 9		         14-AUG-09 Science Fiction		          1

SQL>
```

PAR URLを元にした外部表を作成して、別のリージョンにあるAutonomous Databaseの表に簡単にアクセスできることが確認できました。

# 参考情報
・[Query Data that Uses Pre-Authenticated Request (PAR) URL Source](https://docs.oracle.com/en/cloud/paas/autonomous-database/serverless/adbsb/query-external-par-url.html#GUID-DD2DF5FD-E0B0-4F61-943A-3B9745DFB506)
・[DBMS_CLOUD.CREATE_EXTERNAL_TABLEプロシージャ](https://docs.oracle.com/en/cloud/paas/autonomous-database/serverless/adbsb/dbms-cloud-subprograms.html#GUID-2AFBEFA4-992E-4F53-96DB-F560084C7DA9)
・[DBMS_DATA_ACCESS.GET_PREAUTHENTICATED_URLプロシージャ](https://docs.oracle.com/en/cloud/paas/autonomous-database/serverless/adbsb/dbms-data-access.html#GUID-8786637C-FBA3-4B7A-A1BF-DD652B2C67D0)
・[DBMS_DATA_ACCESS.EXTEND_URLプロシージャ](https://docs.oracle.com/en/cloud/paas/autonomous-database/serverless/adbsb/dbms-data-access.html#GUID-255F15A9-6C5A-4D78-BA4C-E5CD56F82684)