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.
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) |
Database | 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 a 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 puede invocarse utilizando la sentencia CALL ... INTO. La sentencia RETURNS proporciona el tipo de datos que la función o procedimiento devuelve a la Sentencia CALL. La sentencia CALL ... INTO especifica la variable a la que se asigna el valor de retorno. El ejemplo de este tema muestra cómo se utilizan juntas una sentencia RETURNS y una CALL ... INTO para asignar la sentencia RETURN. 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.
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; -- -- aquí podría insertarse más proceso -- antes de direccionar el pedido al terminal adecuado -- RETURN SpecialOrder; END; CREATE FUNCTION IsBulkOrder (P1 REFERENCE) RETURNS BOOLEAN BEGIN -- Declarar e inicializar variables-- DECLARE a INT 1; DECLARE PriceTotal FLOAT 0.0; DECLARE NumItems INT 0; DECLARE iroot REFERENCE TO P1; -- Calcular valor del pedido, pero si es una compra de gran volumen, -- -- el pedido tendrá que manejarse de otro modo (descuento incluido), -- -- por lo tanto, devolver TRUE o FALSE dependiendo del tamaño del pedido -- 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. En el ejemplo, la sentencia CALL IsBulkOrder(InputRoot.XMLNS.Invoice.Purchases) INTO SpecialOrder; también se puede escribir como SpecialOrder = IsBulkOrder(InputRoot.XMLNS.Invoice.Purchases);
Si está utilizando la sentencia PROPAGATE en el nodo, es importante que utilice una RETURN FALSE; para impedir la propagación automática del mensaje al nodo siguiente del flujo de mensajes. Consulte la Sentencia PROPAGATE para ver un ejemplo de cómo impedir la propagación implícita al final del proceso en un nodo Compute.