Sybase SQL Anywhere - Consulta Sybase 12.5

 
Vista:
sin imagen de perfil

Consulta Sybase 12.5

Publicado por Alejandra Garavito (1 intervención) el 06/05/2018 19:47:14
Cordial saludo;

Megustaria por favor y si me podrian colaborar con la siguiente consulta que estoy tratando de realizar en Sybase 12.5.

1)Tengo una Base de datos denominada desarrollo (Tablas de Producción) y otra denominada staging_dev (Tablas Replicas de Producción).

2)Me piden que en las 2 bases, se deben contener las mismas estructuras de tablas. staging_dev va a contener una tabla de mas denominada pv_header_control en el cual me van a quedar registrados todos los id que contenga la tabla pv_header de desarrollo y demás tablas de esta base. (Para esto realice un cruce entre la tabla pv_header_control y las demás tablas de desarrollo).

3)Los 2 primeros puntos hacen referencia a que cuando persona ingrese algún registro en alguna tabla de desarrollo, por la noche yo pueda dejar programada una tarea la cual me traiga únicamente los registros nuevos que se insertaron en desarrollo. (Para esto, lo realice mediante cursores ya que me piden que no utilice trigger.)Y para verificar cuales son los registros nuevos insertados en desarrollo, lo que hago es crear un campo en mi tabla pv_header_control, denominado FechaSSIS, el cual va a almacenar una fecha. Esto quiere decir que cuando me haya insertado los registros en mi tabla pv_header_control de staging_dev, automáticamente ese campo me va a quedar con fecha y los registros que aun no se hallan pasado van a contener en ese campo el valor NULL.


--Tabla pv_header_control

CREATE PROCEDURE sp_pv_header_control
AS

DECLARE @FechaTrigger SMALLDATETIME
DECLARE @CodOperacion INT
DECLARE @FechaSSIS SMALLDATETIME
DECLARE @SnCarga INT
DECLARE @id_pv INT
DECLARE @CodError INT
DECLARE @txt_error VARCHAR (50)



DECLARE cursor_pv_header_control CURSOR FOR
SELECT TOP 10000 sc.FechaTrigger, sc.CodOperacion, sc.FechaSSIS, sc.SnCarga, p.id_pv, sc.CodError, sc.txt_error FROM staging_dev.dbo.pv_header_control AS sc
RIGHT JOIN desarrollo.dbo.pv_header AS p ON (sc.id_pv = p.id_pv)
WHERE sc.id_pv IS NULL
FOR READ ONLY

OPEN cursor_pv_header_control

FETCH cursor_pv_header_control INTO @FechaTrigger, @CodOperacion, @FechaSSIS, @SnCarga, @id_pv, @CodError, @txt_error


BEGIN TRANSACTION

WHILE @@SQLSTATUS = 0

BEGIN

SET @FechaTrigger = GETDATE()
SET @CodOperacion = 1
SET @SnCarga = 0


INSERT staging_dev.dbo.pv_header_control
SELECT @FechaTrigger, @CodOperacion, @FechaSSIS, @SnCarga, @id_pv, @CodError, @txt_error


IF (@@ERROR <> 0)

BEGIN
PRINT 'Error al ejecutar la Tabla pv_header_control'
ROLLBACK TRANSACTION
RETURN
END

INSERT INTO #t1 VALUES(1, GETDATE(), 'pv_header_control')

FETCH cursor_pv_header_control INTO @FechaTrigger, @CodOperacion, @FechaSSIS, @SnCarga, @id_pv, @CodError, @txt_error


END

CLOSE cursor_pv_header_control
DEALLOCATE CURSOR cursor_pv_header_control

COMMIT TRANSACTION



--------------------------------------------------------------------------------------------------------------------------------

--Tabla pv_header

CREATE PROCEDURE sp_pv_header
AS


DECLARE @id_pv INT
DECLARE @cod_suc NUMERIC (3)
DECLARE @cod_ramo NUMERIC (2)
DECLARE @nro_pol INT
DECLARE @aaaa_endoso INT
DECLARE @nro_endoso NUMERIC (6)
DECLARE @cod_aseg INT
DECLARE @fec_emi SMALLDATETIME
DECLARE @fec_vig_desde SMALLDATETIME
DECLARE @fec_vig_hasta DATETIME
DECLARE @cod_moneda NUMERIC (2)
DECLARE @imp_cambio NUMERIC (9,4)
DECLARE @id_pv_modifica INT
DECLARE @cod_operacion INT
DECLARE @nro_solicitud NUMERIC (9)
DECLARE @nro_cotizacion NUMERIC (7)
DECLARE @nro_flota NUMERIC (7)
DECLARE @sn_impresion INT
DECLARE @sn_anula_automatica INT
DECLARE @cod_tipo_agente TINYINT
DECLARE @cod_agente INT
DECLARE @cod_grupo_endo NUMERIC (2)
DECLARE @cod_tipo_endo NUMERIC (2)
DECLARE @cod_sistema NUMERIC (2)
DECLARE @sn_cob_coas_total INT
DECLARE @id_pv_cero INT
DECLARE @fec_hora_desde SMALLDATETIME
DECLARE @sn_bancaseguros INT
DECLARE @cod_periodo_fact NUMERIC (2)
DECLARE @nro_pv_cero NUMERIC (9)
DECLARE @sn_fronting INT
DECLARE @cod_grupo NUMERIC (4)
DECLARE @nro_endo_modifica INT
DECLARE @nro_modifica_por INT
DECLARE @cod_tipo_asoc NUMERIC (2)
DECLARE @cod_aseg_consorcio INT
DECLARE @cnt_factu INT
DECLARE @id_pv_wkf INT


DECLARE cursor_pv_header CURSOR FOR
SELECT TOP 10000 p.* FROM staging_dev.dbo.pv_header_control AS sc
INNER JOIN desarrollo.dbo.pv_header AS p ON (sc.id_pv = p.id_pv)
WHERE sc.FechaSSIS IS NULL
FOR READ ONLY

OPEN cursor_pv_header

FETCH cursor_pv_header INTO @id_pv, @cod_suc, @cod_ramo, @nro_pol, @aaaa_endoso, @nro_endoso, @cod_aseg, @fec_emi, @fec_vig_desde, @fec_vig_hasta,
@cod_moneda, @imp_cambio, @id_pv_modifica, @cod_operacion, @nro_solicitud, @nro_cotizacion, @nro_flota, @sn_impresion,
@sn_anula_automatica, @cod_tipo_agente, @cod_agente, @cod_grupo_endo, @cod_tipo_endo, @cod_sistema, @sn_cob_coas_total,
@id_pv_cero, @fec_hora_desde, @sn_bancaseguros, @cod_periodo_fact, @nro_pv_cero, @sn_fronting, @cod_grupo, @nro_endo_modifica,
@nro_modifica_por, @cod_tipo_asoc, @cod_aseg_consorcio, @cnt_factu, @id_pv_wkf

-- BEGIN TRANSACTION

WHILE @@SQLSTATUS = 0

BEGIN

-- EXEC sp_pv_header

INSERT staging_dev.dbo.pv_header
SELECT @id_pv, @cod_suc, @cod_ramo, @nro_pol, @aaaa_endoso, @nro_endoso, @cod_aseg, @fec_emi, @fec_vig_desde, @fec_vig_hasta,
@cod_moneda, @imp_cambio, @id_pv_modifica, @cod_operacion, @nro_solicitud, @nro_cotizacion, @nro_flota, @sn_impresion,
@sn_anula_automatica, @cod_tipo_agente, @cod_agente, @cod_grupo_endo, @cod_tipo_endo, @cod_sistema, @sn_cob_coas_total,
@id_pv_cero, @fec_hora_desde, @sn_bancaseguros, @cod_periodo_fact, @nro_pv_cero, @sn_fronting, @cod_grupo, @nro_endo_modifica,
@nro_modifica_por, @cod_tipo_asoc, @cod_aseg_consorcio, @cnt_factu, @id_pv_wkf


IF (@@ERROR <> 0)

BEGIN
PRINT 'Error al ejecutar la Tabla pv_header'
-- ROLLBACK TRANSACTION
RETURN
END

INSERT INTO #t1 VALUES(1, GETDATE(), 'pv_header')

FETCH cursor_pv_header INTO @id_pv, @cod_suc, @cod_ramo, @nro_pol, @aaaa_endoso, @nro_endoso, @cod_aseg, @fec_emi, @fec_vig_desde, @fec_vig_hasta,
@cod_moneda, @imp_cambio, @id_pv_modifica, @cod_operacion, @nro_solicitud, @nro_cotizacion, @nro_flota, @sn_impresion,
@sn_anula_automatica, @cod_tipo_agente, @cod_agente, @cod_grupo_endo, @cod_tipo_endo, @cod_sistema, @sn_cob_coas_total,
@id_pv_cero, @fec_hora_desde, @sn_bancaseguros, @cod_periodo_fact, @nro_pv_cero, @sn_fronting, @cod_grupo, @nro_endo_modifica,
@nro_modifica_por, @cod_tipo_asoc, @cod_aseg_consorcio, @cnt_factu, @id_pv_wkf


END

CLOSE cursor_pv_header
DEALLOCATE CURSOR cursor_pv_header



ANEXO: Todos estos 3 puntos que acabo de mencionar y los 2 sp que estan observando, me ejecutan de manera satifactoria. Ahora el problema que necesito resolver es que cuando haya algun error en la mi tabla pv_header_control de staging_dev no siga ejecutando los demas procesos o inserciones en las demas tablas o sp. (Para esto utilice un condicional el cual validara que cuando hubiera un error en mi primer sp_pv_header_control no siguiera corriendo los demas procesos, hasta ahi me corre bien, pero si no ahi ningun error vuelva y entra al condicional del error, lo cual no deberia realizar ya que no hubo error y deberia ejecutar los demas o el siguiente sp_pv_header). Les agradeceria mucho y si me pueden colaborar con esta ultima parte de mi proceso condicinal.


BEGIN TRANSACTION

EXECUTE sp_pv_header_control


IF @@SQLSTATUS <> -2
BEGIN
PRINT 'Error al ejecutar la Tabla sp_pv_header_control'
ROLLBACK TRANSACTION
RETURN
END

ELSE

BEGIN

EXECUTE sp_pv_header

EXECUTE sp_pv_varios

EXECUTE sp_di_header

EXECUTE sp_di_reas

END


COMMIT TRANSACTION
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de Alejandro

Control de errores en procesos

Publicado por Alejandro (46 intervenciones) el 21/02/2024 19:28:56
Tocaya, en este código, se implementa una solución para controlar errores en los procesos de Sybase SQL Anywhere. El objetivo es detener la ejecución de los siguientes procedimientos si se produce un error en el primer procedimiento `sp_pv_header_control`.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
-- Transacción principal
BEGIN TRANSACTION
 
-- Ejecutar el primer procedimiento
EXECUTE sp_pv_header_control
 
-- Verificar si hubo un error en el primer procedimiento
IF @@SQLSTATUS <> -2
BEGIN
    PRINT 'Error al ejecutar el Procedimiento sp_pv_header_control'
    ROLLBACK TRANSACTION
    RETURN
END
ELSE
BEGIN
    -- No hubo error en el primer procedimiento, ejecutar los siguientes procedimientos
    EXECUTE sp_pv_header
    EXECUTE sp_pv_varios
    EXECUTE sp_di_header
    EXECUTE sp_di_reas
END
 
-- Confirmar la transacción si todo se ejecutó correctamente
COMMIT TRANSACTION

Este código envuelve la ejecución de los procedimientos en una transacción principal. Si se produce un error durante la ejecución del primer procedimiento (`sp_pv_header_control`), la transacción se revierte (`ROLLBACK TRANSACTION`) y el flujo se interrumpe. Si no hay errores, se ejecutan los procedimientos restantes y la transacción se confirma (`COMMIT TRANSACTION`).

Es importante destacar que el manejo de errores en Sybase SQL Anywhere puede variar según la versión exacta del sistema y las configuraciones específicas. Asegúrate de ajustar el código según las necesidades y características de tu entorno.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar