ESC را فشار دهید تا بسته شود

زمیوس آموزش، یادگیری و سرگرمی

آموزش پکیج UTL_HTTP در Oracle – اتصال به وب‌سرویس‌ها با PL/SQL

در دنیای امروز که بیشتر سیستم‌ها با API کار می‌کنند، نیاز داریم داده‌ها را از سرویس‌های بیرونی بگیریم یا به آن‌ها بفرستیم.

در پایگاه داده Oracle یکی از قدرتمندترین ابزارها برای این کار پکیج UTL_HTTP است.

در این مقاله آموزش Oracle در بحش آموزش پکیج های اوراکلی یاد می گیریم که با استفاده از این پکیج می‌توانید درخواست GET یا POST را از داخل دیتابیس ارسال کنید و پاسخش را پردازش کنید — بدون نیاز به اپلیکیشن خارجی.

Tablespace یکی از ارکان اساسی در مدیریت پایگاه‌های داده اوراکل است و برای مدیران پایگاه داده و توسعه‌دهندگان بسیار حیاتی است. پیشنهاد می شود نوشته زیر را مطالعه کنید:

در این نوشته شما می خوانید

پکیج UTL_HTTP چیست و چه کاربردی دارد؟

UTL_HTTP یک پکیج داخلی PL/SQL است که ارتباط مستقیم با سرورهای HTTP/HTTPS را فراهم می‌کند.

شما می‌توانید با آن:

  • از یک API REST داده بگیرید (GET)
  • داده را به وب‌سرویس بفرستید (POST/PUT/DELETE)
  • JSON یا XML را در داخل دیتابیس پردازش کنید
  • تبادل اطلاعات بین سیستم‌ها را بدون خروج از دیتابیس انجام دهید

این یعنی دیتابیس شما می‌تواند مستقیماً با اینترنت و سرویس‌های ابری صحبت کند.

پیش‌نیازها برای استفاده از پکیج UTL_HTTP

فعال‌سازی ACL (Access Control List)

از نسخه ۱۱g به بعد، اوراکل ارتباطات شبکه‌ای را محدود کرده و برای دسترسی به یک آدرس باید ACL تعریف کنید:

				
					BEGIN
  DBMS_NETWORK_ACL_ADMIN.create_acl (
    acl         => 'http_acl.xml',
    description => 'HTTP Access for UTL_HTTP',
    principal   => 'MY_USER',
    is_grant    => TRUE,
    privilege   => 'connect'
  );

  DBMS_NETWORK_ACL_ADMIN.assign_acl (
    acl  => 'http_acl.xml',
    host => 'api.example.com'
  );
END;
/

				
			

اگر می‌خواهید اجازه به تمام دامنه‌ها بدهید:

				
					DBMS_NETWORK_ACL_ADMIN.assign_acl(acl => 'http_acl.xml', host => '*');

				
			

فعال کردن HTTPS با Oracle Wallet

برای آدرس‌های HTTPS:

				
					orapki wallet create -wallet /u01/app/oracle/admin/wallet -auto_login

orapki wallet add -wallet /u01/app/oracle/admin/
wallet -trusted_cert -cert your_cert.cer

				
			

در کد PL/SQL هم باید:

				
					UTL_HTTP.set_wallet('file:/u01/app/oracle/admin/wallet', 'mypassword');

				
			

نمونه‌های عملی استفاده از پکیج UTL_HTTP

۱. درخواست GET ساده

				
					DECLARE
   l_req   UTL_HTTP.req;
   l_res   UTL_HTTP.resp;
   l_line  VARCHAR2(32767);
BEGIN
   UTL_HTTP.set_wallet
   ('file:/u01/app/oracle/admin/wallet', 'mypassword');
   
   l_req := UTL_HTTP.begin_request
   ('https://jsonplaceholder.typicode.com/posts/1','GET','HTTP/1.1');
   
   l_res := UTL_HTTP.get_response(l_req);

   LOOP
      UTL_HTTP.read_line(l_res, l_line, TRUE);
      DBMS_OUTPUT.put_line(l_line);
   END LOOP;

   UTL_HTTP.end_response(l_res);
EXCEPTION
   WHEN UTL_HTTP.end_of_body THEN
      UTL_HTTP.end_response(l_res);
END;
/

				
			

📌 خروجی: محتوای JSON پست شماره ۱.

۲. ارسال POST همراه JSON

				
					DECLARE
   l_req   UTL_HTTP.req;
   l_res   UTL_HTTP.resp;
   l_line  VARCHAR2(32767);
BEGIN
   UTL_HTTP.set_wallet
   ('file:/u01/app/oracle/admin/wallet', 'mypassword');
   

   l_req := UTL_HTTP.begin_request
   ('https://jsonplaceholder.typicode.com/posts','POST','HTTP/1.1');
   
   UTL_HTTP.set_header(l_req, 'Content-Type', 'application/json');
   UTL_HTTP.set_header(l_req, 'User-Agent', 'Oracle-UTL_HTTP');
   UTL_HTTP.write_text(l_req, '{"title":"foo","body":"bar","userId":1}');

   l_res := UTL_HTTP.get_response(l_req);

   LOOP
      UTL_HTTP.read_line(l_res, l_line, TRUE);
      DBMS_OUTPUT.put_line(l_line);
   END LOOP;

   UTL_HTTP.end_response(l_res);
EXCEPTION
   WHEN UTL_HTTP.end_of_body THEN
      UTL_HTTP.end_response(l_res);
END;
/

				
			

نکات حرفه‌ای برای استفاده از پکیج UTL_HTTP

Timeout برای جلوگیری از هنگ کردن

				
					UTL_HTTP.set_transfer_timeout(5000);

				
			

Headers سفارشی (مثل Authorization)

				
					UTL_HTTP.set_header(l_req, 'Authorization', 'Bearer <TOKEN>');

				
			
  • حلقه خواندن پاسخ برای داده‌های حجیم
  • مدیریت خطا ایجاد Exception Handling مناسب
  • محدود کردن ACL برای امنیت بیشتر

دریافت نرخ ارز و ذخیره در جدول با استفاده از پکیج UTL_HTTP

ساخت جدول

				
					CREATE TABLE currency_rates (
   rate_date DATE,
   currency  VARCHAR2(10),
   value     NUMBER
);

				
			

PL/SQL ذخیره‌سازی داده

				
					DECLARE
   l_req   UTL_HTTP.req;
   l_res   UTL_HTTP.resp;
   l_line  CLOB;
BEGIN
   UTL_HTTP.set_transfer_timeout(5000);
   l_req := UTL_HTTP.begin_request
   ('https://api.currencylayer.com/live?access_key=XXXX','GET');
   
   l_res := UTL_HTTP.get_response(l_req);

   LOOP
      UTL_HTTP.read_line(l_res, l_line, TRUE);
      DBMS_OUTPUT.put_line(l_line); 
   END LOOP;

   UTL_HTTP.end_response(l_res);
EXCEPTION
   WHEN UTL_HTTP.end_of_body THEN
      UTL_HTTP.end_response(l_res);
END;
/

				
			

📌 این کد را می‌توان با DBMS_SCHEDULER زمان‌بندی کرد تا روزانه به‌صورت خودکار اجرا شود.

سوالات متداول درباره پکیج UTL_HTTP در اوراکل

پکیج UTL_HTTP به شما امکان می‌دهد از داخل دیتابیس اوراکل درخواست‌های HTTP یا HTTPS ارسال کنید و پاسخ آن را دریافت و پردازش کنید.

این پکیج برای اتصال به وب‌سرویس‌ها، API های REST و SOAP، خواندن JSON یا XML، و ارسال داده از PL/SQL به سرویس‌های خارجی استفاده می‌شود.

برای آدرس‌های HTTPS باید یک Oracle Wallet بسازید و گواهی SSL سرور مقصد را داخل آن ذخیره کنید.

سپس مسیر Wallet و رمز عبورش را در کد PL/SQL با UTL_HTTP.set_wallet تنظیم کنید.

در UTL_HTTP، متد GET برای دریافت داده از سرور استفاده می‌شود و معمولاً پارامترها در URL قرار می‌گیرند، در حالی که متد POST برای ارسال داده به سرور به کار می‌رود و اطلاعات (مثلاً JSON یا فرم‌ها) در بدنه درخواست (Request Body) قرار می‌گیرند.

باید با استفاده از DBMS_NETWORK_ACL_ADMIN یک Access Control List (ACL) ایجاد و به کاربر و دامنه مقصد اختصاص دهید.

بدون این مرحله، اوراکل به صورت پیش‌فرض اجازه ارسال درخواست به منابع خارجی را نمی‌دهد.

جمع‌بندی

با پکیج UTL_HTTP شما می‌توانید دیتابیس اوراکل را به هر سرویس آنلاین متصل کنید.

این ابزار برای پروژه‌های وب‌سرویس محور ضروری است و با کمی برنامه‌نویسی PL/SQL می‌توانید تبادل داده را کاملاً خودکار کنید.

فقط کافیست ACL و Wallet را درست پیکربندی کنید، Timeout مناسب بگذارید و ساختار JSON/XML را پردازش کنید.

📥 اگر سوالی داری در پکیج UTL_HTTP در Oracle داری، در بخش کامنت‌ها بپرس.

سؤالی درباره این مقاله داری؟

اگر نکته‌ای در این مقاله برات مبهم بود یا خواستی بیشتر بدونی، همین حالا برام بنویس تا دقیق و صمیمی پاسخت رو بدم — مثل یه گفت‌وگوی واقعی 💬

برو به صفحه پرسش و پاسخ

میثم راد

من یه برنامه نویسم که حسابی با دیتابیس اوراکل رفیقم! از اونایی ام که تا چیزی رو کامل نفهمم،ول کن نیستم، یادگرفتن برام مثل بازیه، و نوشتن اینجا کمک می کنه تا چیزایی که یاد گرفتم رو با بقیه به شریک بشم، با هم پیشرفت کنیم.

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *