Bueno. Hay varios detalles a tener en cuenta:
1. Deberías darte una vuelta por el
manual de referencia para mayor claridad:
2. Las sentencias en MySQL terminan
siempre con un punto y coma (";").
3. Para poder procesar un script de SP, debe cambiarse el delimitador
momentaneamente, de modo que se cargue completo antes de ejecutarse.
4. Las variables de entrada se indican en el prototipo
sin "@" e indicando si son de
entrada (IN),
salida (OUT) o
entrada/salida (INOUT), ya que MySQL puede devolver valores en el SP.
5. Las variables locales se declaran igual, con DECLARE,
pero cuando usas @ se transforman en
globales y
no requieren declaración, pero si reinicialización, puesto que conservan el valor entre ejecuciones.
6. Lo que intentas hacer se realiza con una
sentencia preparada, la cual debe cargarse en este caso en una variable global.
7. Las sentencias preparadas
deben destruirse cuando no se usan más, porque permanecen en memoria.
En general eso sería todo. La sintaxis más aproximada sería:
Código sql:
Ver originalDELIMITER $$
DROP PROCEDURE IF EXISTS `sp_Listado_ENVIADOS` $$
CREATE PROCEDURE `sp_Listado_ENVIADOS` (
IN a_cod_o_origen VARCHAR(10),
IN a_cod_tipo_doc VARCHAR(2),
IN a_cod_o_destino VARCHAR(10),
IN a_des_condicion VARCHAR(100))
BEGIN
SET @SQL = 'SELECT Documentos.num_documento,
Documentos.des_fecha_documento,
tipo_documento.des_documento,
Organizacion.des_nombre_entidad as destino,
Documentos.des_Asunto,
Documentos.des_referencia,
Documentos.cod_organizacion as cod_o_origen,
Documentos.cod_personal as de,
Documentos.cod_ref_especifica,
Destino_documento.cod_organizacion as cod_o_destino,
Destino_documento.cod_personal as para ,
Destino_documento.des_fecha_recep ,
Destino_documento.des_fecha_deriva ,
Destino_documento.des_observaciones ,
Destino_documento.des_observacion2 ,
Destino_documento.des_observacion3 ,
Documentos.num_registro,
Destino_documento.num_recepcion,
Documentos.des_ubicacion,
CASE WHEN Documentos.num_plazo = 1 THEN Documentos.des_fecha_plazo ELSE null END AS des_fecha_plazo,
Documentos.num_envio,
Destino_documento.des_estado,
SUBSTRING(convert(char,Documentos.des_fecha_docume nto,101),1,10) as s_fecha_doc,
convert(char,Destino_documento.des_fecha_recep, 101) as s_fecha_recep ,
convert(char,Destino_documento.des_fecha_deriva, 101) as s_fecha_deriva ,
convert(char,Documentos.des_fecha_plazo,101) as s_fecha_plazo,
Documentos.num_plazo,
CASE WHEN Documentos.num_plazo = 1 THEN DATEDIFF(day, Documentos.des_fecha_plazo, getdate()) ELSE null END AS no_dias
FROM Documentos , Destino_documento, tipo_documento , Organizacion WITH (NOLOCK)
WHERE ( Documentos.num_registro = Destino_documento.num_registro ) and (documentos.cod_tipo_documento=tipo_documento.cod_ tipo_documento) and (Destino_documento.cod_organizacion=Organizacion.c od_organizacion) and ';
SET @WHERE = CONCAT(' ( Documentos.cod_organizacion like \'', a_cod_o_origen ,'\') and ( Documentos.cod_tipo_documento like \'', a_cod_tipo_doc, '\') ', a_des_condicion;
SET @SQL = CONCAT(@SQL, ' ( Destino_documento.cod_organizacion like \'', a_cod_o_destino, '\') and ', @WHERE, ' ORDER BY Documentos.cod_tipo_documento,Documentos.num_docum ento asc ');
SET @SENTENCIA = CONCAT(@SSQL, @WWHERE);
PREPARE SQLGPS FROM @SENTENCIA;
EXECUTE SQLGPS;
DROP PREPARE SQLGPS;
END $$
DELIMITER ;
Un tip final: Este script
te dará error, posiblemente, porque contiene un "
WITH (NOLOCK)", que no sé que hace en SQL Server y no me puse a averiguar cómo se migra... Me fijaré en otro momento.