PL/SQL Methods

 

For Inbound message flows it is possibly to define directly a PL/SQ method instead of BizAPI using the PL/SQL Routing Address type. The method however has to fulfill some conditions: it has to be a function placed within a package own by the Application Owner (IFSAPP) taking CLOB as the only input argument and returning a CLOB.

The input argument can contain an XML document encoded to UTF-8 or a plain text document, depending on what is read by the Connect Reader or delivered by Transformer, if used. Any other type of input is treated as binary data and will be, after being encoded to Base64, placed into attribute BIN_DATA of the special framework view BINARY_PARAMETER (see also BizAPI with Binary Data).

The same rules apply to the value returned by the function: it can be either plain text or XML (or null). If the method is supposed to return binary data, it has to be Base64 encoded and encapsulated within the BINARY_PARAMETER view too.

Additional data is sent by the Batch Processor and is available for the method through Application Context. Following Application Message parameters are passed: APPLICATION_MESSAGE_ID, SUBJECT, CREATED_FROM, SENDER, RECEIVER, MESSAGE_FUNCTION, MESSAGE_TYPE, EXTERNAL_MESSAGE_ID.

 

A simple example of a method reading an Application Context parameter and manipulating the incoming XML document:

FUNCTION Plsql_Address_Test (xml_ CLOB) RETURN CLOB IS
   app_msg_id_ NUMBER;
   result_     CLOB;
BEGIN
   Log_SYS.App_Trace(Log_SYS.trace_, 'Incoming document:'||xml_);
   app_msg_id_ := App_Context_SYS.Find_Number_Value('APPLICATION_MESSAGE_ID', 0);
   Log_SYS.App_Trace(Log_SYS.trace_, 'Extracting app msg id:'||app_msg_id_);
   result_ := replace(xml_, '</COMMENTS>', '/Modified by Batch_Processor_Test_API.Plsql_Address_Test ['||app_msg_id_||']</COMMENTS>');
   RETURN result_;
END Plsql_Address_Test;


Another simple example working on text:

FUNCTION Plsql_Address_Test_Txt (txt_ CLOB) RETURN CLOB IS
   pos_ NUMBER;
   scenario_ VARCHAR2(50);
BEGIN
   Log_SYS.App_Trace(Log_SYS.debug_, 'Incoming document:'||txt_);
   pos_ := instr(txt_, '@', 1, 2);
   scenario_ := substr(txt_, pos_+1, 32);
   RETURN 'Document retrieved by Plsql_Address_Test_Txt method for scenario ['||scenario_||'].';
END Plsql_Address_Test_Txt;

This method is expecting an identifier (scenario_) of given length (32) following the '@' character in the incoming plain text document. The identifier is then extracted and sent back in the returning text.

 

Two examples showing how to work with binary data:

FUNCTION Plsql_Address_Test_Bin (xml_ CLOB) RETURN CLOB IS
   doc_    Plsqlap_Document_API.Document;
   data_   BLOB;
   result_ CLOB;
BEGIN
   Log_SYS.App_Trace(Log_SYS.debug_, 'Incoming XML document:'||chr(10)||xml_);
   Plsqlap_Document_API.From_Ifs_Xml(doc_, xml_);
   data_ := Plsqlap_Document_API.Get_Blob_Value(doc_, 'BIN_DATA');
   Modify_Bmp___(data_);

   doc_ := Plsqlap_Document_API.New_Document('BINARY_PARAMETER');
   Plsqlap_Document_API.Add_Attribute(doc_, 'BIN_DATA', data_);
   Plsqlap_Document_API.To_Ifs_Xml(result_, doc_);
   Log_SYS.App_Trace(Log_SYS.debug_, 'Resulting XML document:'||result_);
   RETURN result_;
END Plsql_Address_Test_Bin;
FUNCTION Plsql_Address_Test_Bin2 (xml_ CLOB) RETURN CLOB IS
   enc_data_ CLOB;
   ns_       VARCHAR2(4000) := 'xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:ifsrecord="urn:ifsworld-com:ifsrecord" xmlns="urn:ifsworld-com:schemas:connectframework_binary_parameter"';
   data_     BLOB;
   result_   CLOB;
BEGIN
   Log_SYS.App_Trace(Log_SYS.debug_, 'Incoming XML document:'||chr(10)||xml_);

   SELECT EXTRACTVALUE(XMLTYPE(xml_), '/BINARY_PARAMETER/BIN_DATA', ns_) INTO enc_data_ FROM dual;
   Log_SYS.App_Trace(Log_SYS.debug_, 'Extracted data:'||enc_data_);

   data_ := From_Base64___(enc_data_);
   Modify_Bmp___(data_);
   enc_data_ := To_Base64___(data_);

   SELECT XMLAGG(XMLELEMENT("BINARY_PARAMETER", XMLELEMENT("BIN_DATA",enc_data_))).getClobVal() INTO result_ FROM dual;
   Log_SYS.App_Trace(Log_SYS.debug_, 'Resulting XML document:'||result_);
   RETURN result_;
END Plsql_Address_Test_Bin2;

Both examples do the same - take an XML document of type BINARY_PARAMETER with Base64 encoded binary data encapsulated within attribute BIN_DATA, extract the binary data to a BLOB variable, do some manipulation, create the resulting view, also of type BINARY_PARAMETER and put the modified data back to the resulting view.

The only difference between the two methods is that the first one is using IFS Document API available through the Plsqlap_Document_API package, the second one is using Oracle XML handling. While decoding/encoding from/to Base64 is done automatically by the framework when using IFS Documents, it has to be done explicitly when working with Oracle XML API.

The called method Modify_Bmp___ is expecting the incoming data to be a BMP image of size 20 x 20 pixels representing a red square. It then changes the color to rose of the square's upper half.

All the example methods above can be found in the Batch_Processor_Test_API package supplied within the IFSBAS component.