Sentencia RETURN
La sentencia RETURN finaliza el proceso. Lo que sucede a continuación depende del contexto de programación en el que se emite la sentencia RETURN.
Sintaxis
Función principal
Nodo | RETURN TRUE; | RETURN FALSE; | RETURN UNKNOWN (si es de tipo BOOLEAN) o RETURN NULL; | RETURN; |
---|---|---|---|---|
Compute | Propagar el mensaje al terminal Out (de salida). | Detener la propagación | Detener la propagación | Anomalía de despliegue (BIP2912E: No coincidencia de tipos en RETURN) |
Base de datos | Propagar el mensaje al terminal Out (de salida). | Detener la propagación | Detener la propagación | Anomalía de despliegue (BIP2912E: No coincidencia de tipos en RETURN) |
Filter | Propagar el mensaje al terminal True (verdadero). | Propagar el mensaje al terminal False (falso). | Propagar el mensaje al terminal Unknown (desconocido). | Anomalía de despliegue (BIP2912E: No coincidencia de tipos en RETURN) |
Funciones y procedimientos definidos por el usuario
Cuando se utiliza en una función o un procedimiento, la sentencia RETURN detiene el proceso de dicha función y devuelve el control a la expresión de llamada. La expresión, que debe estar presente si la función o procedimiento se ha declarado con una cláusula RETURNS, se evalúa y actúa como el valor de retorno de la función. El tipo de datos del valor devuelto debe ser el mismo que el de la declaración de la función. La tabla siguiente describe las diferencias entre la sentencia RETURN cuando se utiliza en funciones y procedimientos definidos por el usuario.
RETURN expresión; | RETURN NULL; (o devolver expresión que se evalúa en NULL) | RETURN; | Sin sentencia RETURN | |
---|---|---|---|---|
Función o procedimiento definido por el usuario con una cláusula RETURNS | Devuelve el control a la expresión de llamada con el valor de expresión | Devuelve el control a la expresión de llamada con NULL | Anomalía de despliegue (BIP2912E: No coincidencia de tipos en RETURN) | Devuelve el control a la expresión de llamada con NULL después de que se han ejecutado todas las sentencias de la función o procedimiento |
Función o procedimiento definido por el usuario sin una cláusula RETURNS | Anomalía de despliegue (BIP2401E: Error de sintaxis: se esperaba ; pero se encontró expresión) | Anomalía de despliegue (BIP2401E: Error de sintaxis: se esperaba ; pero se encontró NULL) | Devuelve el control a la expresión de llamada | Devuelve el control a la expresión de llamada después de que se han ejecutado todas las sentencias de la función o procedimiento |
La sentencia RETURN debe utilizarse dentro del cuerpo de una función o procedimiento que tiene la sentencia RETURNS en su declaración. Esta función se puede invocar utilizando la sentencia CALL ... INTO. La sentencia RETURNS proporciona el tipo de datos que la función o el procedimiento devuelve al Sentencia CALL. La sentencia CALL ... INTO especifica la variable a la que se asigna el valor de retorno. El ejemplo de este tema muestra un ejemplo de cómo una sentencia RETURNS y CALL ... INTO se utilizan conjuntamente para asignar la sentencia de retorno. Si utiliza la sentencia CALL ... INTO para llamar a una función o procedimiento que no tiene una sentencia RETURNS declarada, se genera un mensaje de error BIP2912E.
Ejemplo
CREATE FILTER MODULE ProcessOrder
CREATE FUNCTION Main() RETURNS BOOLEAN
BEGIN
DECLARE SpecialOrder BOOLEAN;
SET OutputRoot.MQMD = InputRoot.MQMD;
CALL IsBulkOrder(InputRoot.XMLNS.Invoice.Purchases) INTO SpecialOrder;
--
-- more processing could be inserted here
-- before routing the order to the appropriate terminal
--
RETURN SpecialOrder;
END;
CREATE FUNCTION IsBulkOrder (P1 REFERENCE)
RETURNS BOOLEAN
BEGIN
-- Declare and initialize variables--
DECLARE a INT 1;
DECLARE PriceTotal FLOAT 0.0;
DECLARE NumItems INT 0;
DECLARE iroot REFERENCE TO P1;
-- Calculate value of order, however if this is a bulk purchase, the --
-- order will need to be handled differently (discount given) so return TRUE --
-- or FALSE depending on the size of the order --
WHILE a <= CARDINALITY(iroot.Item[]) DO
SET NumItems = NumItems + iroot.Item[a].Quantity;
SET PriceTotal = PriceTotal + iroot.Item[a].UnitPrice;
SET a = a + 1;
END WHILE;
RETURN (PriceTotal/NumItems> 42);
END;
END MODULE;
En el ejemplo, si el precio medio de los
artículos es superior a 42, se devuelve TRUE; de lo contrario se
devuelve FALSE. De este modo, un nodo Filter podría direccionar mensajes
que describan artículos caros a una vía de acceso diferente a partir de
mensajes que describan artículos baratos. A partir del ejemplo, elCALL IsBulkOrder(InputRoot.XMLNS.Invoice.Purchases)
INTO SpecialOrder;
También se puede escribir comoSpecialOrder
= IsBulkOrder(InputRoot.XMLNS.Invoice.Purchases);
Si está utilizando la sentencia PROPAGATE en el nodo, es importante que utilice unRETURN FALSE;
para evitar la propagación automática del mensaje al siguiente nodo del flujo de mensajes. Consulte Sentencia PROPAGAR para ver un ejemplo de cómo evitar la propagación implícita al final del proceso en un nodo Compute.