Está en la página 1de 10

PROCEDIMIENTOS ALMACENADOS

Los procedimientos almacenados son mdulos o rutinas que encapsulan cdigo para su
reutilizacin. Un procedimiento almacenado puede incluir parmetros de entrada, devolver
resultados tabulares o escalares y mensajes para el cliente, invocar instrucciones de
lenguaje de definicin de datos (DDL) e instrucciones de lenguaje de manipulacin de
datos (DML), as como devolver parmetros de salida. En SQL Server 2008 existen dos
tipos de procedimientos almacenados: Transact-SQL o CLR.

Transact-SQL

Un procedimiento almacenado Transact-SQL es una coleccin guardada de instrucciones


Transact-SQL que puede tomar y devolver los parmetros proporcionados por el usuario.
Por ejemplo, un procedimiento almacenado puede contener las instrucciones necesarias
para insertar una nueva fila en una o ms tablas segn la informacin suministrada por la
aplicacin cliente o es posible que el procedimiento almacenado devuelva datos de la base
de datos a la aplicacin cliente.
Los procedimientos almacenados de MicrosoftSQL Server son similares a los
procedimientos de otros lenguajes de programacin en el sentido de que pueden:
Aceptar parmetros de entrada y devolver varios valores en forma de parmetros de
salida al lote o al procedimiento que realiza la llamada.
Contener instrucciones de programacin que realicen operaciones en la base de
datos, incluidas las llamadas a otros procedimientos.
Devolver un valor de estado a un lote o a un procedimiento que realiza una llamada
para indicar si la operacin se ha realizado correctamente o se han producido errores
(y el motivo de stos).

Puede utilizar la instruccin EXECUTE de Transact-SQL para ejecutar un procedimiento


almacenado. Los procedimientos almacenados difieren de las funciones en que no
devuelven valores en lugar de sus nombres ni pueden utilizarse directamente en una
expresin.
Utilizar procedimientos almacenados en SQL Server en vez de programas Transact-SQL
almacenados localmente en equipos cliente presenta las siguientes ventajas:
Se registran en el servidor.
Pueden incluir atributos de seguridad (como permisos) y cadenas de propiedad;
adems se les pueden asociar certificados.
Los usuarios pueden disponer de permiso para ejecutar un procedimiento almacenado sin
necesidad de contar con permisos directos en los objetos a los que se hace referencia en el
procedimiento.
Mejoran la seguridad de la aplicacin.
Permiten una programacin modular.

Puede crear el procedimiento una vez y llamarlo desde el programa tantas veces como
desee. As, puede mejorar el mantenimiento de la aplicacin y permitir que las aplicaciones
tengan acceso a la base de datos de manera uniforme.
Constituyen cdigo con nombre que permite el enlace diferido.

Esto proporciona un nivel de direccionamiento indirecto que facilita la evolucin del


cdigo.
Pueden reducir el trfico de red.

Una operacin que necesite centenares de lneas de cdigo Transact-SQL puede realizarse
mediante una sola instruccin que ejecute el cdigo en un procedimiento, en vez de enviar
cientos de lneas de cdigo por la red.
Entre las reglas para disear procedimientos almacenados se incluyen las siguientes:
La propia definicin de CREATE PROCEDURE puede incluir cualquier nmero y
tipo de instrucciones SQL, excepto las indicadas a continuacin. No pueden
utilizarse en ninguna parte de un procedimiento almacenado.

CREATE AGGREGATE CREATE RULE


CREATE DEFAULT CREATE SCHEMA
CREATE o ALTER FUNCTION CREATE o ALTER TRIGGER
CREATE o ALTER PROCEDURE CREATE o ALTER VIEW
SET PARSEONLY SET SHOWPLAN_ALL
SET SHOWPLAN_TEXT SET SHOWPLAN_XML
USE database_name

Puede crear otros objetos de base de datos dentro de un procedimiento almacenado. Puede
hacer referencia a un objeto creado en el mismo procedimiento almacenado, siempre que se
haya creado antes de hacer referencia a l.
Puede hacer referencia a tablas temporales dentro de un procedimiento almacenado.
Si crea una tabla temporal local dentro de un procedimiento almacenado, sta
existir nicamente para los fines del procedimiento y desaparecer cuando ste
finalice.
Si ejecuta un procedimiento almacenado que llama a otro procedimiento
almacenado, este ltimo puede tener acceso a todos los objetos creados por el
primero, incluidas las tablas temporales.
Si ejecuta un procedimiento almacenado remoto que realiza cambios en una
instancia remota de MicrosoftSQL Server, los cambios no se pueden revertir. Los
procedimientos almacenados remotos no intervienen en las transacciones.
El nmero mximo de parmetros en un procedimiento almacenado es de 2100.
El nmero mximo de variables locales en un procedimiento almacenado est
limitado nicamente por la memoria disponible.
En funcin de la memoria disponible, el tamao mximo de un procedimiento
almacenado es de 128 megabytes (MB).

CREATE PROCEDURE (Transact-SQL)


Crea un procedimiento almacenado Transact-SQL o Common Language Runtime (CLR) en
SQL Server 2008 R2. Los procedimientos almacenados son similares a los procedimientos
de otros lenguajes de programacin en tanto que pueden:
Aceptar parmetros de entrada y devolver varios valores en forma de parmetros de
salida al lote o al procedimiento que realiza la llamada.
Contener instrucciones de programacin que realicen operaciones en la base de
datos, incluidas las llamadas a otros procedimientos.
Devolver un valor de estado a un lote o a un procedimiento que realice una llamada
para indicar si la operacin se ha realizado correctamente o se han producido
errores, y el motivo de estos.

Sintaxis
Transact-SQL
--Transact-SQL Stored Procedure Syntax
CREATE { PROC | PROCEDURE } [schema_name.] procedure_name [ ;number ]
[ { @parameter [ type_schema_name. ] data_type }
[ VARYING ] [ = default ] [ OUT | OUTPUT ] [READONLY]
] [ ,...n ]
[ WITH <procedure_option> [ ,...n ] ]
[ FOR REPLICATION ]
AS { [ BEGIN ] sql_statement [;] [ ...n ] [ END ] }
[;]
<procedure_option> ::=
[ ENCRYPTION ]
[ RECOMPILE ]
[ EXECUTE AS Clause ]
Transact-SQL
--CLR Stored Procedure Syntax
CREATE { PROC | PROCEDURE } [schema_name.] procedure_name [ ;number ]
[ { @parameter [ type_schema_name. ] data_type }
[ = default ] [ OUT | OUTPUT ] [READONLY]
] [ ,...n ]
[ WITH EXECUTE AS Clause ]
AS { EXTERNAL NAME assembly_name.class_name.method_name }
[;]

Argumentos

schema_name }
El nombre del esquema al que pertenece el procedimiento. Los procedimientos se enlazan a
un esquema. Si no se especifica el nombre del esquema cuando se crea el procedimiento, se
asigna automticamente el esquema predeterminado del usuario que crea este
procedimiento.
procedure_name
El nombre del procedimiento. Los nombres de los procedimientos deben cumplir las reglas
de los identificadores y deben ser exclusivos en el esquema.
Evite el uso del prefijo sp_ cuando asigne nombre a los procedimientos. SQL Server usa
este prefijo para designar los procedimientos del sistema. Si usa el prefijo, puede provoca la
ruptura del cdigo de la aplicacin si existe un procedimiento del sistema con el mismo
nombre.
; number
Entero opcional que se usa para agrupar procedimientos con el mismo nombre. Estos
procedimientos agrupados se pueden quitar juntos mediante una instruccin DROP
PROCEDURE.
@ parameter

Parmetro declarado en el procedimiento. Especifique un nombre de parmetro con una arroba


(@) como el primer carcter. El nombre del parmetro se debe ajustar a las reglas de los
identificadores. Los parmetros son locales respecto al procedimiento; los mismos nombres de
parmetro se pueden usar en otros procedimientos.
Se pueden declarar uno o varios parmetros; el valor mximo es 2.100. El usuario debe
proporcionar el valor de cada parmetro declarado cuando se llame al procedimiento, a
menos que se haya definido un valor predeterminado para el parmetro o se haya
establecido en el mismo valor que el de otro parmetro. Si un procedimiento contiene
parmetros con valores de tabla y el parmetro no est en la llamada, se pasa una tabla
vaca. Los parmetros solo pueden ocupar el lugar de expresiones constantes; no se pueden
usar en lugar de nombres de tabla, nombres de columna o nombres de otros objetos de base
de datos. No se pueden declarar los parmetros si se especifica FOR REPLICATION.
[ type_schema_name. ] data_type
El tipo de datos del parmetro y el esquema al que pertenece el tipo de datos.

VARYING
Especifica el conjunto de resultados admitido como parmetro de salida. Este parmetro lo
crea de forma dinmica el procedimiento y su contenido puede variar. Solo se aplica a los
parmetros de tipo cursor. Esta opcin no es vlida para los procedimientos CLR.
default
Valor predeterminado de un parmetro. Si se define un valor predeterminado para un
parmetro, el procedimiento se puede ejecutar sin especificar ningn valor para ese
parmetro. El valor predeterminado debe ser una constante o puede ser NULL. El valor
constante puede tener el formato de un carcter comodn, lo que permite usar la palabra
clave LIKE cuando se pase el parmetro al procedimiento. Vea el ejemplo C ms adelante.
Los valores predeterminados solo se registran en la columna sys.parameters.default de los
procedimientos CLR. Esa columna ser NULL para los parmetros de procedimientos
Transact-SQL.

OUT | OUTPUT
Indica que se trata de un parmetro de salida. Use los parmetros OUTPUT para devolver
valores al autor de la llamada del procedimiento. Los parmetros text, ntext e image no se
pueden usar como parmetros OUTPUT, a menos que se trate de un procedimiento CLR.
Un parmetro de salida puede ser un marcador de posicin de cursor, a menos que el
procedimiento sea un procedimiento CLR. Un tipo de datos con valores de tabla no se
puede especificar como parmetro OUTPUT de un procedimiento.

READONLY
Indica que el parmetro no se puede actualizar ni modificar en el cuerpo del procedimiento.
Si el tipo de parmetro es un tipo con valores de tabla, se debe especificar READONLY.

RECOMPILE
Indica que Motor de base de datos no almacena en cach ningn plan de consulta para este
procedimiento, forzndolo a ser compilado cada vez que se ejecute. Para obtener ms
informacin sobre las razones para forzar una nueva compilacin, vea Volver a compilar
procedimientos almacenados. Esta opcin no se puede usar cuando se especifica FOR
REPLICATION ni para procedimientos CLR.
Para indicar a Motor de base de datos que descarte planes de consulta para consultas
individuales en un procedimiento, use la sugerencia de consulta RECOMPILE en la
definicin de la consulta. Para obtener ms informacin, vea Sugerencias de consulta
(Transact-SQL).

ENCRYPTION
Indica que SQL Server convertir el texto original de la instruccin CREATE
PROCEDURE en un formato confuso. La salida de la ofuscacin no se ve directamente en
ninguna de las vistas de catlogo de SQL Server. Los usuarios que no dispongan de acceso
a las tablas del sistema o a los archivos de base de datos no pueden recuperar el texto
confuso. Sin embargo, estar disponible para los usuarios con privilegios que puedan
obtener acceso a las tablas del sistema a travs del puerto DAC o directamente a los
archivos de base de datos. Adems, los usuarios que puedan adjuntar un depurador al
proceso del servidor pueden recuperar el
procedimiento descifrado de la memoria en tiempo de ejecucin. Para obtener ms
informacin acerca del acceso a los metadatos del sistema, vea Configuracin de visibilidad
de los metadatos.
Esta opcin no es vlida para los procedimientos CLR.
Los procedimientos creados mediante esta opcin no se pueden publicar como parte de la
replicacin de SQL Server.

EXECUTE AS

Especifica el contexto de seguridad en el que se ejecuta el procedimiento.


Para obtener ms informacin, vea EXECUTE AS (clusula de Transact-SQL).

FOR REPLICATION
Especifica que el procedimiento se crea para replicacin. Por consiguiente, no se puede
ejecutar en el suscriptor. Se usa un procedimiento creado con la opcin FOR
REPLICATION como filtro de procedimiento y solo se ejecuta durante la replicacin. No
se pueden declarar los parmetros si se especifica FOR REPLICATION. No se puede
especificar FOR REPLICATION en los procedimientos CLR. La opcin RECOMPILE se
ignora en el caso de procedimientos creados con FOR REPLICATION.

Un procedimiento FOR REPLICATION tendr un tipo de objeto RF en sys.objects y


sys.procedures.
{ [ BEGIN ] sql_statement [;] [ ...n ] [ END ] }
Una o ms instrucciones Transact-SQL que comprenden el cuerpo del procedimiento.
Puede usar las palabras clave BEGIN y END opcionales para incluir las instrucciones. Para
obtener informacin, vea las secciones Prcticas recomendadas, Comentarios generales, as
como Limitaciones y restricciones que aparecen ms adelante.

EXTERNAL NAME assembly_name.class_name.method_name

Especifica el mtodo de un ensamblado de .NET Framework para que un procedimiento


almacenado CLR haga referencia a l. El parmetro class_name debe ser un identificador
vlido de SQL Server y debe existir como clase en el ensamblado. Si la clase tiene un
nombre completo de espacio de nombres que utiliza un punto (.) para separar las partes del
espacio de nombres, el nombre de la clase debe delimitarse
mediante parntesis ([]) o comillas (""). El mtodo especificado debe ser un mtodo esttico de la
clase.
De manera predeterminada, SQL Server no puede ejecutar cdigo CLR. Se pueden crear,
modificar y quitar objetos de bases de datos que hagan referencia a mdulos de Common
Language Runtime; sin embargo, estas referencias no se pueden ejecutar en SQL Server
hasta que se habilite la opcin clr enabled. Para habilitar esta opcin, use sp_configure.
La ejecucin de un procedimiento almacenado extendido tiene estas caractersticas:
La funcin de procedimiento almacenado extendido se ejecuta en el contexto de
seguridad de MicrosoftSQL Server.
La funcin de procedimiento almacenado extendido se ejecuta en el espacio de
procesos de SQL Server.
El subproceso asociado a la ejecucin del procedimiento almacenado extendido es
el mismo que se utiliza para la conexin de cliente.

El procedimiento almacenado extendido se puede ejecutar desde Transact-SQL como un


procedimiento almacenado utilizando la instruccin EXECUTE:
EXECUTE @retval = xp_extendedProcName @param1, @param2 OUTPUT

Parmetros
@ retval
Es un valor devuelto.
@ param1
Es un parmetro de entrada.
@ param2
Es un parmetro de entrada/salida.

TRIGGER, DISPARADOR O DESENCADENADOR


Un trigger (o disparador) en una Base de datos , es un procedimiento que se ejecuta cuando
se cumple una condicin establecida al realizar una operacin. Dependiendo de la base de
datos, los triggers pueden ser de insercin (INSERT), actualizacin (UPDATE) o borrado
(DELETE). Algunas bases de datos pueden ejecutar triggers al crear, borrar o editar
usuarios, tablas, bases de datos u otros objetos.

Usos
Son usados para mejorar la administracin de la Base de datos, sin necesidad de contar con
que el usuario ejecute la sentencia de SQL. Adems, pueden generar valores de columnas,
previene errores de datos, sincroniza tablas, modifica valores de una vista, etc. Permite
implementar programas basados en paradigma lgico (sistemas expertos, deduccin).

Componentes principales
La estructura bsica de un trigger es:

Llamada de activacin: es la sentencia que permite "disparar" el cdigo a ejecutar.


Restriccin: es la condicin necesaria para realizar el cdigo. Esta restriccin puede
ser de tipo condicional o de tipo nulidad.
Accin a ejecutar: es la secuencia de instrucciones a ejecutar una vez que se han
cumplido las condiciones iniciales.
Tipos

Existen dos tipos de disparadores que se clasifican segn la cantidad de ejecuciones a


realizar:

Row Triggers (o Disparadores de fila): son aquellas que se ejecutaran n-veces si se


llama n-veces desde la tabla asociada al trigger
Statement Triggers (o Disparadores de secuencia): son aquellos que sin importar la
cantidad de veces que se cumpla con la condicin, su ejecucin es nica.

Pueden ser de sesin y almacenados; pero no son de fiar.

Efectos y caractersticas

No aceptan parmetros o argumentos (pero podran almacenar los datos afectados


en tablas temporales)
No pueden ejecutar las operaciones COMMIT o ROLLBACK por que estas son parte
de la sentencia SQL del disparador (nicamente a travs de transacciones
autnomas)
Pueden causar errores de mutaciones en las tablas, si se han escrito de manera
deficiente.

Ejemplo
Un sencillo ejemplo (para SQL Server) sera crear un Trigger para insertar un pedido de
algn producto cuando la cantidad de ste, en nuestro almacn, sea inferior a un valor dado.

BEFORE UPDATE ON tabla_almacen


FOR ALL records
IF :NEW.producto < 100 THEN
INSERT INTO tabla_pedidos(producto) VALUES ('1000');
END IF;
SELECT DBO.POLVE.TEST
END

Disparadores en MySQL
Los disparadores son soportados en MySQL a partir de la versin 5.0.2. Algunos de los
soportes existentes son los disparadores para las sentencias INSERT, UPDATE y DELETE

El estndar SQL:2003 requiere que los disparadores den a los programadores acceso a las
variables de un registro utilizando una sintaxis como REFERENCING NEW AS n. Por
ejemplo, si un disparador est monitoreando los cambios en la columna salario, podra
escribirse un disparador como:

CREATE TRIGGER ver_salario


BEFORE UPDATE ON empleados
REFERENCING NEW ROW AS n, OLD ROW AS o
FOR EACH ROW
IF n.salario <> o.salario THEN
END IF;

Como en MySQL las sentencias se ejecutan luego de escribir el signo punto y coma (;),
cabe destacar que para crear un disparador en MySQL, antes se escribe la sentencia
DELIMITER seguida de un carcter tal como |, la cual asigna la funcin del punto y coma
(;) a otro carcter permitiendo que el disparador sea escrito usando los punto y comas sin
que se ejecute mientras se escribe; despus de escrito el disparador se escribe nuevamente
la sentencia DELIMITER ; para asignar al punto y coma su funcin habitual.

Disparadores en PostgresQL

Desde 1997 PostgresQL soporta el uso de disparadores, estos pueden anexarse a las tablas
pero no a las vistas; aunque a las vistas se les pueden crear reglas.

Al igual que en MySQL los disparadores de PostgresQL se pueden activar luego de


sentencias INSERT, UPDATE o DELETE

Cuando hay varios disparadores, se activan en orden alfabtico.

Adems de permitir el uso de funciones en el lenguaje nativo de PostgresQL, PL/PgSQL,


los disparadores tambin permiten invocar funciones escritas en otros lenguajes como
PL/Perl. En Postgres un disparador ejecuta una funcin la cual contiene el cdigo de lo que
se requiere, esto difiere del mtodo expuesto anteriormente para MySQL que escribe el
cdigo a ejecutarse dentro del mismo disparador. El siguiente es un ejemplo de disparador
creado con su respectiva funcin:

CREATE OR REPLACE FUNCTION actualizar() RETURNS TRIGGER AS $ejemplo$


BEGIN
NEW.nombre := NEW.nombres || ' ' || NEW.apellidos ;
RETURN NEW;
END;
$ejemplo$ LANGUAGE plpgsql;

CREATE TRIGGER ejemplo


BEFORE INSERT OR UPDATE ON tabla
FOR EACH ROW EXECUTE PROCEDURE actualizar();

Trigger DML.
Los trigger DML se ejecutan cuando un usuario intenta modificar datos mediante un evento
de lenguaje de manipulacin de datos (DML). Los eventos DML son instrucciones
INSERT, UPDATE o DELETE de una tabla o vista.
La sintaxis general de un trigger es la siguiente.

CREATE TRIGGER <Trigger_Name, sysname, Trigger_Name>


ON <Table_Name, sysname, Table_Name>
AFTER <Data_Modification_Statements, , INSERT,DELETE,UPDATE>
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;
-- Insert statements for trigger here
END
La primera tabla (inserted) solo est disponible en las operaciones INSERT y UPDATE y en ella
estn los valores resultantes despus de la insercin o actualizacin. Es decir, los datos insertados.
Inserted estar vaca en una operacin DELETE.
En la segunda (deleted), disponible en las operaciones UPDATE y DELETE, estn los
valores anteriores a la ejecucin de la actualizacin o borrado. Es decir, los datos que sern
borrados. Deleted estar vaca en una operacin INSERT.

Trigger DDL
Los trigger DDL se ejecutan en respuesta a una variedad de eventos de lenguaje de
definicin de datos (DDL). Estos eventos corresponden principalmente a instrucciones
CREATE, ALTER y DROP de Transact-SQL, y a determinados procedimientos
almacenados del sistema que ejecutan operaciones de tipo DDL.
La sintaxis general de un trigger es la siguiente.
CREATE TRIGGER <trigger_name, sysname, table_alter_drop_safety>
ON DATABASE
FOR <data_definition_statements, , DROP_TABLE, ALTER_TABLE>
AS
BEGIN
...
END

Limitaciones de los triggers. - Solo se pueden aplicar a una tabla especfica, es decir, un
trigger no sirve para dos o ms tablas - El trigger se crea en la base de datos que de trabajo
pero desde un trigger puedes hacer referencia a otras bases de datos. - Un Trigger devuelve
resultados al programa que lo desencadena de la misma forma que un Stored Procedure
aunque no es lo ms idneo, para impedir que una instruccin de asignacin devuelva un
resultado se puede utilizar la sentencia SET NOCOUNT al principio del Trigger. - Las
siguientes instrucciones no se pueden utilizar en los triggers :

ALTER DATABASE CREATE DATABASE

DISK INIT DISK RESIZE DROP DATABASE LOAD DATABASE

LOAD LOG RECONFIGURE

RESTORE DATABASE RESTORE LOG

También podría gustarte