Declaración de procedimiento SQL (SQL PL)
Una sentencia de control SQL puede permitir especificar varias sentencias SQL en la sentencia de control SQL. Estas sentencias se definen como sentencias de procedimiento de SQL.
Sintaxis
- 1 La sentencia no está permitida en un cuerpo de rutina SQL para una función SQL.
- 2 La sentencia no está permitida en un SQL-trigger-body para ningún trigger, y un procedimiento que contenga la sentencia no debe ser invocado directa o indirectamente desde el cuerpo de un trigger BEFORE.
- 3 Una sentencia FETCH no debe especificar una cláusula de orientación de búsqueda, una cláusula de búsqueda de varias filas, las cláusulas WITH CONTINUE o CURRENT CONTINUE.
- 4 La sentencia no está permitida en un cuerpo de SQL-trigger para un trigger BEFORE, y un procedimiento que contenga la sentencia no debe ser invocado directa o indirectamente desde el cuerpo de un trigger BEFORE.
- 5 Las sentencias COMMIT y ROLLBACK (sin la cláusula TO SAVEPOINT) sólo deben especificarse dentro del cuerpo de un procedimiento SQL.
- 6 Las sentencias CONNECT, RELEASE connection y SET CONNECTION sólo deben especificarse dentro del cuerpo de un procedimiento SQL.
- 7 Las sentencias CREATE TABLE no deben incluir columnas LOB o XML.
- 8 Sólo se permiten las sentencias DROP TABLE, DROP VIEW y DROP INDEX.
- 9 Las sentencias SET de registro especial están permitidas en un cuerpo SQL-trigger para un trigger, excepto para SET CURRENT PACKAGE PATH y SET CURRENT PACKAGESET.
La siguiente tabla resume qué instrucciones SQL se pueden utilizar en el cuerpo de un procedimiento SQL, en el cuerpo de una función SQL o en el cuerpo de un disparador SQL o en un procedimiento al que se hace referencia en un disparador BEFORE. Una marca de verificación indica que una sentencia es compatible con cada tipo de rutina.
| Sentencia | ¿Cuerpo de procedimiento SQL? | ¿Cuerpo de función SQL? | ¿Cuerpo de activación SQL? |
|---|---|---|---|
| Declaración de control SQL | ✓ | ✓ | ✓ |
| ALLOCATE CURSOR | ✓ | ✓ | |
| ALTER DATABASE | ✓ | ||
| ALTER FUNCTION (escalar externo, tabla externa, sourced, escalar SQL o tabla SQL) | ✓ | ✓ | ✓4 |
| ALTER MASK | ✓ | ||
| ALTER PERMISSION | ✓ | ||
| ALTER PROCEDURE (externo, SQL - externo o SQL - nativo) | ✓ | ✓ | |
| ALTER SEQUENCE | ✓ | ||
| ALTER STOGROUP | ✓ | ||
| ALTER TABLE | ✓ | ||
| ALTER TABLESPACE | ✓ | ||
| ALTER TRIGGER | ✓ | ||
| ALTER TRUSTED CONTEXT | ✓ | ||
| ALTER VIEW | ✓ | ||
| ASSOCIATE LOCATORS | ✓ | ✓ | ✓ |
| CALL | ✓ | ✓ | ✓ |
| CLOSE | ✓ | ✓ | ✓ |
| COMENTAR | ✓ | ✓4 | |
| COMMIT | ✓ | ||
| CONNECT | ✓ | ✓ | |
| CREATE ALIAS | ✓ | ||
| CREATE DATABASE | ✓ | ||
| CREATE FUNCTION | ✓ | ||
| CREATE GLOBAL TEMPORARY TABLE | ✓ | ||
| CREATE INDEX | ✓ | ✓4 | |
| CREATE PROCEDURE (externo) | ✓ | ||
| CREATE ROLE | ✓ | ||
| CREATE SEQUENCE | ✓ | ||
| CREATE STOGROUP | ✓ | ||
| CREATE TABLE | ✓ 7 | ✓ 7 | ✓ 7 |
| CREATE TABLESPACE | ✓ | ||
| CREATE TRUSTED CONTEXT | ✓ | ||
| CREATE TYPE (matriz) | ✓ | ||
| CREATE TYPE (diferenciado) | ✓ | ||
| CREATE VARIABLE | ✓ | ||
| CREATE VIEW | ✓ | ✓ 4 | |
| DECLARE CURSOR | ✓ | ✓ | ✓ |
| DELETE | ✓4 | ✓4 | |
| DROP | ✓8 | ✓ 8 | |
| EXCHANGE | ✓ | ||
| EXECUTE | ✓ | ✓ | ✓ |
| EXECUTE IMMEDIATE | ✓ | ✓ | ✓ |
| EXPLAIN | ✓ | ✓ | |
| FETCH | ✓ 3 | ✓ 3 | ✓ 3 |
| GET DIAGNOSTICS | ✓ | ✓ | ✓ |
| OTORGAR | ✓ | ✓ 4, 7 | |
| INSERT | ✓ | ✓ | ✓4 |
| ETIQUETA | ✓ | ✓ 4 | |
| LOCK TABLE | ✓ | ✓ 4 | |
| MERGE | ✓ | ✓ 4 | |
| OPEN | ✓ | ✓ | ✓ |
| PREPARE | ✓ | ✓ | ✓ |
| REFRESH TABLE | ✓ | ✓ | ✓ 4 |
| CONEXIÓN de la LIBERACIÓN | ✓ | ||
| RELEASE SAVEPOINT | ✓ | ||
| RENAME | ✓ | ✓ | ✓ |
| REVOCAR | ✓ | ✓ | ✓ |
| ROLLBACK (con cláusula TO SAVEPOINT) | ✓ | ||
| ROLLBACK (sin cláusula TO SAVEPOINT) | ✓ | ✓ | |
| SAVEPOINT | ✓ | ✓4 | |
| SELECT INTO | ✓ | ✓ | ✓ |
| SET asignación-declaración | ✓ | ✓ | ✓ |
| SET CONNECTION | ✓ | ||
| SET registro especial | ✓ | ✓ | ✓ 9 |
| TRUNCATE | ✓ | ✓ | ✓ 4 |
| UPDATE | ✓ | ✓ | ✓4 |
| VALUES INTO | ✓ | ✓ | ✓ |
Las notas siguientes se utilizan tanto en el diagrama sintáctico precedente como, a veces, en la tabla anterior.
- La sentencia no está permitida en un cuerpo de rutina SQL para una función SQL.
- La sentencia no está permitida en un SQL-trigger-body para ningún trigger, y un procedimiento que contenga la sentencia no debe ser invocado directa o indirectamente desde el cuerpo de un trigger BEFORE.
- Una sentencia FETCH no debe especificar una cláusula de orientación de búsqueda, una cláusula de búsqueda de varias filas, las cláusulas WITH CONTINUE o CURRENT CONTINUE.
- La sentencia no está permitida en un cuerpo de SQL-trigger para un trigger BEFORE, y un procedimiento que contenga la sentencia no debe ser invocado directa o indirectamente desde el cuerpo de un trigger BEFORE.
- Las sentencias COMMIT y ROLLBACK (sin la cláusula TO SAVEPOINT) sólo deben especificarse dentro del cuerpo de un procedimiento SQL.
- Las sentencias CONNECT, RELEASE connection y SET CONNECTION sólo deben especificarse dentro del cuerpo de un procedimiento SQL.
- Las sentencias CREATE TABLE no deben incluir columnas LOB o XML.
- Sólo se permiten las sentencias DROP TABLE, DROP VIEW y DROP INDEX.
- Las sentencias SET special-register están permitidas en un SQL-trigger-body para un trigger, excepto para SET CURRENT PACKAGE PATH y SET CURRENT PACKAGESET.
Descripción
- Declaración de control SQL
- Especifica una instrucción SQL que proporciona la capacidad de controlar el flujo lógico, declarar y establecer variables, y manejar advertencias y excepciones, tal como se define en esta sección. Las sentencias de control son compatibles con las rutinas SQL.
- sentencia_sql
- Especifica una sentencia de SQL. Estas sentencias se describen en Sentencias SQL en Db2 for z/OS.
Notas
- Comentarios
Los comentarios pueden incluirse en el cuerpo de una rutina SQL. Además de la forma de comentarios con doble guión (--), un comentario puede comenzar con /* y terminar con */. Las siguientes reglas se aplican a esta forma de comentario:
- Los caracteres iniciales /* deben estar adyacentes y en la misma línea.
- Los caracteres finales */ deben estar adyacentes y en la misma línea.
- Los comentarios pueden iniciarse dondequiera que haya un espacio válido.
- Los comentarios pueden continuar en la siguiente línea.
- Detección y procesamiento de condiciones de error y advertencia
A medida que se ejecuta una instrucción SQL, Db2 almacena información sobre el procesamiento de la instrucción en un área de diagnóstico (incluidos SQLSTATE y SQLCODE), a menos que se indique lo contrario en la descripción de la instrucción SQL. Una condición de finalización puede indicar que la instrucción SQL se completó correctamente, se completó con una condición de advertencia o se completó con una condición de no encontrado. Una condición de excepción indica que la instrucción SQL no se ha realizado correctamente.
Se puede definir un controlador de condiciones para que se ejecute cuando se produzca una condición de excepción, una condición de advertencia o una condición de no encontrado en una sentencia compuesta. La declaración de un controlador de condiciones incluye el código que se ejecuta cuando se activa el controlador de condiciones. Cuando se produce una condición distinta de la finalización con éxito en el procesamiento de la instrucción de procedimiento SQL y un controlador de condiciones que puede manejar la condición está dentro del alcance, se activará uno de esos controladores de condiciones para procesar la condición. Consulte la declaración compuesta para obtener información sobre la definición de gestores de condiciones. El código del controlador de condiciones puede comprobar si existe una condición de advertencia, una condición de no encontrado o una condición de excepción y puede tomar las medidas adecuadas. Utilice uno de los siguientes métodos al principio del cuerpo de un controlador de condición para comprobar la condición en el área de diagnóstico que provocó la activación del controlador.
- Emitir una declaración GET DIAGNOSTICS para solicitar la información del área de diagnóstico. Véase la sentencia GET DIAGNOSTICS.
- Prueba las variables SQL SQLSTATE y SQLCODE.
Si la condición es una advertencia y no existe un controlador para la condición, los dos métodos anteriores pueden utilizarse fuera del cuerpo de un controlador de condición, si se utilizan inmediatamente después de la declaración para la que se desea la condición. Si la condición es un error y no existe un controlador para la condición, la rutina termina con la condición de error.
