Cómo utilizar Stored Procedures
La importación de datos puede utilizar stored-procedure, para procesos más complejos o que necesitan de desempeño. Deben considerarse las siguientes observaciones para crear la stored-procedure.
Nombre de la procedure:
El nombre de la stored-procedure debe tener el formato sp_xxxxxx, donde:
| • | sp_ es el prefijo constante de identificación |
| • | xxxxxx, cualquier nombre válido en el SGDB |
Ejemplos:
SP_CALCSALDO
SP PREP_PRODUTO
SP_MONTAFLUXODECAIXA
Parámetros:
Si hubieran parámetros para la ejecución de la stored-procedure, los parámetros de entrada deben ser precedidos de IN_ y los parámetros de retorno, deben ser precedidos de OUT_.
| • | Para el SIGADW es obligatorio el retorno de por lo menos un parámetro. Vea ejemplos al final de este texto. |
Tablas
| • | La stored-procedure utilizará una tabla, convencionalmente llamada tabla de transferencia, cuyos datos son volátiles, es decir, a cada ejecución de la stored-procedure, sus datos deben retirarse, para después ponerse a disposición para el SIGADW. |
| • | La tabla de transferencia y la stored-procedure deben crearse previamente por herramientas disponíbles del SGDB, p.e., el iSQL Plus para el Oracle, Query Analyzer para el MS-SQL, o cualquier otra que el usuario desee, siempre y cuando tenga acceso a la base de datos del SigaDW o a la base de datos origen. |
| • | Para el nombre de la tabla de transferencia, no hay estándar, sinembargo, recomendamos que se utilice el mismo nombre de la stored-procedure, sin el prefijo sp_. |
Cómo ejecutar la stored-procedure, en el SIGADW:
| • | En el evento Al iniciar de la fuente de datos, soli citará la ejecución del stored-procedure, a través de una de las funciones mostradas en el ítem Rutinas para ejecución de strored-procedures. |
| • | El bloque de código vinculado al evento Al iniciar, debe retornar “.T.”, indicando que el proceso de importación debe continuar o “.F.”, para indicar que el proceso debe interrumpirse. |
Cómo acceder a los datos de la tabla de transferencia:
| • | En el campo SQL (datos), informe el comando SQL para leer la tabla de transferencia, como si fuese una tabla tradicional, p.e. select * from CALCPEDIDO. |
| • | En el campo SQL (estructura), informe el comando SQL para leer la estructura de la tabla de transferencia, p.e. select top 1 * from PREPIMP. |
Rutinas para ejecución de stored-procedures:
| • | Stored-procedure almacenada en la base de datos del SIGADW DWEXECSP(<cNomeSP> , <lista de parámetros>[,...]) -> <array> |
<cNomeSP> - String que identifica la stored-procedure que se ejecutará.
<lista de parámetros> - Expresión, parámetros que se pasarán a la stored-procedure, es obligatorio por lo menos un parámetro de retorno.
<array> - Array de strings, con los valores atribuidos en los parámetros de output.
| • | Stored-procedure almacenada en la base de datos de origen DWREMOTESP(<cNomeSP>, <lista de parámetros>[,...]) -> <array> |
<cNomeSP> - String que identifica el stored-procedure que se ejecutará, sin el sufijo de la empresa.
<lista de parâmetros> - Expresión, parámetros que se pasarán al stored-procedure, es obligatorio por lo menos un parámetro de retorno.
<array> - Array de strings, con los valores atribuidos en los parámetros de output
Ejemplos:
MS-SQL
create SP_CALCPEDIDO ( @IN_NUMPED varchar(8), @OUT_Ret varchar(1) output) as
select @OUT_Ret = '1'; -- indica que comenzó la SP ;
delete from CALCPEDIDO; -- limpia la tabla de transferencia
if @@ERROR = 0 // fue posible efectuar el borrado
begin
// aquí se consigna el código necesario,
// para alimentar la tabla CALCPEDIDO
// Para cada punto/comando donde hay la necesidad
// de verificar la ocurrencia de error, basta probar
// la variable “reservada” @@ERROR. Vea el help del
// MS-SQL para ejemplos más completos
end else
begin
select @OUT_Ret = '9'; -- indica que terminó con éxito
end
Oracle
CREATE OR REPLACE PROCEDURE SP_CALCPEDIDO (IN_NUMPED IN varchar2, OUT_RET OUT varchar2) is begin
OUT_RET := '1'; -- indica que comenzó la SP
truncate table CALCPEDIDO; -- limpia la tabla de transferencia
EXCEPTION -- En caso de error en la ejecución del procedure
// aquí se consigna el código necesario,
// para alimentar la tabla CALCPEDIDO
// Para tratamiento de errores, utilice la cláusula Excpetion
// Vea el help del Oracle para ejemplos más completos
OUT_Ret = '9'; -- indica que terminó con éxito
WHEN OTHERS then -– tratar todo y cualquier error
BEGIN
OUT_Ret = '2'; -- indica que ocurrió un error
END
end SP_CALCPEDIDO_01;
Código Adv/PL del evento Al iniciar
dw_Ret := DWEXECSP(\"SP_CALCPEDIDO\",”12345678”,”OUT_RET”)
if len(dw_Ret) == 0 // no existe la SP o hay error en esta
DWLOG(“SP_CALCPEDIDO no disponible”) // log falla
return .f. // interrumpir
elseif dw_Ret[1] == '1'// iniciada, pero se interrumpió por error grave
DWLOG(“SP_CALCPEDIDO finalizada con error”) // log falla
return .f. // interrumpir
elseif dw_ret[2] == ‘2’ // indica que ocurrió un error controlado
DWLog(“SP_CALCPEIDOD finalizó con error del tipo ‘2’”)
return .f.
Endif
return .t. // continúa la importación
Se recomienda que las stored-procedures tengan comandos de captura y tratamiento de error para un buen control de la ejecución y para facilitar en la solución de problemas en el proceso.