Parámetros de función

El diagrama de sintaxis para un parámetro de función es el siguiente:

Diagrama de sintaxis para un parámetro de función
nombreParámetro
Especifica el nombre de un parámetro. Para conocer las reglas, consulte Convenios de denominación.

Si especifica el modificador inOut o out (como es posible para un parámetro que no está basado en un tipo de referencia), los cambios realizados en el valor del parámetro están disponibles en la función invocadora. Los modificadores se describen posteriormente y en la sección Implicaciones de inOut y los modificadores relacionados. Para obtener detalles acerca de cómo tratar los tipos de referencia, consulte el apartado Variables de referencia y NIL en EGL.

Un parámetro puede pasarse como argumento a otra función. De lo contrario, un parámetro no es visible para las funciones invocadas por la función que lo contiene.

Un parámetro que termina en corchetes ([ ]) es una matriz dinámica, y las demás especificaciones declaran aspectos de cada elemento de esa matriz.

nombreComponente
Nombre de un componente, que puede ser un componente de registro, diccionario, arrayDictionary o un tipo de referencia.
La entrada y salida (E/S) de un registro fijo está sujeta a las siguientes consideraciones:
  • Un registro fijo pasado desde otra función en el mismo programa incluye información de estado de registro, como por ejemplo el valor de error de E/S endOfFile, pero sólo si el registro es del mismo tipo que el parámetro. De forma parecida, cualquier cambio en el estado del registro se devuelve al invocante, de modo que, si realiza una operación de E/S en un parámetro del registro, las pruebas realizadas en ese registro pueden producirse en la función actual, en el invocante o en una función a la que llame la función actual.

    Las funciones de biblioteca no reciben información de estado de registro.

  • Cualquier operación de E/S realizada en el registro fijo utiliza las propiedades de registro especificadas para el parámetro, no las propiedades de registro especificadas para el argumento.
  • Para los registros fijos de tipo indexedRecord, mqRecord, relativeRecord o serialRecord, el archivo o cola de mensajes asociada con la declaración de registro se trata como recurso de la unidad de ejecución en lugar de como recurso de programa. Las declaraciones de registro locales comparten el mismo archivo (o cola) siempre que la propiedad de registro fileName (o queueName) tiene el mismo valor. Sólo puede asociarse un archivo físico simultáneamente con un nombre de archivo o cola, independientemente de cuántos registros estén asociados con el archivo o cola en la unidad de ejecución, y EGL refuerza esta norma cerrando y reabriendo los archivos según convenga.
inOut (no soportado para tipos de referencia)
La función recibe el valor del argumento como una entrada y el invocador recibe los cambios en el parámetro cuando termina la función. Sin embargo, si el argumento es un literal o una constante, el argumento se trata como si el modificador in estuviera en vigor.

El modificador inOut es necesario si el parámetro es un campo y si especifica el modificador field, lo que indica que el parámetro tiene atributos de campo de formulario con posibilidad de prueba como blanks o numeric.

Si el parámetro es un registro, se aplican las reglas siguientes:
  • Si intenta utilizar ese registro para acceder a un archivo o una base de datos en la función actual (o en una función invocada por la función actual), debe especificar el modificador inOut o aceptar ese modificar por omisión
  • Si el tipo de registro es el mismo para el argumento y el parámetro (por ejemplo si ambos son registros de serie) la información de estado específica de registro como por ejemplo el estado de final de archivo está disponible en la función y se devuelve al invocador, pero sólo si el modificador inOut está en vigor

Al especificar una serie de longitud limitada como parámetro de función cuyo modificador es out, el límite de longitud debe ser el mismo en el argumento y en el parámetro.

Si el modificador inOut está en vigor, el argumento relacionado debe tener compatibilidad de referencia con el parámetro, como se describe en el apartado Compatibilidad de referencia en EGL.

in (no soportado para tipos de referencia)
La función recibe el valor del argumento como una entrada, pero el invocador no se ve afectado por cambios realizados en el parámetro.

No puede utilizar el modificador in para un campo que tenga el modificador field. Además, no puede especificar el modificador in para un registro que se utilice para acceder a un archivo o una base de datos en la función actual o en una función invocada por la función actual.

Al especificar una serie de longitud limitada como parámetro de función cuyo modificador es in, cualquier entrada de texto es válida:
  • Si en el origen hay más caracteres que los que son válidos en el destino, el entorno de ejecución de EGL trunca el contenido copiado para que quepa en la longitud disponible.
  • Si en el origen hay menos caracteres que los que son válidos en el destino, el entorno de ejecución de EGL rellena con blancos el contenido copiado hasta la longitud especificada.
out (no soportado para tipos de referencia)
La función no recibe el valor del argumento como una entrada; en lugar de esto, el valor de entrada se inicializa según las reglas descritas en la sección Inicialización de datos. El valor del parámetro se asigna al argumento cuando la función efectúa el retorno.

Si el argumento es un literal o una constante, el argumento se trata como si el modificador in estuviera en vigor.

No puede utilizar el modificador out para un parámetro que tenga el modificador field. Además, no puede especificar el modificador out para un registro que se utilice para acceder a un archivo o una base de datos en la función actual o en una función invocada por la función actual.

Al especificar una serie de longitud limitada como parámetro de función cuyo modificador es out, el límite de longitud debe ser el mismo en el argumento y en el parámetro.

nombreComponenteElementoDatos
Un componente DataItem que es visible para la función y que actúa como typedef (un modelo de formato) de un parámetro.
tipoPrimitivo
Tipo de un campo primitivo. En función del tipo, puede ser necesaria la siguiente información:
  • La longitud del parámetro, que es un entero que representa el número de caracteres o dígitos del área de memoria.
  • Para algunos tipos numéricos puede especificar un entero que represente el número de posiciones después de la coma decimal. La coma decimal no se almacena con los datos.
  • Para un campo de tipo INTERVAL o TIMESTAMP, puede especificar una máscara de fecha y hora, que asigna un significado (como por ejemplo "dígito de año") a una posición dada en el valor de elemento.

En un servicio, un parámetro no puede ser de tipo ANY, BLOB ni CLOB.

tipoLoose
Un tipo loose es una clase especial de tipo primitivo que sólo se utiliza para parámetros de función. Este tipo se utiliza si se desea que el parámetro acepte un rango de longitudes de argumento. La ventaja consiste en que puede invocar la función repetidamente y pasar un argumento de longitud diferente cada vez.
Los valores válidos son los siguientes:
  • CHAR
  • DBCHAR
  • HEX
  • MBCHAR
  • NUMBER
  • UNICODE

Si desea que el parámetro acepte un número de cualquier tipo primitivo y longitud, especifique NUMBER como tipo loose. En este caso, el número pasado al parámetro no debe tener posiciones decimales.

Si desea que el parámetro acepte una serie de un tipo primitivo determinado pero cualquier longitud, especifique CHAR, DBCHAR, MBCHAR, HEX o UNICODE como tipo loose y asegúrese de que el argumento es del tipo primitivo correspondiente.

La definición del argumento determina lo que ocurre cuando una sentencia de la función opera sobre un parámetro de tipo loose.

Los tipos loose no están disponibles en funciones declaradas en bibliotecas o servicios.

Para obtener detalles acerca de los tipos primitivos, consulte el apartado Tipos primitivos.

field
Indica que el parámetro tiene atributos de campo de formulario, como por ejemplo blanks o numeric. Dichos atributos pueden probarse en una expresión lógica.

El modificador field solo está disponible si especifica el modificador inOut o acepta el modificador inOut predeterminado.

El modificador field no está disponible para parámetros de función en un servicio o en una biblioteca de tipo nativeLibrary.

nullable
El modificador nullable indica que el parámetro puede establecerse en nulo y que la función tiene acceso a la información de estado necesaria para probar la anulación en una expresión lógica.
El modificador nullable es significativo solo en el caso siguiente:
  • La opción del descriptor itemsNullable se establece en yes, o bien
  • Independientemente del valor de esa opción del descriptor de construcción, el argumento es un campo en un registro no fijo o es un campo de estructura en un registro SQL y la propiedad de nivel de campo isNullable se establece en yes.

Si la función está en un componente de servicio o en un componente de interfaz de tipo basicInterface, solo se aplica el segundo caso porque la opción del descriptor de construcción itemsNullable siempre se establece en no.

Puede especificar nullable independientemente de si el modificador inOut, in o out está en vigor. Sin embargo, cuando inOut se está utilizando, se aplican las reglas siguientes:
  • Un argumento que tiene posibilidad de nulos es compatible con un parámetro con o sin posibilidad de nulos
  • Un argumento que no es anulable necesita un parámetro no anulable porque si el parámetro fuera anulable, la función podría anular el parámetro pero no devolver el indicador nulo al invocador

Implicaciones de inOut y los modificadores relacionados

Para conocer mejor los modificadores inOut, out e in, revise el ejemplo siguiente, que muestra (en comentarios) los valores de distintas variables en distintos puntos de ejecución.
program inoutpgm 
	a int;
	b int;
	c int;

	function main()
		a = 1;
		b = 1;
		c = 1;

		func1(a,b,c);

		// a = 1          
		// b = 3          
		// c = 3 		
	end

	function func1(x int in, y int out, z int inout)
		// a = 1          x = 1
		// b = 1          y = 0
		// c = 1          z = 1
		
		x = 2;
		y = 2;
		z = 2;

		// a = 1          x = 2
		// b = 1          y = 2
		// c = 2          z = 2

		func2();
		func3(x, y, z);
		// a = 1          x = 2
		// b = 1          y = 3
		// c = 3          z = 3

	end

	function func2()
		// a = 1          
		// b = 1          
		// c = 2          
			
	end

	function func3(q int in, r int out, s int inout)
		// a = 1          x = unresolved   q = 2
		// b = 1          y = unresolved   r = 2 
		// c = 2          z = unresolved   s = 2   
		
		q = 3;
		r = 3;
		s = 3;

		// a = 1          x = unresolved   q = 3
		// b = 1          y = unresolved   r = 3 
		// c = 3          z = unresolved   s = 3   


	end
	
Comentarios
(C) Copyright IBM Corporation 2000, 2005. Reservados todos los derechos.