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

[SOLUCIONADO] Error de sintasix en PROCEDURE

Estas en el tema de Error de sintasix en PROCEDURE en el foro de Mysql en Foros del Web. Hola este es mi procedure @import url("http://static.forosdelweb.com/clientscript/vbulletin_css/geshi.css"); Código MySQL: Ver original DELIMITER ;;   DROP PROCEDURE IF EXISTS `SELECCIONAR` ;; CREATE PROCEDURE `SELECCIONAR` ( `DATOS` ...
  #1 (permalink)  
Antiguo 29/10/2014, 10:45
 
Fecha de Ingreso: julio-2014
Mensajes: 161
Antigüedad: 9 años, 9 meses
Puntos: 4
Error de sintasix en PROCEDURE

Hola este es mi procedure

Código MySQL:
Ver original
  1. DELIMITER ;;
  2.  
  3. DROP PROCEDURE IF EXISTS `SELECCIONAR`;;
  4. CREATE PROCEDURE `SELECCIONAR`(`DATOS` text, `LIKED` int(1), `PAGINA` int(15), `RESULTPORPAG` int(3),`USUARIO` int(10), `FECHA` datetime, `IP` varchar(15))
  5. DECLARE INFOUNO text;
  6.  
  7. DECLARE inilimite INT(10);
  8. SET dolar=(SELECT PRECIO FROM DOLAR ORDER BY ID DESC LIMIT 1);
  9. SET iva=(SELECT PORCENTAJE/100 FROM IVA ORDER BY ID DESC LIMIT 1);
  10.  
  11. IF(LIKED=1) THEN
  12.     SET @INFO=DATOS;
  13.     PREPARE stmt FROM "SELECT PRODUCTO FROM PRODUCTOS WHERE PRODUCTO LIKE ? LIMIT 0,10;";
  14.     EXECUTE stmt USING @INFO;
  15. IF(LIKED=2) THEN
  16.     IF(PAGINA=0) THEN
  17.         INSERT INTO BUSQUEDA (ID,USUARIO,DATOS,FECHA,IP) VALUES ('',USUARIO,DATOS,FECHA,IP);
  18.         SET @INI=0;
  19.     END IF;
  20.     IF(PAGINA>0) THEN
  21.         SET @INI=(PAGINA*RESULTPORPAG)-RESULTPORPAG;
  22.         SET DATOS=(SELECT DATOS FROM BUSQUEDA ORDER BY ID DESC LIMIT 1);
  23.     END IF;
  24.    
  25.     SET @FIN=RESULTPORPAG;
  26.     SET @INFO=DATOS;
  27.   SET @CONSTRUYE=CONCAT('SELECT ID,PRODUCTO,DESCRIPCION,
  28.                                 FORMAT((((((COSTOVENTA*',dolar,')*',iva,')+
  29.                                 ((COSTOVENTA*',dolar,')))*(UTILIDAD/100))+
  30.                                 (((COSTOVENTA*',dolar,')*',iva,')+
  31.                                 ((COSTOVENTA*',dolar,')))),2) AS PRECIOSINIVA,
  32.                                 FORMAT(((((((COSTOVENTA*',dolar,')*',iva,')+
  33.                                 ((COSTOVENTA*',dolar,')))*(UTILIDAD/100))+     
  34.                                 (((COSTOVENTA*',dolar,')*',iva,')+
  35.                                 ((COSTOVENTA*',dolar,'))))*',iva,'),2) AS IVAPAGAR,
  36.                                 FORMAT(((((((COSTOVENTA*',dolar,')*',iva,')+
  37.                                 ((COSTOVENTA*',dolar,')))*(UTILIDAD/100))+
  38.                                 (((COSTOVENTA*',dolar,')*',iva,')+
  39.                                 ((COSTOVENTA*',dolar,'))))*',iva,')+
  40.                                 (((((COSTOVENTA*',dolar,')*',iva,')+
  41.                                 ((COSTOVENTA*',dolar,')))*(UTILIDAD/100))+     
  42.                                 (((COSTOVENTA*',dolar,')*',iva,')+
  43.                                 ((COSTOVENTA*',dolar,')))),2) AS PRECIOCLIENT,
  44.                                 DISPONIBILIDAD,VERSIONHIST FROM HISTPRODS,PRODUCTOS
  45.                                 WHERE PRODUCTO LIKE ? AND
  46.                                 (IDPROD=ID AND VERSION=VERSIONHIST)                            
  47.                                 LIMIT ?, ?;');
  48.  
  49.  
  50.     PREPARE stmt FROM @CONSTRUYE;
  51.     EXECUTE stmt USING @INFO, @INI, @FIN;
  52. IF(LIKED=3) THEN
  53.     IF(PAGINA=0) THEN
  54.         INSERT INTO BUSQUEDA (ID,USUARIO,DATOS,FECHA,IP) VALUES ('',USUARIO,DATOS,FECHA,IP);
  55.         SET @INI=0;
  56.     END IF;
  57.     IF(PAGINA>0) THEN
  58.         SET @INI=(PAGINA*RESULTPORPAG)-RESULTPORPAG;
  59.         SET DATOS=(SELECT DATOS FROM BUSQUEDA ORDER BY ID DESC LIMIT 1);
  60.     END IF;
  61.     SET @FIN=RESULTPORPAG;
  62.     SET INFOUNO=(SELECT substring_index(DATOS,'|',1) FROM dual);
  63.     SET @INFODOS=(SELECT substring_index(substring_index(DATOS,'|',2),'|',-1) FROM dual);
  64.     SET @INFOTRES=(SELECT substring_index(substring_index(DATOS,'|',3),'|',-1) FROM dual);
  65.     SET @INFOCUATRO=(SELECT substring_index(DATOS,'|',-1) FROM dual);      
  66.     SET @SQLORDEN=REPLACE(INFOUNO,",","' OR `ORDEN` ='");
  67.     SET @CONSTRUYE=CONCAT('SELECT ID,PRODUCTO,DESCRIPCION,
  68.                                 FORMAT((((((`COSTOVENTA`*',dolar,')*',iva,')+
  69.                                 ((`COSTOVENTA`*',dolar,')))*(`UTILIDAD`/100))+
  70.                                 (((`COSTOVENTA`*',dolar,')*',iva,')+
  71.                                 ((`COSTOVENTA`*',dolar,')))),2) AS `PRECIOSINIVA`,
  72.                                 FORMAT(((((((`COSTOVENTA`*',dolar,')*',iva,')+
  73.                                 ((`COSTOVENTA`*',dolar,')))*(`UTILIDAD`/100))+     
  74.                                 (((`COSTOVENTA`*',dolar,')*',iva,')+
  75.                                 ((`COSTOVENTA`*',dolar,'))))*',iva,'),2) AS `IVAPAGAR`,
  76.                                 FORMAT(((((((`COSTOVENTA`*',dolar,')*',iva,')+
  77.                                 ((`COSTOVENTA`*',dolar,')))*(`UTILIDAD`/100))+
  78.                                 (((`COSTOVENTA`*',dolar,')*',iva,')+
  79.                                 ((`COSTOVENTA`*',dolar,'))))*',iva,')+
  80.                                 (((((`COSTOVENTA`*',dolar,')*',iva,')+
  81.                                 ((`COSTOVENTA`*',dolar,')))*(`UTILIDAD`/100))+     
  82.                                 (((`COSTOVENTA`*',dolar,')*',iva,')+
  83.                                 ((`COSTOVENTA`*',dolar,')))),2) AS `PRECIOCLIENT`,
  84.                                 `DISPONIBILIDAD`,`VERSIONHIST` FROM `HISTPRODS`,`PRODUCTOS`
  85.                                 WHERE `IDPROD`= `ID` AND `VERSION`=`VERSIONHIST`
  86.                                 AND  (`ORDEN` =  '?') AND                                  
  87.                                 ((((((((`COSTOVENTA`*',dolar,')*',iva,')+
  88.                                 ((`COSTOVENTA`*',dolar,')))*(`UTILIDAD`/100))+
  89.                                 (((`COSTOVENTA`*',dolar,')*',iva,')+
  90.                                 ((`COSTOVENTA`*',dolar,'))))*',iva,')+
  91.                                 (((((`COSTOVENTA`*',dolar,')*',iva,')+
  92.                                 ((`COSTOVENTA`*',dolar,')))*(`UTILIDAD`/100))+
  93.                                 (((`COSTOVENTA`*',dolar,')*',iva,')+
  94.                                 ((`COSTOVENTA`*',dolar,'))))>?) AND
  95.  
  96.                         (((((((`COSTOVENTA`*',dolar,')*',iva,')+
  97.                         ((`COSTOVENTA`*',dolar,')))*(`UTILIDAD`/100))+
  98.                         (((`COSTOVENTA`*',dolar,')*',iva,')+
  99.                         ((`COSTOVENTA`*',dolar,'))))*',iva,')+
  100.                         (((((`COSTOVENTA`*',dolar,')*',iva,')+
  101.                         ((`COSTOVENTA`*',dolar,')))*(`UTILIDAD`/100))+     
  102.                         (((`COSTOVENTA`*',dolar,')*',iva,')+
  103.                         ((`COSTOVENTA`*',dolar,'))))<?)) ORDER BY `PRECIOCLIENT`
  104.                         ? LIMIT ?,?;');
  105.  
  106.     PREPARE stmt FROM @CONSTRUYE;
  107.     EXECUTE stmt USING @SQLORDEN, @INFODOS,@INFOTRES,@INFOCUATRO,@INI,@FIN;
  108.  
  109. END;;
  110.  
  111. DELIMITER ;

Y este es el error:
Error en consulta (1064): Syntax error near '?') AND ((((((((`COSTOVENTA`*',dolar,')*',iva,')+ ((`' at line 49
  #2 (permalink)  
Antiguo 29/10/2014, 12:07
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 3 meses
Puntos: 447
Respuesta: Error de sintasix en PROCEDURE

Hola Rebuilding:

Tener algo como esto

Código:
...
((((((((`COSTOVENTA
...
Me hace pensar que algo estás haciendo mal... ¿para qué diablos necesitas tantos paréntesis?...

Código:
Poner algo así 

((1) * ((2) / (3)))

es lo mismo a poner 

1 * 2 / 3
El uso de paréntesis sólo debe aplicarse cuando realmente se necesita alterar el orden de ejecución de las operaciones...

Código:
no es lo mismo poner 

1 + 2 * 5 = 11

a poner

(1 + 2)  * 5 = 15
En tu caso, creo que haces un uso excesivo e inútil de paréntesis, esto puede ocasionarte problemas si no abres y cierras estos correctamente

Además debes tener cuidado con las comillas simples (')... ya que si quieres que formen parte de una cadena, debes "matarlas"... si quieres que una variable contenta la frase [Esta es una 'comilla' simple] deberías asignarla asi:

Código SQL:
Ver original
  1. mysql> SET @Variable = 'Esto es una ''comilla'' simple';
  2. Query OK, 0 ROWS affected (0.06 sec)
  3.  
  4. mysql> SELECT @Variable;
  5. +------------------------------+
  6. | @Variable                    |
  7. +------------------------------+
  8. | Esto es una 'comilla' simple |
  9. +------------------------------+
  10. 1 ROW IN SET (0.04 sec)

Es decir, la comilla exterior delimita el inicio y fin de la cadena, las comillas internas se deben poner con dos comillas simples (ojo, no es una comilla doble).

Saludos
Leo
  #3 (permalink)  
Antiguo 31/10/2014, 22:47
 
Fecha de Ingreso: julio-2014
Mensajes: 161
Antigüedad: 9 años, 9 meses
Puntos: 4
Respuesta: Error de sintasix en PROCEDURE

Hola, buenas noches, gracias por contestar, disculpa la tardanza.

La comilla simple que uso como abajo es una concatenacion de la variable dolar, descubri que el error es por un BUG que tiene mi version de mysql con los prepared statements con los ASC y DESC, por lo que concatene la variable que contiene esto y en los parametros de los limit no se puede concatenar se tiene que usar con prepared statements osea el BUG es al reves

Código MySQL:
Ver original
  1. *',dolar,'

Saludos y gracias

Última edición por Rebuilding; 31/10/2014 a las 22:52

Etiquetas: procedure, select, sql
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 19:31.