Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » Mysql »

Error al crear Stored Procedure

Estas en el tema de Error al crear Stored Procedure en el foro de Mysql en Foros del Web. Hola! Estoy intentado crear un Procedimiento almacenado desde el MySQL Workbench pero este me alerta de un error en el primer SET sqlStatement (también he ...
  #1 (permalink)  
Antiguo 01/08/2010, 14:16
 
Fecha de Ingreso: mayo-2005
Ubicación: Vimianzo. A Coruña
Mensajes: 230
Antigüedad: 18 años, 11 meses
Puntos: 1
Error al crear Stored Procedure

Hola!
Estoy intentado crear un Procedimiento almacenado desde el MySQL Workbench pero este me alerta de un error en el primer SET sqlStatement (también he tenido que cambiar nvarchar(max) por nvarchar(1000)):

Código MySQL:
Ver original
  1. DELIMITER $$
  2.  
  3. CREATE PROCEDURE `galiciaparty`.`spGetAllEventos` (IN startIndex int,IN pageSize int,IN sortBy nvarchar(30),OUT totalEventos int)
  4. DECLARE sqlStatement nvarchar(1000);
  5. DECLARE upperBound int;
  6.    
  7.     IF startIndex  < 1 THEN SET startIndex = 1;
  8.     IF pageSize < 1 THEN SET pageSize = 1;
  9.     SET upperBound = startIndex + pageSize;
  10.     Select totalEventos=Count(*) From gp_eventos_prin
  11.     SET sqlStatement ='SELECT E.id_evento, E.titulo, E.fecha_evento, E.lugar
  12.                       FROM (SELECT  ROW_NUMBER() OVER(ORDER BY ' + sortBy + ') AS rowNumber, *
  13.                             FROM    Employee
  14.                            ) AS E
  15.                       WHERE  rowNumber >= ' + CONVERT(varchar(9), startIndex) + ' AND rowNumber <  ' + CONVERT(varchar(9), upperBound)
  16.   exec (sqlStatement)
  17.  
  18. END$$
  19. END$$

Este store procedure lo voy a ejecutar desde C#.NET, por eso le tengo que pasar parámetros. Lo quiero utilizar para paginar los resultados.
Ah, y este procedure lo estoy "portando" de SQL server, donde funciona perfectamente a MySQL...pero no logro que funcione...
Os dejo aquí si quereis el original de SQL Server:
Código SQL:
Ver original
  1. CREATE PROCEDURE spGetAllEmployee
  2.     (
  3.     @startIndex     INT,
  4.     @pageSize       INT,
  5.     @sortBy     nvarchar(30),
  6.     @totalEmployees INT OUTPUT     
  7.     )
  8. AS
  9.     SET NOCOUNT ON
  10.  DECLARE
  11.     @sqlStatement nvarchar(MAX),    
  12.     @upperBound INT
  13.   IF @startIndex  < 1 SET @startIndex = 1
  14.   IF @pageSize < 1 SET @pageSize = 1
  15.   SET @upperBound = @startIndex + @pageSize
  16.  SELECT @totalEmployees=COUNT(*) FROM Employee
  17.   SET @sqlStatement = ' SELECT E.EmployeeID, E.EmployeeCode, E.Name, E.Department, E.Salary
  18.                FROM (
  19.                      SELECT  ROW_NUMBER() OVER(ORDER BY ' + @sortBy + ') AS rowNumber, *
  20.                      FROM    Employee
  21.                     ) AS E
  22.                WHERE  rowNumber >= ' + CONVERT(VARCHAR(9), @startIndex) + ' AND
  23.                       rowNumber <  ' + CONVERT(VARCHAR(9), @upperBound)
  24.   EXEC (@sqlStatement)

Me podeis hechar una ayudita a ver si logro solucionar este fallo?

Muchas gracias por todo y un Saludo!
__________________
Técnico Superior en Desarrollo de Apliciones Informáticas

Última edición por Baldur; 01/08/2010 a las 14:35
  #2 (permalink)  
Antiguo 01/08/2010, 15:16
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: Error al crear Stored Procedure

Lo que estás tratando de crear es una sentencia preparada, y eso no se hace en MySQL con variables privadas de SP sino con variables de usuario, las cuales se usan sin declarar, pero se identifican por llevar un "@" como prefijo.
Es decir, el problema es que estás usando mucho T-SQL de MS SQL Server, en lugar de PL de MySQL. Lo que debes revisar es el manual de referencia de MySQL y ver cómo se hacen aquellas cosas que no pertenecen al estandar ANSI SQL, como es el caso de las funciones de conversión, stored sentences, y demás:
Por ejemplo:
- No existe en MySQL el tipo de dato NVARCHAR, sino el VARCHAR.
- Los encadenamientos de texto se generan con CONCAT(), separando por comas los valores a encadenar, porque no tiene un límite dado para los grupos de texto.
- Las conversiones entre un tipo de dato y oro se hacen con CAST() y no con CONVERT porque el segundo de usa para conversiones de base y no de tipo. Algunas conversiones se las puede hacer implícitamente, como es el caso de las te cadena.
- IF... THEN/ ELSE/ END IF, se usa completo y no es una función. Para eso existe la función IF(condicion, true out, false out).
- Para asignar un valor de un SELECT a una variable o usas SET o usas INTO
- Hay funciones que no existen en MySQL, porque son propias de otro DBMS, como ROW_NUMBER() y OVER(ORDER BY value). Si puedes explicar lo que buscas, se puede resolver el problema.

Esto está un poco más cerca, pero aún no se puede ejecutar:
Código MySQL:
Ver original
  1. DELIMITER $$
  2.  
  3. CREATE PROCEDURE `galiciaparty`.`spGetAllEventos` (IN startIndex INT, IN pageSize INT, IN sortBy varchar(30), OUT totalEventos INT)
  4.     DECLARE upperBound INT;
  5.     SET startIndex  = IF(startIndex  < 1, 1, startIndex);
  6.     SET pageSize = IF(pageSize < 1, 1, pageSize);
  7.     SET upperBound = startIndex + pageSize;
  8.     SET totalEventos=(SELECT Count(*) FROM gp_eventos_prin);
  9.     SET @sqlStatement =concat('SELECT E.id_evento, E.titulo, E.fecha_evento, E.lugar ',
  10.                        'FROM (SELECT  ROW_NUMBER() OVER(ORDER BY ', sortBy, ') AS rowNumber ',
  11.                        'FROM    Employee) AS E  WHERE  rowNumber >= ', startIndex,
  12.                        ' AND rowNumber <  ', upperBound)
  13.   exec (sqlStatement);
  14. END$$
  15.  
  16. DELIMITER ;

Para completarlo, hace falta saber qué es lo que quieres obtener con esto:
Código MySQL:
Ver original
  1. SELECT  ROW_NUMBER() OVER(ORDER BY ' + @sortBy + ') AS rowNumber, * FROM    Employee
para ver cómo obtenerlo en MySQl.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #3 (permalink)  
Antiguo 01/08/2010, 15:38
 
Fecha de Ingreso: mayo-2005
Ubicación: Vimianzo. A Coruña
Mensajes: 230
Antigüedad: 18 años, 11 meses
Puntos: 1
Respuesta: Error al crear Stored Procedure

Madre mía, muchísimas gracias por toda esa explicación! Curradísimo el post!

Sabes que pasa, que a mi cuando me enseñaron SQL fue en el 2007/2008 y sobre SQL Server 2000, y desde aquella no he vuelto a hacer stored procedures ni nada que no fuesen consultas puras y duras...y claro..se nota jajaja.

Lo que intento hacer con todo esto es obtener el número de registros a paginar(para crear el control númerico de páginas) y además paginar los resultados.
El proyecto lo estoy haciendo con C#.NET, pero la BD es MySQL.

Me indicaron que le echase un vistazo a este artículo: http://dotnetslackers.com/articles/g...-GridView.aspx

Y estaba intentando implementarlo tal cual en mi proyecto, para comprobar bien como funciona y luego hacer las modificaciones pertinentes para dejarlo todo Ok...

Saludos y gracias por la ayuda!!
__________________
Técnico Superior en Desarrollo de Apliciones Informáticas
  #4 (permalink)  
Antiguo 02/08/2010, 10:48
 
Fecha de Ingreso: mayo-2005
Ubicación: Vimianzo. A Coruña
Mensajes: 230
Antigüedad: 18 años, 11 meses
Puntos: 1
Respuesta: Error al crear Stored Procedure

Alguna idea para solucionar este problema de portar de SQL Server a MySQL este stored procedure??

Necesito solucionarlo cuanto antes...

Muchas Gracias por la ayuda y un Saludo a todos!
__________________
Técnico Superior en Desarrollo de Apliciones Informáticas
  #5 (permalink)  
Antiguo 02/08/2010, 11:19
 
Fecha de Ingreso: mayo-2005
Ubicación: Vimianzo. A Coruña
Mensajes: 230
Antigüedad: 18 años, 11 meses
Puntos: 1
Respuesta: Error al crear Stored Procedure

Mirar, creo que he solucionado el problema del ROW_NUMBER() OVER(-------)
Código MySQL:
Ver original
  1. DELIMITER $$
  2.  
  3. CREATE PROCEDURE `galiciaparty`.`spGetAllEventos` (IN startIndex INT, IN pageSize INT, IN sortBy VARCHAR(30), OUT totalEventos INT)
  4. * * DECLARE upperBound INT;
  5. * * SET startIndex *= IF(startIndex *< 1, 1, startIndex);
  6. * * SET pageSize = IF(pageSize < 1, 1, pageSize);
  7. * * SET upperBound = startIndex + pageSize;
  8. * * SET totalEventos=(SELECT Count(*) FROM gp_eventos_prin);
  9.     SET @cnt = 0;
  10. * * SET @sqlStatement =CONCAT('SELECT E.id_evento, E.titulo, E.fecha_evento, E.lugar
  11. * * * * * * * * * * * *        FROM (SELECT id_evento, @cnt := (@cnt + 1) AS row_number
  12.                                     FROM gp_eventos_prin
  13.                                     ORDER BY ',sortBy,')) AS E *
  14.                               WHERE *rowNumber >= ', startIndex,' AND rowNumber < *', upperBound,')'
  15. * exec (sqlStatement);
  16. END$$
  17.  
  18. DELIMITER ;

La solución la "He obtenido" de esta web: http://www.thingy-ma-jig.co.uk/blog/...alphabetically

Pero el MySQL WorkBench me sigue diciendo que hay "algún error" y dice:
SQL Syntax Error near: 'DECLARE upperBound INT;
* * SET startIndex *= IF(startIndex *< 1, 1, start'

Y marca como un cuadradito rojo en la línea del DECLARE.

Ahora sí que ya no sé que hacer...

Alguna idea??

Gracias por todo y un Saludo!
__________________
Técnico Superior en Desarrollo de Apliciones Informáticas

Etiquetas: procedure, stored
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 15:32.