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, que puede ser un registro o un elemento de datos; o una matriz de registros o elementos de datos. Para conocer las reglas, consulte Convenios de denominación.

Si especifica el modificador inOut o out, 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.

Los cambios realizados en un parámetro están disponibles en funciones invocadas por la función receptora, pero solo si el parámetro se pasa como un argumento.

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.

inOut
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 elemento 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 solo si el modificador inOut está en vigor
in
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 elemento 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.

out
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 invocador se ve afectado por los cambios realizados en el parámetro.

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 elemento 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.

nombreComponenteRegistro
Un componente de registro que es visible para la función y que actúa como typedef (un modelo de formato) de un parámetro. Para obtener detalles acerca de los componentes que son visibles, consulte el apartado Referencias a componentes.
La entrada y salida (E/S) del registro especificado está sujeta a las siguientes consideraciones:
  • Un registro 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 llamador, 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 llamador 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 utiliza las propiedades de registro especificadas para el parámetro, no las propiedades de registro especificadas para el argumento.
  • Para los registros 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 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.
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
El tipo primitivo del parámetro, tal como se describe en el tema del mismo nombre.
longitud
La longitud del parámetro, que es un entero que representa el número de caracteres o dígitos del área de memoria referenciada por nombreParámetro.
decimales
Para algunos tipos numéricos puede especificar decimales que es un entero que representa el número de posiciones después de la coma decimal. El número máximo de posiciones decimales es el menor de dos números: 18 o el número de dígitos declarado como longitud. La coma decimal no se almacena con los datos.
"máscaraFechaHora"
Para elementos de tipo INTERVAL o TIMESTAMP, puede especificar máscaraFechaHora", que asigna un significado (como por ejemplo "dígito de año") a una posición dada en el valor de elemento. La máscara no se almacena con los datos.
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.

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

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 una biblioteca de tipo nativeLibrary.

nullable
Indica las siguientes características del parámetro:
  • El parámetro puede establecerse en nulo
  • El parámetro tiene acceso a la información de estado necesaria para probar el truncamiento o el establecimiento en nulo en una expresión lógica
El modificador nullable sólo es significativo si el argumento pasado al parámetro es un elemento de estructura de un registro SQL. Se aplican las siguientes normas:
  • El parámetro puede establecerse en nulo y comprobarse para nulos sólo si la propiedad de elemento isNullable está establecida en yes.
  • En un programa Java, la La capacidad para probar el truncamiento está disponible independientemente del valor de isNullable. Sin embargo, en un programa COBOL la capacidad de probar el truncamiento sólo está disponible si isNullable está establecida en yes.
  • Puede especificar nullable independientemente de si el modificador inOut, in o out está en vigor.

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
	
Condiciones de uso | Comentarios
(C) Copyright IBM Corporation 2000, 2005. Reservados todos los derechos.