Ir al contenido principal

Mensaje personalizado T-SQL

En este apartado pretendemos demostrar con un ejemplo claro y sencillo el uso y control de Mensaje personalizado usando T-SQL:

Requisitos :
1. SQL Server 2008 -  (T-SQL).

ESTRUCTURA DE TABLA
Antes de iniciar el desarrollo de T-SQL, considero que ya cuento con la tabla creada. Para este caso estoy tomando como referencia la tabla SEG_MODULO del diseño y modelo de base de datos Modulo de Control de Acceso - Primera Fase http://hadsonpar.blogspot.com/2013/08/modulo-de-control-de-acceso-primera-fase.html

Iniciamos creando nuestro procedimiento almacenado SP_INS_SEG_MODULO, haciendo referencia a la estructura de tabla:
CREATE PROCEDURE [dbo].[SP_INS_SEG_MODULO]  
 @PC_DES_MODULO  VARCHAR(50),
 @PC_MAN_MODULO  VARCHAR(200),
 @PC_USU_CREADOR  VARCHAR(20),
 @PF_FEC_CREACION DATETIME,
 @PC_USU_ACTUALIZA VARCHAR(20),
 @PF_FEC_ACTUALIZA DATETIME,
 @OC_MESSAGE_ERROR VARCHAR(1000) OUTPUT   
AS 
BEGIN TRY
 DECLARE @PC_ID_MODULO INTEGER
  
 EXEC SP_GEN_ID_MODULO
   @PC_ID_MODULO OUTPUT
  
  INSERT INTO SEG_MODULO
     (ID_MODULO, 
     DES_MODULO, 
     MAN_MODULO, 
     USU_CREADOR, 
     FEC_CREACION,
     USU_ACTUALIZA,
     FEC_ACTUALIZA)
  VALUES (@PC_ID_MODULO, 
     @PC_DES_MODULO, 
     @PC_MAN_MODULO, 
     @PC_USU_CREADOR, 
     @PF_FEC_CREACION,     
     @PC_USU_ACTUALIZA,
     @PF_FEC_ACTUALIZA)
  SELECT @OC_MESSAGE_ERROR = ''
END TRY
BEGIN CATCH
 SELECT @OC_MESSAGE_ERROR =  (SELECT 'ERROR EN PROCEDIMIENTO : '+ ERROR_PROCEDURE() + ' , MENSAJE : ' + ERROR_MESSAGE() + ' ID_MODULO : ' + CONVERT(VARCHAR,@PC_ID_MODULO))  
END CATCH

El parámetro @OC_MESSAGE_ERROR es solo de salida, parámetro que nos ayudará a controlar los mensajes personalizadosAhora ingresamos el valor que nos solicita cada parámetro de nuestro procedimiento almacenado que acabamos de crear.

INGRESAR PARÁMETROS Y ACEPTAR
Script que genera al ejecutar el procedimiento almacenado.

USE [BD_SISTEMA]
GO

DECLARE @return_value int,
  @OC_MESSAGE_ERROR varchar(1000)

EXEC @return_value = [dbo].[SP_INS_SEG_MODULO]
  @PC_DES_MODULO = N'SISTEMA',
  @PC_MAN_MODULO = N'\\192.168.1.113\Sistemas\ManualModulo',
  @PC_USU_CREADOR = N'HADSON',
  @PF_FEC_CREACION = N'18/04/2014',
  @PC_USU_ACTUALIZA = N'HADSON',
  @PF_FEC_ACTUALIZA = N'18/04/2014',
  @OC_MESSAGE_ERROR = @OC_MESSAGE_ERROR OUTPUT

SELECT @OC_MESSAGE_ERROR as N'@OC_MESSAGE_ERROR'

SELECT 'Return Value' = @return_value

GO 
RESULTADOS
CONFIRMAMOS SI LOS DATOS FUERON EFECTIVAMENTE INGRESADOS
Por ahora todo bien y que pasa si es que comenzamos a ingresar un nuevo registro sin ninguna validación que pueda restringir dicho proceso de inserción. 

Ejemplo
En nuestra primera inserción ingresamos como descripción de modulo SISTEMA y si intentamos ingresar nuevamente SISTEMA se insertará sin ningún problema, generando ambigüedad de datos, ejecutamos en Script generado de nuestro procedimiento almacenado.
COMO RESULTADO AHORA CONTAMOS CON 2 REGISTRO DE LA MISMA DESCRIPCIÓN DE MODULO
Para poder controlar nuestra validación de inserción de datos utilizaremos en este caso un mensaje personalizado y en otro ejemplo utilizaremos la función RAISERROR de T-SQL. Para ambos casos el programador es quien lo define.

Ejemplo con mensaje personalizado:


ALTER PROCEDURE [dbo].[SP_INS_SEG_MODULO]  
 @PC_DES_MODULO  VARCHAR(50),
 @PC_MAN_MODULO  VARCHAR(200),
 @PC_USU_CREADOR  VARCHAR(20),
 @PF_FEC_CREACION DATETIME,
 @PC_USU_ACTUALIZA VARCHAR(20),
 @PF_FEC_ACTUALIZA DATETIME,
 @OC_MESSAGE_ERROR VARCHAR(1000) OUTPUT   
AS 
BEGIN TRY
 DECLARE @PC_ID_MODULO INTEGER
 
 IF EXISTS (SELECT * FROM SEG_MODULO
    WHERE DES_MODULO = LTRIM(RTRIM(@PC_DES_MODULO)))
  BEGIN
   SELECT @OC_MESSAGE_ERROR = 'LA DESCRIPCION QUE ESTA INTENTANDO REGISTRAS YA EXISTE EN LA BASE DE DATOS'
  END
 ELSE
  BEGIN
   EXEC SP_GEN_ID_MODULO
     @PC_ID_MODULO OUTPUT
    
    INSERT INTO SEG_MODULO
       (ID_MODULO, 
       DES_MODULO, 
       MAN_MODULO, 
       USU_CREADOR, 
       FEC_CREACION,
       USU_ACTUALIZA,
       FEC_ACTUALIZA)
    VALUES (@PC_ID_MODULO, 
       @PC_DES_MODULO, 
       @PC_MAN_MODULO, 
       @PC_USU_CREADOR, 
       @PF_FEC_CREACION,     
       @PC_USU_ACTUALIZA,
       @PF_FEC_ACTUALIZA)
    SELECT @OC_MESSAGE_ERROR = ''
  END
END TRY
BEGIN CATCH
 SELECT @OC_MESSAGE_ERROR =  (SELECT 'ERROR EN PROCEDIMIENTO : '+ ERROR_PROCEDURE() + ' , MENSAJE : ' + ERROR_MESSAGE() + ' ID_MODULO : ' + CONVERT(VARCHAR,@PC_ID_MODULO))  
END CATCH


COMO SE APRECIA EL PARAMETRO DE SALIDA @OC_MESSAGE_ERROR DEVUELVE EL MENSAJE PERSONALIZADO
Esto se debe a la simple y sencilla validación que se realiza y se devuelve en nuestro parámetro de salida. Línea de código que realiza esta validación.


IF EXISTS (SELECT * FROM SEG_MODULO
    WHERE DES_MODULO = LTRIM(RTRIM(@PC_DES_MODULO)))
  BEGIN
   SELECT @OC_MESSAGE_ERROR = 'LA DESCRIPCION QUE ESTA INTENTANDO REGISTRAS YA EXISTE EN LA BASE DE DATOS'
  END

Ejemplo con RAISERROR :

Para poder hacer uso de esta función propia del T-SQL modificaremos nuestro procedimiento almacenado. Donde nuestro parámetro de salida @OC_MESSAGE_ERROR, lo pasaremos como un variable para setear el mensaje o también pueden hacerlo de manera directa RAISERROR ( 'LA DESCRIPCION QUE ESTA INTENTANDO REGISTRAS YA EXISTE EN LA BASE DE DATOS',16,1)  el resultado sera lo mismo.


ALTER PROCEDURE [dbo].[SP_INS_SEG_MODULO]  
 @PC_DES_MODULO  VARCHAR(50),
 @PC_MAN_MODULO  VARCHAR(200),
 @PC_USU_CREADOR  VARCHAR(20),
 @PF_FEC_CREACION DATETIME,
 @PC_USU_ACTUALIZA VARCHAR(20),
 @PF_FEC_ACTUALIZA DATETIME  
AS 
BEGIN 
 DECLARE @PC_ID_MODULO  INTEGER
 DECLARE @OC_MESSAGE_ERROR VARCHAR(1000)
 
 IF EXISTS (SELECT * FROM SEG_MODULO
    WHERE DES_MODULO = LTRIM(RTRIM(@PC_DES_MODULO)))
  BEGIN
   SET @OC_MESSAGE_ERROR = 'LA DESCRIPCION QUE ESTA INTENTANDO REGISTRAS YA EXISTE EN LA BASE DE DATOS'
   RAISERROR (@OC_MESSAGE_ERROR,16,1)
  END
 ELSE
  BEGIN
   EXEC SP_GEN_ID_MODULO
     @PC_ID_MODULO OUTPUT
    
    INSERT INTO SEG_MODULO
       (ID_MODULO, 
       DES_MODULO, 
       MAN_MODULO, 
       USU_CREADOR, 
       FEC_CREACION,
       USU_ACTUALIZA,
       FEC_ACTUALIZA)
    VALUES (@PC_ID_MODULO, 
       @PC_DES_MODULO, 
       @PC_MAN_MODULO, 
       @PC_USU_CREADOR, 
       @PF_FEC_CREACION,     
       @PC_USU_ACTUALIZA,
       @PF_FEC_ACTUALIZA)
    SELECT @OC_MESSAGE_ERROR = ''
  END
END



RESULTADO - RAISERROR
En ambos casos la validación es a nivel de servidor de base de datos, y puedes usar varios mensaje personalizados dependiendo el desarrollo que vienes realizando.

Cambios la descripción para ver efecto de todo este proceso que acabamos de realizar.


RESULTADO: SE INGRESO LA DESCRIPCIÓN VENTA
Esto es una las formas de controlar las validaciones a nivel de servidor de base de datos, hay muchas formas más de poder hacerlo. Nos vemos en nuestro siguiente apartado.

Comentarios

Entradas más populares de este blog

Habilitar Usuario HR Oracle

Al realizar la primera instalación del Oracle, el usuario HR por defecto está bloqueado y por ende no podemos loguearnos como dicho usuario, lo que debe hacer son los siguiente pasos, aplicables para Linux o Windows.
1. Conectarse como usuario system o sysdba + contraseña haciendo uso del comando connect.
Usuario: system
Password: xxxx 


2. Hacer uso  del comando alter user hr account unlock desbloqueamos la cuenta.
alter user hr account unlock;

3. Escribimos el comando alter user HR identified by hr; con esto estamos diciendo que la contraseña será hr.

alter user HR identified by hr;

4. Ahora testeamos la conexión con el comando - conn hr/hr@xe. Si deseas después de conectarnos se puede realizar un select a la tabla employees del hr.


Resultado del select realizado
5. Con todos estos pasos realizados ya podemos logearnos desde cualquier IDE como el usuario hr  y la contraseña hr que definimos en el paso 3. 
Para finalizar nos loguearemos con el IDE Oracle SQL Developer.

Espero les sea de utilidad,…

Usuario SYS y SYSTEM - ORACLE

Usuario SYS y SYSTEM
Ambos usuario son creados de forma automática al crear la base de datos ORACLE y se otorga el rol de DBA.

SYS (password por defecto: CHANGE_ON_INSTALL).
SYSTEM (password por defecto: MANAGER).

Lo que se recomienda es cambiar el password de ambos usuarios por el tema de seguridad.

SYS:
Todas las tablas y vistas para el diccionario de datos de la base de datos están almacenados en el esquema SYS. Estas tablas y vistas son críticas para el funcionamiento de la base de datos ORACLE. Para mantener la integridad del diccionario de datos, las tablas del esquema SYS son manipulados solo por la base de datos. Nunca se debería modificar algo o crear tablas en el esquema del usuario SYS.

SYSTEM:
El usuario SYSTEM se utiliza para crear tablas y vistas adicionales que muestran información administrativa, tablas internas y vistas utilizado por varias opciones y herramientas de la base de datos ORACLE. No se recomienda utilizar el esquema SYSTEM para almacenar tablas de interés para usu…

Parámetro de entrada y salida – PL/SQL

Parámetro de entrada y salida – PL/SQL:
Los parámetros de entrada y salida no son los parámetros de inicialización de la base de datos ORACLE. Los parámetros de entra y salida son utilizados mayormente en implementaciones de funciones, procedimientos almacenados o bloques de código bajo el lenguaje del PL/SQL, se considera que ambos parámetros (entra y salida) puedan realizar operaciones en el mismo bloque PL/SQL, es decir, si enviamos un parámetro de entrada hará que cumpla cierta operación y retornara los valores de salida de dicha operación procesada de acuerdo al parámetro de ingresado. Es de acuerdo al caso que nos presenta en la implementación.
Algo importante al definir los parámetros, es saber y considerar cuántos tipos de parámetro existe si solo hablamos de entrada y salida, en realidad mi determinación seria 3 tipos:

Parámetros:

IN – entrada
OUT – salida
IN OUT – entrada salida

Parámetro IN – entrada:
El comportamiento común de estés tipos de parámetros es estar siempre pendiente d…