0% encontró este documento útil (0 votos)
46 vistas

Trans SQL

Este documento describe la programación en Transact SQL. Introduce los procedimientos almacenados como bloques de código que pueden aceptar parámetros y devolver valores. Explica cómo crear procedimientos almacenados usando la sentencia CREATE PROCEDURE, incluyendo la definición de parámetros. También cubre cómo ejecutar procedimientos almacenados y eliminarlos usando las sentencias EXEC y DROP PROCEDURE respectivamente.

Cargado por

Andi Lizarraga
Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como DOCX, PDF, TXT o lee en línea desde Scribd
0% encontró este documento útil (0 votos)
46 vistas

Trans SQL

Este documento describe la programación en Transact SQL. Introduce los procedimientos almacenados como bloques de código que pueden aceptar parámetros y devolver valores. Explica cómo crear procedimientos almacenados usando la sentencia CREATE PROCEDURE, incluyendo la definición de parámetros. También cubre cómo ejecutar procedimientos almacenados y eliminarlos usando las sentencias EXEC y DROP PROCEDURE respectivamente.

Cargado por

Andi Lizarraga
Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como DOCX, PDF, TXT o lee en línea desde Scribd
Está en la página 1/ 9

Programación en TRANSACT SQL

9.1. Introducción
Hasta ahora hemos estudiado sentencias SQL orientadas a realizar una determinada tarea sobre la
base de datos como definir tablas, obtener información de las tablas, actualizarlas; estas sentencias las
hemos ejecutado desde el editor de consultas del MSSMS de una en una o a lo sumo una a
continuación de la otra dentro de la misma consulta formando un lote de instrucciones.

Las sentencias que ya conocemos son las que en principio forman parte de cualquier lenguaje SQL.
Ahora veremos que TRANSACT-SQL va más allá de un lenguaje SQL cualquiera ya que aunque no
permita:

Crear interfaces de usuario.

Crear aplicaciones ejecutables, sino elementos que en algún momento llegarán al servidor de datos y
serán ejecutados.

Incluye características propias de cualquier lenguaje de programación, características que nos


permiten definir la lógica necesaria para el tratamiento de la información:

 Tipos de datos.

 Definición de variables.

 Estructuras de control de flujo.

 Gestión de excepciones.

 Funciones predefinidas.

 Elementos para la visualización, que permiten mostrar mensajes definidos por el usuario gracias
a la cláusula PRINT.

Estas características nos van a permitir crear bloques de código orientados a realizar operaciones más
complejas. Estos bloques no son programas sino procedimientos o funciones que podrán ser llamados
en cualquier momento.

En SQL Server 2005 podemos definir tres tipos de bloques de código, los procedimientos almacenados,
los desencadenadores (o triggers) y funciones definidas por el usuario.

Nosotros estudiaremos los dos primeros.

Empezaremos por los procedimientos almacenados, veremos primero las sentencias para crear y
eliminar procedimientos almacenados, luego estudiaremos las instrucciones Transact-SQL más propias
de un lenguaje de programación nombradas en el tema de Introducción al Transact-SQL como son por
ejemplo los bucles y estructuras condicionales. Estas instrucciones las utilizaremos dentro de
procedimientos almacenados pero veremos que también nos servirán para definir otros bloques de
código.
Terminaremos esta unidad de programación estudiando los disparadores o Triggers muy similares a
los procedimientos almacenados que difieren básicamente en la forma en que entran en
funcionamiento.
9.2. Procedimientos almacenados STORE PROCEDURE
Un procedimiento almacenado (STORE PROCEDURE) está formado por un conjunto de instrucciones
Transact-SQL que definen un determinado proceso, puede aceptar parámetros de entrada y devolver
un valor o conjunto de resultados. Este procedimiento se guarda en el servidor y puede ser ejecutado
en cualquier momento.

Los procedimientos almacenados se diferencian de las instrucciones SQL ordinarias y de los lotes de
instrucciones SQL en que están precompilados. La primera vez que se ejecuta un procedimiento, el
procesador de consultas de SQL Server lo analiza y prepara un plan de ejecución que se almacena en
una tabla del sistema. Posteriormente, el procedimiento se ejecuta según el plan almacenado. Puesto
que ya se ha realizado la mayor parte del trabajo de procesamiento de consultas, los procedimientos
almacenados se ejecutan casi de forma instantánea por lo que el uso de procedimientos almacenados
mejora notablemente la potencia y eficacia del SQL.

SQL Server incorpora procedimientos almacenados del sistema, se encuentran en la base de datos
master y se reconocen por su nombre, todos tienen un nombre que empieza por sp_. Permiten
recuperar información de las tablas del sistema y pueden ejecutarse en cualquier base de datos del
servidor.

También están los procedimientos de usuario, los crea cualquier usuario que tenga los permisos
oportunos.

Se pueden crear también procedimiento temporales locales y globales. Un procedimiento temporal


local se crea por un usuario en una conexión determinada y sólo se puede utilizar en esa sesión, un
procedimiento temporal global lo pueden utilizar todos los usuarios, cualquier conexión puede
ejecutar un procedimiento almacenado temporal global. Éste existe hasta que se cierra la conexión
que el usuario utilizó para crearlo, y hasta que se completan todas las versiones del procedimiento que
se estuvieran ejecutando mediante otras conexiones. Una vez cerrada la conexión que se utilizó para
crear el procedimiento, éste ya no se puede volver a ejecutar, sólo podrán finalizar las conexiones que
hayan empezado a ejecutar el procedimiento.

Tanto los procedimientos temporales como los no temporales se crean y ejecutan de la misma forma,
el nombre que le pongamos indicará de qué tipo es el procedimiento.

Los procedimientos almacenados se crean mediante la sentencia CREATE PROCEDURE y se ejecutan


con EXEC (o EXECUTE). Para ejecutarlo también se puede utilizar el nombre del procedimiento
almacenado sólo, siempre que sea la primera palabra del lote. Para eliminar un procedimiento
almacenado utilizamos la sentencia DROP PROCEDURE.

9.3. Eliminar procedimientos almacenados


Aunque no sabemos todavía crear un procedimiento comentaremos aquí la instrucción para eliminar
procedimientos y así podremos utilizarla en los demás ejercicios.

DROP {PROC|PROCEDURE} [nombreEsquema.]nombreProcedimiento [,...n ].

Transact-SQL permite abreviar la palabra reservada PROCEDURE por PROC sin que ello afecte a la
funcionalidad de la instrucción.

Ejemplos:
DROP PROCEDURE Dice_Hola;

Elimina el procedimiento llamado Dice_Hola.

DROP PROC Dice_Hola;

Es equivalente, PROC y PROCEDURE indican lo mismo.

Para eliminar varios procedimientos de golpe, indicamos sus nombres separados por comas:

DROP PROCEDURE Dice_Hola, Ventas_anuales;

Elimina los procedimientos Dice_Hola y Ventas_anuales.

9.4. Crear y ejecutar un procedimiento


CREATE PROCEDURE

Para crear un procedimiento almacenado como hemos dicho se emplea la instrucción CREATE
PROCEDURE:

CREATE {PROC|PROCEDURE} [NombreEsquema.]NombreProcedimiento


[{@parametro tipo} [VARYING] [= valorPredet] [OUT|OUTPUT] ] [,...n]
AS { <bloque_instrucciones> [ ...n] }[;]
<bloque_instrucciones> ::=
{[BEGIN] instrucciones [END] }

Las instrucciones CREATE PROCEDURE no se pueden combinar con otras instrucciones SQL en el mismo
lote.
Después del verbo CREATE PROCEDURE indicamos el nombre del procedimiento, opcionalmente
podemos incluir el nombre del esquema donde queremos que se cree el procedimiento, por defecto se
creará en dbo. Ya que Sqlserver utiliza el prefijo sp_ para nombrar los procedimientos del sistema se
recomienda no utilizar nombres que empiecen por sp_.

Como se puede deducir de la sintaxis (no podemos indicar un nombre de base de datos asociado al
nombre del procedimiento) sólo se puede crear el procedimiento almacenado en la base de datos
actual, no se puede crear en otra base de datos.

Si queremos definir un procedimiento temporal local el nombre deberá empezar por una almohadilla
(#) y si el procedimiento es temporal global el nombre debe de empezar por ##.

El nombre completo de un procedimiento almacenado o un procedimiento almacenado temporal


global, incluidas ##, no puede superar los 128 caracteres. El nombre completo de un procedimiento
almacenado temporal local, incluidas #, no puede superar los 116 caracteres.
Transact-SQL permite abreviar la palabra reservada PROCEDURE por PROC sin que ello afecte a la
funcionalidad de la instrucción.

CREATE PROC Calcula_comision AS…

Es equivalente a

CREATE PROCEDURE calcula_comision AS…

@parametro: representa el nombre de un parámetro. Se pueden declarar uno o más parámetros


indicando para cada uno su nombre (debe de empezar por arroba) y su tipo de datos, y opcionalmente
un valor por defecto (=valorPredet) este valor será el asumido si en la llamada el usuario no pasa
ningún valor para el parámetro. Un procedimiento almacenado puede tener un máximo de 2.100
parámetros.

Los parámetros son locales para el procedimiento; los mismos nombres de parámetro se pueden
utilizar en otros procedimientos. De manera predeterminada, los parámetros sólo pueden ocupar el
lugar de expresiones constantes; no se pueden utilizar en lugar de nombres de tabla, nombres de
columna o nombres de otros objetos de base de datos.

VARYING Sólo se aplica a los parámetros de tipo cursor por lo que se explicará cuando se expliquen los
cursores.

OUTPUT | OUT (son equivalentes)

Indica que se trata de un parámetro de salida. El valor de esta opción puede devolverse a la instrucción
EXECUTE que realiza la llamada.

El parámetro variable OUTPUT debe definirse al crear el procedimiento y también se indicará en la


llamada junto a la variable que recogerá el valor devuelto del parámetro. El nombre del parámetro y
de la variable no tienen por qué coincidir; sin embargo, el tipo de datos y la posición de los parámetros
deben coincidir a menos que se indique el nombre del parámetro en la llamada de la forma
@parametro=valor.

Procedimiento básico

CREATE PROCEDURE Dice_Hola


AS
PRINT ‘Hola’;
GO –- Indicamos GO para cerrar el lote que crea el procedimiento y empezar otro lote.
EXEC Dice_Hola; -- De esta forma llamamos al procedimiento (se ejecuta).

En este caso, como la llamada es la primera del lote (va detrás del GO) podíamos haber obviado la
palabra EXEC y haber escrito directamente:

Dice_Hola
Con un parámetro de entrada (la palabra que queremos que escriba)

CREATE PROCEDURE Dice_Palabra @palabra CHAR(30)


AS
PRINT @palabra;
GO
EXEC Dice_Palabra ‘Lo que quiera’;
EXEC Dice_Palabra ‘Otra cosa’;

Aquí hemos hecho dos llamadas, una con el valor ‘Lo que quiera’ y otra con el valor ‘Otra cosa’.

Con varios parámetros

Si queremos indicar varios parámetros los separamos por comas.

USE Biblio;
--DROP PROC VerUsuariosPoblacion; --La comentamos la primera vez
GO
CREATE PROCEDURE VerUsuariosPoblacion @pob CHAR(30),@pro CHAR(30)
AS
SELECT * FROM usuarios WHERE poblacion=@pob AND provincia = @pro;
GO
EXEC VerUsuariosPoblacion Madrid, Valencia

En la llamada podemos indicar los valores de los parámetros de varias formas,

indicando sólo el valor de los parámetros (en este caso los tenemos que indicar en el mismo orden en
que están definidos) como en el ejemplo anterior, o bien indicando el nombre del parámetro:

EXEC VerUsuariosPoblacion @pob=Madrid, @pro=Valencia

Indicar el nombre del parámetro en la llamada también nos permite indicar los valores en cualquier
orden, la siguiente llamada es equivalente a la anterior, hemos invertido el orden y se ejecuta igual:

EXEC VerUsuariosPoblacion @pro=Valencia, @pob=Madrid

En este procedimiento todos los parámetros son obligatorios, no deja llamar con un solo parámetro.

EXEC VerUsuariosPoblacion Madrid


Da error.

Con parámetros opcionales

Para definir un parámetro opcional tenemos que asignarle un valor por defecto en la definición del
procedimiento.

DROP PROC VerUsuariosPoblacion2;


GO
CREATE PROCEDURE VerUsuariosPoblacion2 @pob CHAR(30),@pro CHAR(30)='Madrid'
AS
SELECT * FROM usuarios WHERE poblacion=@pob AND provincia = @pro;
GO
EXEC VerUsuariosPoblacion2 Madrid

En este caso, en la llamada sólo hemos indicado un valor, para el primer parámetro, el paramétro
opcional no lo hemos indicado y se rellenará con el valor por defecto que indicamos en la definición.
Lo podemos hacer así porque el parámetro opcional es el último de la lista de parámetros. Cuando el
parámetro opcional no es el último la llamada tiene que ser diferente, tenemos que nombrar los
parámetros en la llamada, al menos a partir del parámetro opcional.

DROP PROC VerUsuariosPoblacion3;


GO
CREATE PROCEDURE VerUsuariosPoblacion3 @a CHAR(2),@pob CHAR(30)='Madrid',@pro
CHAR(30)
AS
SELECT * FROM usuarios WHERE poblacion=@pob AND provincia = @pro;
GO
EXEC VerUsuariosPoblacion3 a,@pro='Madrid'

En este caso el parámetro opcional es el segundo de la lista de parámetros, cuando hacemos la


llamada no podemos hacer como en otros lenguajes de dejar un hueco:

EXEC VerUsuariosPoblacion3 a, ,'Madrid'

Da error.

Esta forma da error, debemos utilizar la palabra DEFAULT o indicar el nombre de todos los parámetros
que van detrás del opcional.
EXEC VerUsuariosPoblacion3 a,DEFAULT,'Madrid'

Con parámetros de salida

Un procedimiento almacenado puede también devolver resultados, definiendo el paramétro como


OUTPUT o bien utilizando la instrucción RETURN que veremos en el siguiente apartado.

Para poder recoger el valor devuelto por el procedimiento, en la llamada se tiene que indicar una
variable donde guardar ese valor.

Ejemplo:
Definimos el procedimiento ultimo_contrato que nos devuelte la fecha en que se firmó el último
contrato en una determinada oficina. El procedimiento tendrá pues dos parámetros, uno de entrada
para indicar el número de la oficina a considerar y uno de salida que devolverá la fecha del contrato
más reciente de entre los empleados de esa oficina.

USE Gestion
GO
CREATE PROC ultimo_contrato @ofi INT, @fecha DATETIME OUTPUT
AS
SELECT @fecha=(SELECT MAX(contrato) FROM empleados WHERE oficina=@ofi)
GO

Con @fecha DATETIME OUTPUT indicamos que el parámetro @fecha es de salida, el proceso que
realice la llamada podrá recoger su valor después de ejecutar el procedimiento.

En la llamada, para los parámetros de salida, en vez de indicar un valor de entrada se indica un nombre
de variable, variable que recogerá el valor devuelto por el procedimiento sin olvidar la palabra
OUTPUT:

DECLARE @ultima AS DATETIME;


EXEC ultimo_contrato 12,@ultima OUTPUT;
PRINT @ultima;

RETURN

RETURN ordena salir incondicionalmente de una consulta o procedimiento, se puede utilizar en


cualquier punto para salir del procedimiento y las instrucciones que siguen a RETURN no se ejecutan.
Además los procedimientos almacenados pueden devolver un valor entero mediante esta orden.

RETURN [expresion_entera]
Expresion_entera es el valor entero que se devuelve.

A menos que se especifique lo contrario, todos los procedimientos almacenados del sistema devuelven
el valor 0. Esto indica que son correctos y un valor distinto de cero indica que se ha producido un error.

Cuando se utiliza con un procedimiento almacenado, RETURN no puede devolver un valor NULL. Si un
procedimiento intenta devolver un valor NULL (por ejemplo, al utilizar RETURN @var si @var es NULL),
se genera un mensaje de advertencia y se devuelve el valor 0.

Si queremos recoger el valor de estado devuelto por el procedimiento la llamada debe ser distinta, y
seguir el siguiente modelo:

EXECUTE @variable_donde_recogemos_estado = nombre_procedimiento @par, ...

Con el procedimiento del punto anterior no se puede utilizar esta forma de devolver un resultado
porque lo que se devuelve es una fecha, no es un valor entero, pero si quisiéramos definir un
procedimiento que nos devuelva el número de empleados de una oficina podríamos hacerlo de dos
formas:

De la forma normal con un parámetro de salida:

USE Gestion
GO
CREATE PROC trabajadores @ofi INT, @num INT OUTPUT
AS
SELECT @num=(SELECT COUNT(*) FROM empleados WHERE oficina=@ofi)
GO

Para obtener en la variable @var el resultado devuelto por el procedimiento la llamada sería:

DECLARE @var INT;


EXEC trabajadores 12, @var OUTPUT

Utilizando return en vez de un parámetro de salida:

CREATE PROC trabajadores2 @ofi INT


AS
RETURN (SELECT COUNT(*) FROM empleados WHERE oficina=@ofi)
GO

Para obtener en la variable @var el resultado devuelto por el procedimiento la llamada sería:
DECLARE @var INT;
EXEC @var= trabajadores2 12
PRINT @var

Nos visualiza el número de trabajadores de la oficina número 12.

También podría gustarte