Preparing JavaScript code for MLE Module Calls
JavaScript modules in MLE follow the ECMAScript 6 standard for modules. Functions and variables expected to be consumed by users of the MLE module must be exported.
Those variables and functions not exported are considered private in the module. Example 3-3 demonstrates the use of both public and private functions in an MLE JavaScript module.
An ECMAScript module can import other ECMAScript modules using import statements or dynamic import calls. This functionality is present in MLE as well. Complementary metadata to MLE modules is provided in MLE environments.
Note that console output in MLE is
facilitated using the console object. By default, anything written to
console.log()
is routed to DBMS_OUTPUT
and is
displayed on the screen.
JavaScript code like that in Example 3-1 cannot be accessed from SQL or PL/SQL without the help of call specifications. For now, you can think of a call specification as a PL/SQL program unit (function, procedure, or package) where its PL/SQL body is replaced with a reference to the JavaScript module and function, as shown in Example 3-2. For more information about call specifications, see MLE JavaScript Functions.
Example 3-2 Create a Call Specification for a Public Function
This example uses the module po_module
created in Example 3-1. A call specification for orderValue()
, the only function
exported in po_module
, can be written as follows:
CREATE OR REPLACE FUNCTION order_value(
p_line_items JSON
) RETURN NUMBER AS
MLE MODULE po_module
SIGNATURE 'orderValue';
/
Once the function is created, it is possible to calculate the value of a given purchase order:
SELECT
po.po_document.PONumber,
order_value(po.po_document.LineItems[*]) order_value
FROM
j_purchaseorder po;
Result:
PONUMBER ORDER_VALUE
---------- -----------
1600 279.3
672 359.5
Example 3-3 Public and Private Functions in a JavaScript Module
In addition to public (exported) functions, it is possible to add functions private
to the module. In this example, the calculation of the value is taken out of the
map()
function and moved to a separate function
(refactoring).
The first function in the following code,
lineItemValue()
, is considered private, whereas the second
function, orderValue()
, is public. The export keyword is provided
at the end of this code listing but can also appear as a prefix for variables and
functions, as seen in Example 3-1. Both variations are valid JavaScript syntax.
CREATE OR REPLACE MLE MODULE po_module LANGUAGE JAVASCRIPT AS
/**
* calculate the value of a given line item. Factored out of the public
* function to allow for currency conversions in a later step
* @param {number} unitPrice - the price of a single article
* @param {number} quantity - the quantity of articles ordered
* @returns {number} the monetary value of the line item
*/
function lineItemValue(unitPrice, quantity) {
return unitPrice * quantity;
}
/**
* get the value of all line items in an order
* @param {array} lineItems - all the line items in a purchase order
* @returns {number} the total value of all line items in a purchase order
*/
function orderValue(lineItems) {
return lineItems
.map( x => lineItemValue(x.Part.UnitPrice, x.Quantity) )
.reduce(
(accumulator, currentValue) => accumulator + currentValue, 0
);
}
export { orderValue }
/
Parent topic: Using JavaScript Modules in MLE