Sentencia CALL

La sentencia CALL llama (invoca) a una rutina.

SINTAXIS

Utilización de la sentencia CALL

La sentencia CALL invoca a una rutina. Una rutina es una función o procedimiento definido por el usuario que se ha definido mediante:
  • Una sentencia CREATE FUNCTION
  • Una sentencia CREATE PROCEDURE
Nota: Además de las funciones y procedimientos estándar definidos por el usuario, también puede utilizar CALL para invocar funciones incorporadas (proporcionadas por el intermediario) y funciones SQL definidas por el usuario. Sin embargo, la forma normal de invocar estos tipos de función es, simplemente, incluir sus nombres en expresiones.

La rutina llamada debe invocarse de forma que coincida con su definición. Por ejemplo, si se ha definido una rutina con tres parámetros, los dos primeros de tipo entero y el tercero de tipo carácter, la sentencia CALL debe pasar tres variables a la rutina, cada una del tipo de datos que se indique en la definición. Esto se denomina coincidencia exacta de signatura, que significa que la signatura proporcionada por la sentencia CALL debe coincidir con la proporcionada por la definición de la rutina.

La coincidencia exacta de signatura también se aplica al valor de retorno de una rutina. Si una rutina está definida para devolver un valor, la sentencia CALL no puede ignorar este valor. Debe utilizar la cláusula INTO para recibir el valor que se devuelve.

Puede utilizar la sentencia CALL para invocar una rutina que se ha implementado de alguna de estas maneras:
  • ESQL.
  • Java.
  • Como un procedimiento almacenado en una base de datos.
  • Como una función incorporada (proporcionada por el intermediario). (Pero vea la nota anterior sobre las llamadas a funciones incorporadas.)

Esta variedad de implementación significa que algunas de las cláusulas en el diagrama de sintaxis de CALL no son aplicables (o permitidas) a todos los tipos de rutina. También permite a la sentencia CALL invocar cualquier tipo de rutina, independientemente de cómo se haya definido la rutina.

Cuando no se especifica el parámetro opcional BrokerSchemaName, el analizador SQL de intermediario busca el procedimiento con nombre utilizando el algoritmo descrito en la sentencia PATH (consulte Cláusula PATH).

Cuando se especifica el parámetro BrokerSchemaName, el analizador SQL de intermediario invoca el procedimiento con nombre en el esquema especificado sin buscar primero en la vía de acceso. Sin embargo, si una referencia de procedimiento es ambiguo (es decir, hay dos procedimientos con el mismo nombre en distintos esquemas de intermediario) y la referencia no está calificada por el BrokerSchemaName opcional, el conjunto de herramientas Eclipse genera un "error de vista de Tareas" que debe corregir para desplegar el código ambiguo.

Las funciones incorporadas proporcionadas por el intermediario se colocan automáticamente en un esquema de intermediario predefinido denominado SQL. El esquema SQL siempre es el último elemento donde se busca una rutina que no coincide con una rutina definida por el usuario. Por tanto, un módulo definido por el usuario tiene prioridad frente a una rutina incorporada del mismo nombre.

Cada esquema de intermediario proporciona un símbolo o espacio de nombres exclusivo para una rutina, por lo que un nombre de rutina es exclusivo cuando está calificado por el nombre del esquema al que pertenece.

La cláusula INTO se utiliza para almacenar el valor de retorno de una rutina que se ha definido con una cláusula RETURNS, o desde una función incorporada. El destino puede ser una variable ESQL de un tipo de datos que coincida con el tipo de datos de la cláusula RETURNS o una referencia de mensaje separada por puntos. Por ejemplo, las dos sentencias ESQL siguientes son válidas:
        CALL myProc1() INTO cursor;
        CALL myProc1() INTO OutputRoot.XML.TestValue1; 

El método de invocación debe coincidir con el método de declaración; es decir, si la cláusula RETURNS se especifica en la sentencia CREATE FUNCTION, o la rutina es una función incorporada, la cláusula INTO debe especificarse en la sentencia CALL. No se puede ignorar el valor de retorno de una rutina. Asimismo, si la cláusula RETURNS no se especifica en la sentencia CREATE FUNCTION, no debe especificarse la cláusula INTO, porque no hay valor de retorno de la rutina.

La sentencia CALL pasa los parámetros al procedimiento en el orden en que se le han proporcionado. Los parámetros que se han definido como IN o INOUT en la definición de la rutina, se evalúan antes de ejecutar CALL pero los parámetros definidos como OUT se pasan siempre como parámetros NULL del tipo correcto. Cuando se ha completado el procedimiento, cualquier parámetro declarado como OUT o INOUT se actualiza para reflejar cualquier cambio realizado en los mismos durante la ejecución del procedimiento. Los parámetros definidos como IN no cambian nunca durante la ejecución de un procedimiento.

No se da soporte a las rutinas con el mismo nombre. Esto significa que no puede crear dos rutinas del mismo nombre en el mismo esquema de intermediario. Si el intermediario detecta que se ha cargado una rutina con el mismo nombre, genera una excepción. De igual manera, no puede invocar a un procedimiento almacenado en una base de datos cuando hay un procedimiento con el mismo nombre. Es decir, cuando existe otro procedimiento con el mismo nombre en el mismo esquema de base de datos. Sin embargo, puede invocar un método Java con el mismo nombre, siempre y cuando cree una definición ESQL aparte para cada método con el mismo nombre que desee llamar, y dé a cada definición ESQL un nombre de rutina exclusivo.

Conceptos relacionados
Visión general de ESQL
Avisos | Marcas registradas | Descargas | Biblioteca | Soporte | Su opinión
Copyright IBM Corporation 1999, 2005 Última actualización: 11/11/2005
ak04920_