Inside Oracle APEX auf Deutsch (von Patrick Wolf)

SMS an ein Handy schicken

Heute habe ich einen Artikel im Grant Rolands seinem Blog über SMS from Oracle Forms through a Web-Service gelesen.

Ich habe mir gedacht, es wäre nett so etwas auch in Oracle APEX und PL/SQL zu haben. Kann man ja für Eskalationen oder System Fehler, ... verwenden.

Grant verwendet ein Web-Service von Esendex, aber ich bin mir sicher es gibt genügend andere SMS Gateway Anbieter. Google liefert jedenfalls einige Angebote für Deutschland. Zuerst habe ich mir gedacht ich verwende auch das angebotene Web-Service und schreibe einen PL/SQL Wrapper dafür oder ich verwende die Web-Service Funktion von APEX.

Aber ich habe mich dann dafür entschieden die einfache HTTP POST Version zu verwenden, welche auch von Esendex angeboten wird. Gründe? Warum soll ich mir das ganze Java rundherum antun und es nur unnötig kompliziert und fehleranfällig machen wenn es einfach auch geht. Die APEX Web-Service Funktion konnte ich nicht verwenden, weil ich das ganze ja auch von PL/SQL zum Beispiel in einem Batch-Job verwenden wollte.

Der Code ist eigentlich sehr einfach. Holt Euch ein Gratis Konto, ersetzt die Konstanten in der Beispiel Prozedur und los geht es!

Hinweis: Wenn Ihr einen Proxy habt, dann müsst Ihr den Kommentar für die Proxy Zeile entfernen. Es gibt auch eine sicherere Version mit HTTPS, aber die benötigt wieder ein Wallet, ... eigentlich wollte ich ja nur zeigen wie einfach es ist und das es funktioniert. Die Fehlerbehandlung in der Prozedur könnte sicher auch noch verbessert werden, aber das ganze soll ja nur ein Grundgerüst sein! :-)

Viel Spass beim aufwecken Eurer Bereitschaft/DBAs in der Nacht! ;-)

Um eine SMS zu schicken, einfach die Prozedur mit
BEGIN
sendSMS('+436991812345','this is a test');
END;
aufrufen.

Nachfolgend die Beispiel Prozedur:
CREATE OR REPLACE PROCEDURE sendSMS
( pRecipient IN VARCHAR2
, pBody IN VARCHAR2
)
IS
ESENDEX_USERNAME CONSTANT VARCHAR2(40) := 'your_username';
ESENDEX_PASSWORD CONSTANT VARCHAR2(40) := 'your_password';
ESENDEX_ACCOUNT CONSTANT VARCHAR2(40) := 'your_account';
--
vRequest Utl_Http.req;
vPostText VARCHAR2(500);
vResponse Utl_Http.resp;
vResponseText VARCHAR2(2000);
vErrorText VARCHAR2(200);
BEGIN
----------------------------------------------------------------------------
-- Build text for the post action.
-- For a field description, see
-- http://www.esendex.com/secure/messenger/formpost/SendSMS.aspx
----------------------------------------------------------------------------
vPostText :=
'EsendexPlainText=YES' ||CHR(38)||
'EsendexUsername=' ||Utl_Url.escape(ESENDEX_USERNAME, TRUE)||CHR(38)||
'EsendexPassword=' ||Utl_Url.escape(ESENDEX_PASSWORD, TRUE)||CHR(38)||
'EsendexAccount=' ||Utl_Url.escape(ESENDEX_ACCOUNT, TRUE)||CHR(38)||
'EsendexRecipient='||Utl_Url.escape(pRecipient, TRUE)||CHR(38)||
'EsendexBody=' ||Utl_Url.escape(pBody, TRUE);
----------------------------------------------------------------------------
-- if you need to set a proxy, uncomment next line.
----------------------------------------------------------------------------
/* Utl_Http.set_proxy('proxy.it.my-company.com', 'my-company.com'); */
----------------------------------------------------------------------------
-- Send SMS through the Esendex SMS service.
----------------------------------------------------------------------------
vRequest := Utl_Http.begin_request
( url => 'http://www.esendex.com/secure/messenger/formpost/SendSMS.aspx'
, method => 'POST'
);
Utl_Http.set_header
( r => vRequest
, name => 'Content-Type'
, value => 'application/x-www-form-urlencoded'
);
Utl_Http.set_header
( r => vRequest
, name => 'Content-Length'
, value => LENGTH(vPostText)
);
Utl_Http.write_text
( r => vRequest
, data => vPostText
);
vResponse := Utl_Http.get_response(vRequest);
IF vResponse.status_code = '200'
THEN
Utl_Http.read_text(vResponse, vResponseText);
--
IF vResponseText NOT LIKE 'Result=OK%'
THEN
vErrorText := vResponseText;
END IF;
ELSE
vErrorText := 'HTTP status: '||vResponse.status_code||'-'||vResponse.reason_phrase;
END IF;
--
Utl_Http.end_response(vResponse);
--
IF vErrorText IS NOT NULL
THEN
RAISE_APPLICATION_ERROR(-20001, 'Sending SMS failed with '||vErrorText);
END IF;
END sendSMS;


Labels: , , , ,