La sentencia CREATE PROCEDURE define un procedimiento, que es una subrutina que no tiene valor de devolución.
Si desea información sobre el uso de sentencias CONSTANT, consulte el apartado Sentencia DECLARE.
Proporcione el nombre del procedimiento utilizando ProcedureName y los parámetros del procedimiento mediante ParameterList. El procedimiento se implementa mediante la única sentencia de ESQL, Sentencia. Esta sentencia también puede ser una sentencia compuesta, por ejemplo, BEGIN ... END. De forma alternativa, puede utilizar la cláusula EXTERNAL en lugar de Sentencia; aquélla llama la rutina con nombre como procedimiento almacenado en la base de datos identificado por la propiedad de origen de datos del nodo que la contiene (consulte el apartado Procedimientos almacenados externos).
Los procedimientos ESQL y procedimientos almacenados, a diferencia de las funciones ESQL, pueden tener parámetros OUT e INOUT además de los parámetros IN. Esto les permite devolver varios valores al llamador.
Los procedimientos definidos en un módulo son de ámbito local sólo para el nodo actual. Para utilizar el mismo procedimiento en más de un nodo, defínalo en un esquema.
No se da soporte a los procedimientos internos sobrecargados. (Un procedimiento sobrecargado es aquél que tiene el mismo nombre que otro procedimiento del mismo esquema de intermediario, pero que tiene un número diferente de parámetros o parámetros con tipos diferentes). Si el intermediario detecta que un procedimiento se ha sobrecargado, activará una excepción.
Los parámetros OUT pasados a un procedimiento (interno o externo) contiene siempre un valor NULL del tipo correcto cuando lo recibe el procedimiento. Esto sucede independientemente de su valor antes de realizar la CALL.
Los parámetros IN e INOUT pueden ser NULL cuando los recibe el procedimiento. Por ejemplo, el ejemplo siguiente pasa NULL al procedimiento testProc:
DECLARE nullChar CHARACTER; CALL testProc( nullChar );
Esto sucede porque a nullChar no se ha asignado un valor antes de CALL.
Para llamar a un procedimiento almacenado, debe definir el procedimiento en la base de datos y en el intermediario en ESQL. Al escribir procedimientos almacenados, en lenguajes como C, debe utilizar indicadores NULL para asegurarse de que el procedimiento puede procesar correctamente los datos.
Puede especificar un nombre calificado o no calificado en la cláusula EXTERNAL (el calificador es el nombre del esquema de base de datos en que se ha definido el procedimiento). Si no proporciona un nombre de esquema, se utiliza el nombre de usuario de conexión de base de datos como esquema por omisión. Si el procedimiento necesario no existe en este esquema, debe proporcionar un nombre de esquema explícito.
CREATE PROCEDURE ..... EXTERNAL NAME "mySchema.myProc";
Si el procedimiento pertenece a un paquete de Oracle, debe proporcionar un nombre calificado explícito del formato:
...EXTERNAL NAME "mySchema.myPackage.myProc"
No puede utilizar comodines SQL para los nombres de esquema, paquete o procedimiento, excepto para especificar un nombre de esquema dinámico. Los comodines (signo de porcentaje, que representa uno o más caracteres, y de subrayado, que representa un solo carácter) los modifica el intermediario para incluir el carácter de escape de base de datos inmediatamente antes de cada comodín. Por consiguiente, la base de datos los recibe como caracteres literales.
La cláusula que se muestra a continuación la modifica el intermediario y mySchema.Proc\_ se pasa a la base de datos (se da por supuesto que el carácter de escape de base de datos es una barra inclinada invertida);
...EXTERNAL NAME "mySchema.Proc_"
Si especifica un nombre de esquema de base de datos como un solo carácter de porcentaje al crear el procedimiento, el intermediario lo maneja como un caso especial y resuelve el nombre durante la ejecución. La cláusula que se indica a continuación es válida e identifica un esquema de base de datos dinámica:
...EXTERNAL NAME "%.myProc"
Si utiliza esta técnica, debe incluir la cláusula EXTERNAL SCHEMA en la sentencia CALL que se utiliza para invocar este procedimiento para identificar el esquema adecuado.
En el apartado Ejemplo 1: Un procedimiento almacenado externo se muestra cómo definir y llamar un procedimiento almacenado en Oracle y DB2. Aunque las definiciones de base de datos varían entre las bases de datos, el ESQL no varía. Los nombres dados a los parámetros de ESQL no tienen que coincidir con los nombres que se proporcionan en el lado de la base de datos. Sin embargo, el nombre externo del procedimiento debe coincidir con su nombre definido en la base de datos, incluyendo especificaciones de paquete o contenedor. Encierre ExternalRoutineName entre comillas si contiene un carácter que no está permitido en un identificador.
Todos los procedimientos externos tienen las limitaciones siguientes:
ESQL Definition: DECLARE inputParm CHARACTER; DECLARE outputParm CHARACTER; DECLARE inputOutputParm CHARACTER; SET inputParm = 'Hello'; SET inputOutputParm = 'World'; CALL swapParms( inputParm, outputParm, inputOutputParm ); CREATE PROCEDURE swapParms ( IN parm1 CHARACTER, OUT parm2 CHARACTER, INOUT parm3 CHARACTER ) EXTERNAL NAME dbSwapParms;
Para registrar este procedimiento almacenado con DB2, copie el script siguiente en un archivo (por ejemplo, test1.sql) y ejecute:
db2 -td@ -vf test1.sql from DB2 command prompt. -- DB2 Example Stored Procedure DROP PROCEDURE dbSwapParms @ CREATE PROCEDURE dbSwapParms ( IN in_param CHAR(32), OUT out_param CHAR(32), INOUT inout_param CHAR(32)) LANGUAGE SQL BEGIN SET out_param = inout_param; SET inout_param = in_param; END @
Para registrar este procedimiento almacenado con Oracle, copie el script siguiente en un archivo (por ejemplo, test1.sql) y ejecute:
sqlplus <userid>/<password> @test1.sql CREATE OR REPLACE PROCEDURE dbSwapParms ( in_param IN VARCHAR2 , out_param OUT VARCHAR2, inout_param IN OUT VARCHAR2 ) AS BEGIN out_param := inout_param; inout_param := in_param; END; /
Puede esperar los siguientes resultados:
El ejemplo siguiente muestra el mismo procedimiento que en el apartado Ejemplo 1: Un procedimiento almacenado externo, pero implementado como un procedimiento interno ESQL. La sintaxis CALL para este procedimiento es el mismo, así como el resultado.
CREATE PROCEDURE swapParms ( IN parm1 CHARACTER, OUT parm2 CHARACTER, INOUT parm3 CHARACTER ) BEGIN SET parm2 = parm3; SET parm3 = parm1; END;
El procedimiento de ejemplo siguiente analiza un árbol, visitando todos los lugares en el punto inicial determinado y por debajo, e informa de lo que ha encontrado:
SET OutputRoot.MQMD = InputRoot.MQMD; DECLARE answer CHARACTER; SET answer = ''; CALL navigate(InputRoot.XML, answer); SET OutputRoot.XML.Data.FieldNames = answer; CREATE PROCEDURE navigate (IN root REFERENCE, INOUT answer CHARACTER) BEGIN SET answer = answer || 'Reached Field... Type:' || CAST(FIELDTYPE(root) AS CHARACTER)|| ': Name:' || FIELDNAME(root) || ': Value :' || root || ': '; DECLARE cursor REFERENCE TO root; MOVE cursor FIRSTCHILD; IF LASTMOVE(cursor) THEN SET answer = answer || 'Field has children... drilling down '; ELSE SET answer = answer || 'Listing siblings... '; END IF; WHILE LASTMOVE(cursor) DO CALL navigate(cursor, answer); MOVE cursor NEXTSIBLING; END WHILE; SET answer = answer || 'Finished siblings... Popping up '; END;
Si se proporciona el siguiente mensaje de entrada:
<Person><Name>John Smith</Name><Salary period='monthly' taxable='yes'>-1200</Salary></Person>
el procedimiento produce la salida siguiente, que se ha formateado manualmente:
Reached Field... Type:16777232: Name:XML: Value :: Field has children... drilling down Reached Field... Type:16777216: Name:Person: Value :: Field has children... drilling down Reached Field... Type:16777216: Name:Name: Value :John Smith: Field has children... drilling down Reached Field... Type:33554432: Name:: Value :John Smith: Listing siblings... Finished siblings... Popping up Finished siblings... Popping up Reached Field... Type:16777216: Name:Salary: Value :-1200: Field has children... drilling down Reached Field... Type:50331648: Name:period: Value :monthly: Listing siblings... Finished siblings... Popping up Reached Field... Type:50331648: Name:taxable: Value :yes: Listing siblings... Finished siblings... Popping up Reached Field... Type:33554432: Name:: Value :-1200: Listing siblings... Finished siblings... Popping up Finished siblings... Popping up Finished siblings... Popping up Finished siblings... Popping up
Conceptos relacionados
ESQL
Tareas relacionadas
Desarrollo de ESQL
Invocar procedimientos almacenados
Referencia relacionada
Preferencia de sintaxis
Sentencias ESQL
Sentencia CALL
Avisos |
Marcas registradas |
Descargas |
Biblioteca |
Soporte |
Información de retorno (feedback)
![]() ![]() |
ak04970_ |