
در دنیای امروز که بیشتر سیستمها با 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 ');
- حلقه خواندن پاسخ برای دادههای حجیم
- مدیریت خطا ایجاد 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 داری، در بخش کامنتها بپرس.
سؤالی درباره این مقاله داری؟
اگر نکتهای در این مقاله برات مبهم بود یا خواستی بیشتر بدونی، همین حالا برام بنویس تا دقیق و صمیمی پاسخت رو بدم — مثل یه گفتوگوی واقعی 💬
برو به صفحه پرسش و پاسخ
دیدگاهتان را بنویسید