ラベル SDW の投稿を表示しています。 すべての投稿を表示
ラベル SDW の投稿を表示しています。 すべての投稿を表示

2025年4月22日火曜日

ローカルのOracle APEXのSQLワークショップにSQL Developer Webを組み込む

Oracle REST Data Services 25.1のリリース・ノートのDeprecation Noticeに、以下が記載されています。Oracle APEXがSQLワークショップの機能のひとつとして提供しているRESTfulサービスが非推奨になり、SQL Developer Webが推奨ツールになります。

Oracle REST Data Services 25.1
Release Notes
Version 25.1.0.100.1652
Date: April 2025
Deprecation Notice 
The RESTful Services area of the SQL Workshop for building and managing ORDS REST APIs in APEX has been deprecated. The recommended web interface for managing your ORDS REST APIs is Database Actions, also known as, SQL Developer Web.

Oracle APEXのSQLワークショップの以下のメニューに当たります。


Autonomous DatabaseではデフォルトでSQLワークショップSQL Developer Webが含まれています。そのため、スキーマがREST有効化ずみであれば、そのままSQL Developer Webを開くことができます。


ローカルのデータベースにインストールしたOracle APEXでは、SQLワークショップにSQL Developer Webを含めるには追加の設定が必要です。

デフォルトではSQLワークショプSQL Developer Webのメニューはありません。


以下よりSQLワークショップSQL Developer Webを追加する手順を紹介します。

手順はドキュメントの以下に説明されています。

Oracle APEX SQLワークショップ・ガイド Release 24.1
7 RESTfulサービスを使用したデータ交換の有効化
7.9 APEXからSQL Developer Webへの直接アクセス

ドキュメントでは「メニュー・オプションを有効にするための要件」として、「Oracle REST Data Servicesリリース23.1.0 (HTTPSモードで実行)。」とありますが、HTTPでも構成できました。恐らく、ドキュメントに最近の設定が反映されていないと思われます。

設定はAPEXの管理サービスより行います。

管理サービスにサインインし、インスタンスの設定機能構成を開きます。


機能構成SQLワークショップのセクションにあるSQL Developer Webの有効化はいに変更します。

変更の適用をクリックします。


変更が保存されると、SQLワークショップのメニューにSQL Developer Webが含まれるようになります。


開発ツールに戻ってSQLワークショップを確認します。SQL Developer Webが含まれています。


SQL Developer Webを開こうとすると、ワークスペース・スキーマの選択を求められます。

ダイアログに記載されているように、SQLワークショップからSQL Developer Webを直接開くには、APEXのスキーマがあらかじめREST対応REST有効化ともいいます)になっている必要があります。


Oracle APEXではRESTfulサービスを開き、ORDSにスキーマを登録を実行することで、スキーマをREST対応にすることができました。


Oracle APEXのRESTfulサービスが非推奨ということは、この画面も非推奨になります。

Autonomous Databaseの場合は管理者ユーザーADMINでSQL Developer Webに接続し、ユーザーの編集画面から、REST有効化、無効化を設定できます。

以下のユーザー編集画面のWebアクセスオンに切り替えることで、そのスキーマでRESTサービスの呼び出しを受付ができるようになります。REST別名については、スキーマがAPEXで使用されていて名前がWKSP_で始まる場合は、WKSP_以降の文字列を小文字で設定します。


ローカルにインストールしたOracle APEXの場合、Autonomous Databaseとは異なり、SQL Developer Webに管理者ユーザーでサインインするには追加の設定が必要です。追加の設定については、以前の記事「ローカル環境のSQL Developer Webの管理者ユーザーを作成する」で紹介しています。SQL Developer Webに管理者ユーザーでアクセスできるように構成した後はAutonomous Databaseと同様に、SQL Developer WebよりRESTを有効にできます。

以下はユーザーPDBADMINにDBAロールを割り当て、SQL Developer Webにサインインしています。ORDS 25.1よりダーク・モードがサポートされています。


この他の方法として、管理者ユーザー(SYS)でORDS_ADMIN.ENABLE_SCEMAを呼び出す、または対象スキーマでORDS.ENABLE_SCHEMAを呼び出す方法があります。プロシージャの引数などは同じなので、今回は管理者ユーザーで実行してみます。
begin
ords_admin.enable_schema(
p_enabled => true,
p_schema => 'スキーマ名',
p_url_mapping_pattern => 'ORDS別名'
);
end;
/

SQL> begin

  2  ords_admin.enable_schema(

  3  p_enabled => true,

  4  p_schema => 'WKSP_APEXDEV',

  5  p_url_mapping_pattern => 'apexdev'

  6  );

  7  end;

  8* /


PL/SQLプロシージャが正常に完了しました。


SQL> commit;


コミットが完了しました。


SQL> 


以上の設定で、ローカルのOracle APEXのSQLワークショップよりSQL Developer Webを開いて、REST開発ツールを利用できるようになります。


必須ではありませんが、APEXの管理サービスのインスタンスの管理/機能構成RESTのセクションに含まれるRESTfulサービスを有効にするいいえにすると、SQLワークショップよりRESTfulサービスが除かれます。


以下のようにSQLワークショップからRESTfulサービスが除かれます。


Oracle APEXの管理サービスの代わりに、パッケージAPEX_INSTANCE_ADMINのSET_PARAMETERを呼び出してSQL Developer Webの有効化オンにするには、パラメータALLOW_SQL_DEVELOPER_WEBを設定します。

APIリファレンスのAvailable Parameter Valuesには、なぜか含まれていなかったので、ビューAPEX_INSTANCE_PARAMETERSを検索して確認しています。

SQL> select * from apex_instance_parameters where name like '%SQL%';


NAME                          VALUE     CREATED_ON    LAST_UPDATED_ON    

_____________________________ _________ _____________ __________________ 

ALLOW_SQL_DEVELOPER_WEB       Y         25-04-21      25-04-21           

ENABLE_TRANSACTIONAL_SQL      N         25-04-21      25-04-21           

PLSQL_EDITING                 Y         25-04-21      25-04-21           

SQL_SCRIPT_MAX_OUTPUT_SIZE    200000    25-04-21      25-04-21           

DG_ALLOW_SQL_DATA_SOURCES     Y         25-04-21      25-04-21           

SQL_COMMAND_MAX_INACTIVITY    60        25-04-21      25-04-21           


6行が選択されました。 


SQL> 


RESTfulサービスSQLワークショップから除くには、パラメータRESTFUL_SERVICES_ENABLEDNにします。

SQL> select * from apex_instance_parameters where name like '%REST%';


NAME                                                           VALUE     CREATED_ON    LAST_UPDATED_ON    

______________________________________________________________ _________ _____________ __________________ 

RESTFUL_SERVICES_ENABLED                                       N         25-04-21      25-04-22           

DG_MAXIMUM_NUMBER_OF_ROWS_TO_RETRIEVE_FROM_REST_DATA_SOURCE    500000    25-04-21      25-04-21           


SQL> 


Oracle REST Data Services 25.1より追加されたダーク・モードですが、ユーザーのプレファレンスより設定します。


テーマには(Light)、(Dark)、Same as browserの3つから選べます。


今回の記事は以上になります。

2021年3月15日月曜日

RESTデータ・ソースを使った高度な同期化(1) - REST API定義

 オラクルのCarsten Czarskiさんがブログ記事として、RESTデータ・ソースの同期化の使い方について解説しています。

https://blogs.oracle.com/apex/synchronize-parent-child-rest-sources

内容は以下になります。
  1. サンプル・データセットのEMP/DEPTを使って、REST APIを作る。
  2. 表DEPTを最初に同期し、次に表EMPのデータ(従業員)を部門ごとに同期する。これを宣言的に実装する。
  3. 上記をPL/SQLコードで実装する。
  4. 自動化を使って同期処理を行う。
RESTデータ・ソースを使ったデータの同期については、以前に記事を書いています。この記事では単に同期化を設定しただけですが、こちらは複数のアクションを定義するなど、より実践的な内容になっています。なので、ちょっと自分でも試してみて、その過程を記載します。

記事は4つに分けて記載します。最初は準備、ということでREST API自体を作成します。元のブログでは、PL/SQLのコードを実行することによりREST APIを定義していますが、本記事ではSQL Developer WebのGUIを使って登録します。

確認作業には、Always FreeのAutonomous Transaction Processingのインスタンスを使用しています。APEXのワークスペースとしてAPEXDEVが作成済みで、かつ、そのワークスペースにサンプル・データセットのEMP/DEPTがインストールされている状態から始めます。最初はAshburnリージョンのOracle Database 21cで試したのですが、SQL Developer Webが不安定でした。ですので、本機能の確認にはOracle Databse 19cを使用してください。

SQL Developer WebにADMINでサインインします。管理データベース・ユーザーを開きます。


ユーザーAPEXDEVにて、SQL Developer WebからRESTサービスを定義できるようにするため、RESTの有効化を実行します。


承認が必要ONにし、REST対応ユーザーをクリックします。


データベース・ユーザー名(ここではAPEXDEV)のすぐ隣にRESTの有効化と表示されます。リンクの部分をクリックして、APEXDEVにてSQL Developer Webに接続します。


それぞれのユーザーでSQL Developer WebにサインインするURLには、ユーザー名が含まれます。URLに含まれるユーザー名と同じ名前をユーザー名に指定します。"An Invalid user name or password was supplied."と表示されることがありますが、すでにADMINでサインインしていた場合であれば無視できます。


開発RESTを開いて、RESTサービスを実装します。


モジュールを開きます。


最初にモジュールの作成を実行します。


元記事にてPL/SQLコードで定義しているものと、同じモジュール、テンプレートおよびハンドラを登録していきます。

モジュールは、モジュール名syncdemo.parentベース・パス/syncdemo/を設定し、作成を実行します。


モジュールが作成されたので、続いてテンプレートの作成を実行します。


表DEPTを操作の対象とするURIテンプレートとして、dept/を作成します。


テンプレートが作成されたら、実際の処理を記述するハンドラをテンプレートに定義します。ハンドラの作成を実行します。


メソッドGETソース・タイプ収集問合せソースとしては以下を指定します。指定を行った後、作成をクリックします。

select * from dept


ハンドラが設定されます。これでREST APIが機能するようになりました。REST APIを呼び出して動作を確認します。


表DEPTの内容がJSONで返されることが確認できます。


次に部門番号DEPTNOを指定して、表EMPより、それに紐づく従業員のみを返すREST APIを作成します。

モジュールのページを開き、テンプレートの作成を実行します。


URIテンプレートとしてemp/:deptnoを設定します。コロンで始まる文字列はパラメータとして扱われます。つまり、このREST APIは、実際にはemp/10、emp/20といったURIから呼び出されます。


ハンドラの作成を行います。


メソッドGETソース・タイプ収集問合せソースとして以下を指定します。指定を行った後、作成をクリックします。URIに含まれる部門番号を持つ従業員を、表EMPから返します。

select * from emp where deptno = :deptno


ハンドラが作成されたので、動作を確認します。


そのまま実行すると、:deptnoが引数になるため、ORA-1722が発生します。


URLの:deptnoの部分を10に変更して、再度アクセスします。部門番号10の従業員の一覧がJSONで返されます。


以上で元記事で行っている準備作業は完了です。

折角なので、もう少しREST APIの定義を行ってみます。

元記事は部門番号によって従業員を選択するREST APIのテンプレートとしてemp/:deptno、例えばemp/10といった形式を選んでいます。今回はあくまでRESTデータ・ソースを使用した同期化の実装例を紹介するためのものですので、単純化のためにこうしているのだと思います。

一般的には、emp/数値 というURIテンプレートでの数値は従業員番号とし、表EMPに含まれる特定の従業員を指定します。そして、部門番号で絞り込みをするためにはemp?deptno=部門番号というURIにします。

作ってみましょう。最初にテンプレートを作成します。URLテンプレートempです。deptnoはパラメータとして指定するので、URIテンプレートには含めません。


テンプレートが作成されたら、続いてハンドラを作成します。

メソッドGETページ当たりのアイテム数10ソース・タイプ収集問合せとします。ソースは以下です。
select * from emp
where
(
  :deptno is null
  or
  :deptno = deptno
)
パラメータのdeptnoは指定されていないこともあるため、その場合は表EMPの行がすべて返されるようにしています。


ハンドラのメソッドとして、GET以外にPOST、PUT、DELETEを選択することができます。

GET以外はソース・タイプはPL/SQLのみで、必ずPL/SQLコードで処理を記述します。GETについては、SELECT文の結果として複数行が返される場合は収集問合せ単一行が返される場合は、コレクション・アイテムをソース・タイプとして指定します。ソース・タイプのメディアは、コンテンツ・タイプとそのコンテンツ・タイプでBLOB/CLOBを出力します。通常はデータベースに保存されている画像やファイルを出力するために使用します。PL/SQLは出力する内容を、すべてPL/SQLコードにて記述します。

コレクション・アイテムの場合、(1行の)対象行がJSONオブジェクトとして返されます。収集問合せでは、返される行それぞれをJSONオブジェクトとしたJSON配列が返されます。

ページ当たりのアイテム数の指定があると、収集問合わせの結果の行数(オブジェクト数)は、そこで指定された数値を上限とします。そして、ページネーション(ページ送り)を行うためのURLが、追加情報としてREST APIの呼び出し元に返されます。

ハンドラが作成されたら、パラメータの作成をおこないます。


パラメータ名(URLに現れる名前)はdeptnoバインド変数名(SQLに現れる名前)をdeptnoソース・タイプURIとします。パラメータ・タイプINTアクセス・メソッド入力です。


パラメータが登録されたので、動作を確認します。


出力には10行(JSON配列の要素が10)のみ含まれ、最下部には次の10行を取得するためのURLが"rel":"next"として返されています。"rel":"next"が返されなくなるまでアクセスすることにより、表EMPの全行を取得します。


Oracle APEXのRESTデータ・ソースのタイプが、Oracle REST Data Sourceとなっている場合は、ページネーションの対応はAPEXが行ってくれるので利用者が意識することはありません。

emp?deptno=10としてアクセスした結果は以下となり、deptno=10の条件に一致した行のみが返されていることが確認できます。


最後に注意ですが、ページネーションのアクセスは、それぞれ別のトランザクションになります。つまり、最初にempをアクセスし、次にemp?offset=10をアクセスする間にデータが挿入/更新/削除されると、その更新された情報がemp?offset=10で選択されます。

Oracle APEXにてレポートのソースとしてRESTデータ・ソースを用いる場合には問題にならないと思いますが、データの同期に使用する場合は問題になるかもしれません。その場合はデータ・ソースにフラッシュバック・クエリを検討する必要がありそうです。

データ同期に使用するREST APIの定義の説明は以上です。

すこし脇道にそれましたが、Oracle APEXのアプリケーション開発の一助になれば幸いです。

次の記事は、Oracle APEXのアプリケーションで、宣言的にデータ同期を行う設定を行ってみます。

2021年1月23日土曜日

Autonomous DatabaseのSQL Developer Webにadmin以外のユーザーでサインインできない

 SQL Developer WebにユーザーADMIN以外でサインインする際に、パスワードは間違っていないはずなのに、"An invalid user name or password was supplied."と表示されてログインできません。

そんなときはURLを確認しましょう。

対処方法としては、/ords/admin/... となっているURLを /ords/sql-developer に変更してアクセスします。


URLに現れるユーザー名とUsernameに入力するユーザー名が一致していることを確認します。


本当にパスワードの入力が間違っていなければ、これで正常にサインインできるはずです。