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.

Un parámetro no es visible en las funciones que invoca la función que contiene el parámetro; sin embargo, un parámetro se puede pasar como argumento de aquellas otras funciones.

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 (no un registro fijo), el modificador inOut es el único válido.

Si el parámetro es un registro fijo, se aplican las normas 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

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
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 no sea un registro fijo); o para un registro fijo 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 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. Tampoco puede especificar el modificador out para un registro, o para un registro fijo 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.

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

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
  • La capacidad para probar el truncamiento está disponible independientemente del valor de isNullable
  • 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.