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

Diagrama de sintaxis de lecturaOmitir diagrama de sintaxis visualRETURNexpresión

Función principal

Cuando se utiliza en la Función principal, la sentencia RETURN detiene el proceso del módulo y devuelve el control al nodo siguiente de un flujo de mensajes. En la Función principal, la sentencia RETURN debe contener una expresión de tipo BOOLEAN. El comportamiento de la sentencia RETURN en la Función principal depende del nodo. En el nodo Compute, por ejemplo, si la expresión es cualquier cosa que no sea TRUE, la propagación del mensaje se detiene. En el nodo Filter, sin embargo, el mensaje se propaga al terminal que coincide con el valor de expresión: TRUE, FALSE y UNKNOWN. La tabla siguiente describe las diferencias entre la sentencia RETURN cuando se utiliza en la Función principal de los nodos Compute, Filter y Database.
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

El ejemplo siguiente, que se basa en Ejemplo de mensaje, ilustra cómo RETURN, RETURNS y CALL ...INTO:
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.