همگام سازی منابع Parent-Child REST
همراه با معرفی APEX 20.2 ویژگی جدید همگام سازی REST Source معرفی گردید که به کاربر این امکان را میدهد تا دادهها را از REST API به یک جدول local بدون نیاز به هیچ کدی همگام سازی نماید. این پست نشان میدهد که چگونه میتوان دو REST API (که رابطه والد و فرزند را مدل میکنند) با دو جدول local همگام سازی کرد. برخی از کدهای PL/SQL مورد نیاز خواهد بود، اما از ویژگیهای APEX حداکثر استفاده خواهد شد.
پیش نیازها
ابتدا به دو REST API برای کار نیاز داریم. بیایید دو جدول ORDS REST را در جداول EMP و DEPT آماده کنیم. اسکریپت زیر می تواند در SQL Workshop اجرا شود و همه چیز را تنظیم کند.
در مسیر SQL Workshop > RESTful Services ، دو API جدید REST به شرح زیر خواهد بود:
حال میتوانیم تنها با کپی کردن URL کامل و جایگذاری آن در مرورگر، API والد REST را فراخوانی کنیم.
همچنین می توانیم به Child REST API استناد کنیم، هرچند همیشه نیاز به ID والد داریم. بدون ID والد، API هیچ چیزی بر نمیگرداند و دقیقاً این قسمت چالش برانگیز هماهنگی ما خواهد بود.
ایجاد REST Data Sources
به محیط APEX بروید، یک اپلیکیشن ایجاد کنید و REST Data Sources را برای هر دو REST API ایجاد کنید. با API والد REST شروع کنید…
APEX باید بتواند همه چیز را به صورت خودکار تشخیص دهد. برای ایجاد یک object روی Create REST Data Source کلیک کنید.
برای Child REST API ، باید قسمت داینامیک URL را با استفاده از مکان نگهدارنده :deptno اعلام کنیم. برای اینکه مشخص گردد که ستون و دیتا به درستی عمل میکنند، اطمینان حاصل کنید که مقداری را منتقل میکنید که یک نتیجه بر میگرداند. پس از پایان باید دو REST Data Sources تعریف شده باشد.
همگام سازی برای API والد
بیایید همگام سازی را برای REST API “والد” پیکربندی کنیم – این قسمت آسان و ساده است.
ابتدا باید اطمینان حاصل کنیم که REST Data Source ما دارای یک Primary Key تعریف شده است. بنابراین REST Data Source را ویرایش کرده و بر روی دکمه Edit Data Profile کلیک کنید.
ستون DEPTNO بعنوان Primary Key برای این REST API در نظر گرفته شده است، بنابراین اجازه دهید این ستون را ویرایش کنیم تا ببینیم آیا در Data Profile نیز به خوبی اعلان میگردد یا خیر.
هنگام ایجاد REST Data Source ، اپکس معمولاً قادر به شناسایی Primary Key نیست ، زیرا این نوع اطلاعات معمولاً در پاسخ REST API ارائه نمیشوند. بنابراین باید به صورت دستی تغییر دهیم. کلید Primary Key را برای ستون DEPTNO فعال کنید و تغییرات را ذخیره کنید.
هنگامی که دوباره به صفحه ویرایش REST Data Source میروید ، روی Manage Synchronization در سمت راست کلیک کنید.
میخواهیم دادهها را از “والد” REST API همگام سازی کنیم. جدول همگام سازی هنوز وجود ندارد، بنابراین استفاده از یک جدول جدید را انتخاب کنید و از LOCAL_PARENT_TABLE به عنوان نام جدول استفاده کنید.
APEX بی سر و صدا آن جدول را ایجاد نمی کند، بنابراین صفحه ویرایش همگام سازی به درستی بیان می کند که این جدول هنوز وجود ندارد. با این حال، دستور SQL DDL قابل دسترسی است و با کلیک بر روی دکمه Create Table ، جدول جدید ایجاد میشود.
پس از اینکه جدول ایجاد شد، میتوانیم روش Merge synchronization را انتخاب کرده و یک فاصله زمان بندی شده را پیکربندی کنیم. روش Merge بر اساس ستونهای Primary Key تعریف شده در data profile است. بسته به مقادیری که از REST API وارد میشوند، یا ردیفهای جدیدی در جدول همگام سازی محلی ایجاد میکند ، یا ردیفهای موجود را به روز میکند. در پشت صحنه، از عبارت SQL MERGE استفاده شده است.
بر روی Save and Run کلیک کرده و همگام سازی جدید را امتحان کنید.
پس از اجرای همگام سازی، محتوای LOCAL_PARENT_TABLE را میتوان در SQL Workshop بررسی کرد.
همگام سازی برای API فرزند
برای REST API “فرزند” مراحل را مشابه قبل تکرار میکنیم.
- در قسمت Data Profile مطمئن شوید که ستون EMPNO به عنوان Primary Key اعلام شده باشد.
- همگام سازی را برای LOCAL_CHILD_TABLE پیکربندی کنید.
- دستورات CREATE TABLE SQL را بررسی کرده و روی دکمه Create Table کلیک کنید.
- روش همگام سازی MERGE را انتخاب کنید و روی دکمه Save and Run کلیک کرده تا همگام سازی انجام شود.
بررسی log به ما نشان خواهد داد که همگام سازی در واقع عمل کرده است. با این حال، حتی اگر چندین بار همگام سازی را انجام دهیم ، فقط سه ردیف وجود خواهد داشت.
Log نشان می دهد که سه ردیف همگام سازی شدهاند. جدول SQL Workshop را بررسی کنید تا ببینید کدام ردیفها همگام شدهاند.
SQL Workshop به ما نشان میدهد که فقط ردیفهایی با DEPTNO 10 همگام شدهاند. و این بدان دلیل است که وقتی REST Data Source را ایجاد کردیم، از مقدار “10” به عنوان مقدار پیش فرض پارامتر: deptno REST Data Source استفاده کردهایم. بنابراین APEX همیشه REST API را با مقدار 10 فراخوانی میکند.
برای رسیدگی به این وضعیت، REST Synchronization شامل مفهوم Steps است. دوباره به Child REST API در Shared Components بروید، سپس به تنظیمات همگام سازی بروید و روی دکمه Add Step کلیک کنید تا یک مرحله همگام سازی جدید برای مقدار دیگر deptno پیکربندی شود.
پس از کلیک روی Save and Run خواهیم دید که LOCAL_CHILD_TABLE شامل هشت ردیف خواهد بود (برای مقادیر DEPTNO 10 و 20).
اکنون میتوانیم مراحل همگام سازی بیشتری را اضافه نماییم. ستون Expression در یک مرحله همگام سازی حتی میتواند یک SQL Query را بپذیرد و پردازش کند. با این حال، چنین SQL Query باید فقط یک ردیف و یک ستون برگرداند، بنابراین درصورت نیاز به همگام سازی مقادیر مختلف، نامناسب است. از این گذشته ، همگام سازی والد و فرزند باید چندین مرحله را به صورت داینامیک اجرا کند و تعداد گامها در زمان طراحی مشخص نیست.
بنابراین ما به چیزی انعطاف پذیرتر نیاز داریم. و این جایی است که پکیج APEX_REST_SOURCE_SYNC PL / SQL وارد میشود. برای کار با این پکیج، ابتدا باید LOCAL_CHILD_TABLE را “truncate” کنید تا خالی شود.
همگام سازی انعطاف پذیر با PL/SQL
APEX_REST_SOURCE_SYNC.DYNAMIC_SYNCHRONIZE_DATA اجازه میدهد مقادیر پارامتر را برای همگام سازی آماده نمایید، اما بدون اینکه بطور شفاف Synchronization Step مشخص شده باشد. بنابراین ، برای همگام سازی همه ردیف های REST API “فرزند” برای DEPTNO = 20 ، از کد زیر استفاده می کنیم (مقدار “deptno” هنوز به صورت هارد کد است):
از پارامتر p_module_static_id برای جستجوی REST Data Source در داخل برنامه استفاده میشود. بنابراین مطمئن شوید که دقیق است. Static ID برای REST Data Source را می توانید در بخش Advanced در صفحه ویرایش REST Data Source پیدا کنید.
متأسفانه نمیتوان این کد را در SQL Workshop> SQL Commands اجرا کرد. با این حال، میتوان آن را به عنوان یک فرایند صفحه اپلیکیشن اجرا کرد، بنابراین ما از این روش برای نشان دادن نحوه کار همزمان سازی PL/SQL استفاده خواهیم کرد. بیایید یک صفحه جدید به اپلیکیشن اضافه کنیم.
- یک classic report در جدول LOCAL_CHILD_TABLE ایجاد کنید که دادههای هماهنگ شده را نشان دهد.
- یک region با فیلد متنی آیتم PX_DEPTNO ایجاد کنید (در اینجا P1_DEPTNO).
- یک دکمه Page Submit ایجاد کنید.
- با کد بالا یک Page Process ایجاد کنید ، اما نام مورد صفحه خود را با بخش هارد کد شده “20” جایگزین کنید.
صفحه باید شبیه تصویر زیر باشد. یک شماره را در قسمت متن DEPTNO تایپ کنید و روی Synchronize کلیک کنید. بعد از اجرای این کد برای مقادیر 10 ، 20 ، 30 ، باید تمام 14 ردیف جدول محلی را داشته باشیم.
جدول در ابتدا خالی است اما بعد از همگام سازی با اولین مقدار DEPTNO و سپس بعد از سینک شدن با تمامی مقادیر DEPTNO بصورت زیر در خواهد آمد
به هدف اصلی نزدیکتر شدیم، اما هنوز تعامل دستی بیش از حد است. بیایید پروسیجر کد را تغییر دهیم تا همگام سازی “فرزند” برای همه ردیف های جدول والد اجرا شود..
اکنون از این کد برای Page Process استفاده کنید. همچنین قسمت فیلد متن P1_DEPTNO را از صفحه حذف کنید، زیرا با کلیک بر روی دکمه همگام سازی ، اکنون Child REST API برای همه ردیف های API والد همگام سازی میشود (قبل از امتحان LOCAL_CHILD_TABLE را پاک کنید).
اکنون بسیار به هدف خود نزدیک شدهایم. اما همگام سازی هنوز به تعامل دستی نیاز دارد، چیزی که ما نمی خواهیم. در واقع ، Child REST API باید بلافاصله پس از همگام سازی برای Parent REST API با موفقیت اجرا شود. با این حال، ویژگی REST Synchronization چیزی مانند “After Synchronization PL / SQL Code” یا موارد مشابه را پشتیبانی نمیکند.
پس چرا همگام سازی والد و کفرزند در بلوک PL/SQL وجود ندارد..؟
با کلیک بر روی دکمه Synchronize ، بلوک PL/SQL ابتدا Parent REST API و سپس Child REST API را همگام سازی می کند.
بیایید سرانجام از شر نیاز به کلیک دستی یک دکمه برای این کار خلاص شویم.
اجرای زمانبندی شده PL/SQL بصورت خودکار
برای اجرای REST Source Synchronization سفارشی سازی شده به صورت خودکار طبق برنامه، از ویژگی Automations استفاده خواهیم کرد.
با این حال ، قبل از ایجاد Automation، به “والد” REST Data Source بروید، Synchronization را ویرایش کنید و برنامه پیکربندی شده را پاک کنید، که دیگر نیازی به آن نخواهیم داشت.
سپس ، به بخش Automations در Shared Components بروید و یک Automation جدید با ویژگیهای زیر ایجاد کنید:
- Name: Parent Child REST Sync
- Type: Scheduled
- Actions initiated on: Always
- Execution Schedule: Daily at Midnight
پس از کلیک بر روی دکمه Create ، صفحه ویرایش Automation ظاهر می شود. به پایین به بخش Actions بروید ، که شامل اولین Action از پیش تعریف شده است.
برای ویرایش این اتوماسیون روی آیکون مداد کلیک کنید. سپس به پایین قسمت کد رفته و کد ساختگی را با بلوک PL/SQL از بالا جایگزین کنید تا همه دادهها به یکباره همگام سازی شوند. برای ثبت اطلاعات در هنگام اجرای کد ، می توانید از روشهای APEX_AUTOMATION.LOG_ERROR ، LOG_INFO یا LOG_WARN استفاده کنید.
تغییرات مربوط به Automation Action را ذخیره کنید، سپس جداول LOCAL_CHILD_TABLE و LOCAL_PARENT_TABLE را دوباره پاک کنید و برای اجرای اتوماسیون جدید Save and Run را کلیک کنید. باید پیغام Automation Execution آغاز شده را مشاهده کنید.
اکنون دوباره محتویات جدول را بررسی کنید. آنها باید با دیتا پر شده باشند. همچنین، log اجرایی اتوماسیون را مشاهده کنید که باید حاوی ورودیهای ساطع شده با APEX_AUTOMATION.LOG_INFO در هنگام اجرای PL/SQL باشد.
اگر همه چیز خوب باشد، میتوانیم اتوماسیون را برای اجرای برنامه ریزی شده فعال کنیم. اتوماسیون را دوباره ویرایش کرده و Schedule Status را از Disabled به Active تغییر دهید. سپس تغییرات خود را ذخیره کنید.
کار ما تمام شد. بر اساس برنامه پیکربندی شده شما، APEX هر دو REST API والد و فرزند را با جداول محلی همگام میکند. و این هنوز جای بهبود دارد. به عنوان مثال، کوئری در جدول LOCAL_PARENT_TABLE در بلوک PL/SQL میتواند به گونهای تنظیم شود تا فقط ردیفهای خاص برای همگام سازی “فرزند” انتخاب شود.
با استفاده از ابزارهای ارائه شده توسط APEX (REST Source Synchronizations، Automations و پکیجهای PL/SQL) ، میتوانید تقریباً همه نیازهای همگام سازی را بدون نگرانی در مورد جزئیات درخواستهای سطح پایین HTTP یا تجزیه JSON پیاده سازی نمایید.