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

Procedimiento Almacenado

Estas en el tema de Procedimiento Almacenado en el foro de Mysql en Foros del Web. hola amigos, felices fiestas, quisiera consultar que esta mal en este procedimiento que no me funciona DELIMITER $$; DROP PROCEDURE IF EXISTS `lfox3`.`IntroducePersona`$$ CREATE DEFINER=`root`@`localhost` ...
  #1 (permalink)  
Antiguo 23/12/2009, 08:55
 
Fecha de Ingreso: marzo-2006
Mensajes: 202
Antigüedad: 18 años, 1 mes
Puntos: 2
Procedimiento Almacenado

hola amigos, felices fiestas, quisiera consultar que esta mal en este procedimiento que no me funciona

DELIMITER $$;

DROP PROCEDURE IF EXISTS `lfox3`.`IntroducePersona`$$

CREATE DEFINER=`root`@`localhost` PROCEDURE `IntroducePersona`(IN unidad_zn varchar(5), IN descripcion varchar(50), IN dominio varchar(20))
BEGIN
INSERT INTO unidad_zn(unidad_zn,descripcion,dominio)
VALUES(unidad_zn,descripcion,dominio);
END$$

DELIMITER ;$$



la estructura de la tabla es:


/*Column Information For - lfox3.unidad_zn*/
--------------------------------------------

Field Type Collation Null Key Default Extra Privileges Comment
----------- ----------- ----------------- ------ ------ ------- -------------- ------------------------------- -------
idnum int(11) (NULL) NO PRI (NULL) auto_increment select,insert,update,references
unidad_zn varchar(5) latin1_swedish_ci NO PRI select,insert,update,references
descripcion varchar(50) latin1_swedish_ci NO select,insert,update,references
dominio varchar(20) latin1_swedish_ci YES (NULL) select,insert,update,references

/*Index Information For - lfox3.unidad_zn*/
-------------------------------------------

Table Non_unique Key_name Seq_in_index Column_name Collation Cardinality Sub_part Packed Null Index_type Comment
--------- ---------- -------- ------------ ----------- --------- ----------- -------- ------ ------ ---------- -------
unidad_zn 0 PRIMARY 1 idnum A 3 (NULL) (NULL) BTREE
unidad_zn 0 PRIMARY 2 unidad_zn A 3 (NULL) (NULL) BTREE

/*DDL Information For - lfox3.unidad_zn*/
-----------------------------------------

Table Create Table
--------- --------------------------------------------
unidad_zn CREATE TABLE `unidad_zn` (
`idnum` int(11) NOT NULL auto_increment,
`unidad_zn` varchar(5) NOT NULL,
`descripcion` varchar(50) NOT NULL,
`dominio` varchar(20) default NULL,
PRIMARY KEY (`idnum`,`unidad_zn`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1


y lo mando a llamar desde PHP con esta instruccion:

$unidad_zn = "VII";
$descripcion = "SEPTIMA REGION";
$dominioK = "BNILAHUE";
$result2 = mysql_query("CALL IntroducePersona('".$unidad_zn."','".$descripcion. "','".$dominioK."')",$lfox3);


una ayuda, gracias
  #2 (permalink)  
Antiguo 23/12/2009, 09:11
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, 5 meses
Puntos: 2658
Respuesta: Procedimiento Almacenado

En principio, estás usando los mismos nombres para las variables que para los campos de la tabla. Eso puede causar problemas a MySQL.
Prueba:

Código MySQL:
Ver original
  1. DELIMITER $$;
  2.  
  3. DROP PROCEDURE IF EXISTS `lfox3`.`IntroducePersona`$$
  4.  
  5. CREATE DEFINER=`root`@`localhost` PROCEDURE `IntroducePersona`
  6.     (IN v_unidad_zn varchar(5), IN v_descripcion varchar(50), IN v_dominio varchar(20))
  7.     INSERT INTO unidad_zn(unidad_zn,descripcion,dominio)
  8.     VALUES(v_unidad_5zn, v_descripcion, v_dominio);
  9. END$$
  10.  
  11. DELIMITER ;$$
__________________
¿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 23/12/2009, 09:41
 
Fecha de Ingreso: marzo-2006
Mensajes: 202
Antigüedad: 18 años, 1 mes
Puntos: 2
Respuesta: Procedimiento Almacenado

nop perciste el problema ahora lo deje asi:


DELIMITER $$;

DROP PROCEDURE IF EXISTS `lfox3`.`IntroducePersona`$$

CREATE DEFINER=`root`@`localhost` PROCEDURE `IntroducePersona`(IN v_unidad_zn varchar(5), IN v_descripcion varchar(50), IN v_dominio varchar(20))
BEGIN
INSERT INTO unidad_zn(unidad_zn,descripcion,dominio)
VALUES(v_unidad_zn,v_descripcion,v_dominio);
END$$

DELIMITER ;$$

y aun nada
  #4 (permalink)  
Antiguo 23/12/2009, 10:25
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, 5 meses
Puntos: 2658
Respuesta: Procedimiento Almacenado

¿Genera algún error? ¿O es que simplemente no inserta los datos?

Otro si digo:

¿Por qué tienes definida la PK con dos campos, si el AUTO_INCREMENT es suficiente como PK?
Código MySQL:
Ver original
  1. CREATE TABLE `unidad_zn` (
  2. `idnum` int(11) NOT NULL auto_increment PRIMAY KEY,
  3. `unidad_zn` varchar(5) NOT NULL,
  4. `descripcion` varchar(50) NOT NULL,
  5. `dominio` varchar(20) default NULL

Eso hace que se requiera el ingreso de todos los valores, y además, no te evitará la duplicación de valores en unidad_zn, ya que la clave jamás se repetiría por ser autoincremental una de sus partes.
Por otro lado, si unidad_zn tiene valores distintos entre si, no necesitas el autoincremental...
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #5 (permalink)  
Antiguo 23/12/2009, 11:56
 
Fecha de Ingreso: marzo-2006
Mensajes: 202
Antigüedad: 18 años, 1 mes
Puntos: 2
Busqueda Respuesta: Procedimiento Almacenado

no genera errores, para nada, lo que sucede es que solo no ingresa los datos ahora con respecto a lo que me dices de la PK, la unica clave de esta tabla es idnum que es autoincrementable, no hay otra PK, los datos de esta tabla son:

idnum unidad_zn descripcion dominio
1 VI SEXTA REGION BNILAHUE
2 VIII OCTAVA REGION BNILAHUE
3 RM REGION METROPOLITANA BNILAHUE


PUEDO DE ALGUNA MANERA REVISAR LA EJECUCION DEL PROCEDIMIENTO, ALGO ASI COMO ITERARLO???
  #6 (permalink)  
Antiguo 23/12/2009, 12:50
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, 5 meses
Puntos: 2658
Respuesta: Procedimiento Almacenado

Cita:
la unica clave de esta tabla es idnum que es autoincrementable, no hay otra PK
No me refiero a que haya otra PK, ya que por definición no pueden existir dos PK en la misma tabla. Me refiero a eso:
Cita:
CREATE TABLE `unidad_zn` (
`idnum` int(11) NOT NULL auto_increment,
`unidad_zn` varchar(5) NOT NULL,
`descripcion` varchar(50) NOT NULL,
`dominio` varchar(20) default NULL,
PRIMARY KEY (`idnum`,`unidad_zn`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1
En ese caso estás definiendo una PK basada en dos campos, cuando debería ser en uno sólo, ya que el campo idnum es autoincremental, y en MySQL un campo autoincremental es PK por default.
El problema es que al poner un campo doble se te producen dos inconvenientes:
1. Tienes que ingresar si o sí los dos valores (incluyendo el idnum).
2. No puedes asegurar que no se repita unidad_zn en una PK, ya que el primer componente siempre variará aunque unidad_zn sea igual, con lo que la integridade de clave primaria existirá, pero no la unicidad de unidad_zn.

¿Se entiende?

Lo que puede suceder es esto:
Cita:
idnum unidad_zn descripcion dominio
1 VI SEXTA REGION BNILAHUE
2 VIII OCTAVA REGION BNILAHUE
3 RM REGION METROPOLITANA BNILAHUE
4 VIII OCTAVA REGION BNILAHUE
5 VIII OCTAVA REGION BNILAHUE
6 VIII OCTAVA REGION BNILAHUE
7 RM REGION METROPOLITANA BNILAHUE
A eso me refiero con que la clave primaria está mal definida en esa tabla.

Cita:
PUEDO DE ALGUNA MANERA REVISAR LA EJECUCION DEL PROCEDIMIENTO, ALGO ASI COMO ITERARLO???
No. Los stored procedures no son debuggeables porque corren en un subproceso encapsulado en la base.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #7 (permalink)  
Antiguo 24/12/2009, 08:46
 
Fecha de Ingreso: marzo-2006
Mensajes: 202
Antigüedad: 18 años, 1 mes
Puntos: 2
Respuesta: Procedimiento Almacenado

ya la modifique tenias razon ahora entiendo, asi quedo

/*Column Information For - lfox3.unidad_zn*/
--------------------------------------------

Field Type Collation Null Key Default Extra Privileges Comment
----------- ----------- ----------------- ------ ------ ------- -------------- ------------------------------- -------
idnum int(11) (NULL) NO PRI (NULL) auto_increment select,insert,update,references
unidad_zn varchar(5) latin1_swedish_ci NO select,insert,update,references
descripcion varchar(50) latin1_swedish_ci NO select,insert,update,references
dominio varchar(20) latin1_swedish_ci NO select,insert,update,references

/*Index Information For - lfox3.unidad_zn*/
-------------------------------------------

Table Non_unique Key_name Seq_in_index Column_name Collation Cardinality Sub_part Packed Null Index_type Comment
--------- ---------- -------- ------------ ----------- --------- ----------- -------- ------ ------ ---------- -------
unidad_zn 0 PRIMARY 1 idnum A 3 (NULL) (NULL) BTREE

/*DDL Information For - lfox3.unidad_zn*/
-----------------------------------------

Table Create Table
--------- --------------------------------------------
unidad_zn CREATE TABLE `unidad_zn` (
`idnum` int(11) NOT NULL auto_increment,
`unidad_zn` varchar(5) NOT NULL,
`descripcion` varchar(50) NOT NULL,
`dominio` varchar(20) NOT NULL,
PRIMARY KEY (`idnum`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1

pero aun no puedo solucionar el tema del procedimiento.
  #8 (permalink)  
Antiguo 24/12/2009, 09:27
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, 5 meses
Puntos: 2658
Respuesta: Procedimiento Almacenado

Bien. Ya hay un problema menos.
El problema es ahora que el script del SP tiene algunos problemas menores de sintaxis.
El cuerpo del Script a cargar sería:
Código MySQL:
Ver original
  1. DROP PROCEDURE IF EXISTS `IntroducePersona`;
  2. DELIMITER $$
  3. CREATE PROCEDURE `IntroducePersona`
  4.     (IN v_unidad_zn VARCHAR(5),
  5.     IN v_descripcion VARCHAR(50),
  6.     IN v_dominio VARCHAR(20))
  7.     INSERT INTO unidad_zn(unidad_zn,descripcion,dominio)
  8.     VALUES(v_unidad_zn, v_descripcion, v_dominio);
  9. END$$
  10. DELIMITER ;

El problema es que no están bien puestos los DELIMITER. Este DELIMITER no es una sentencia, como puede parecer, sino un comando, y los comandos se ejecutan en este caso sin los terminadores de sentencia.
Lo que sucedía es que habías puesto el punto y coma después del "$$", y no va, Como tampoco va el "$$" después de poner ";". En realidad la ejecución del DELIMITER es instantánea, como el de USE en el cambio de bases.
Además, había una variable mal escrita en el cuerpo del script.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #9 (permalink)  
Antiguo 24/12/2009, 11:26
 
Fecha de Ingreso: marzo-2006
Mensajes: 202
Antigüedad: 18 años, 1 mes
Puntos: 2
Respuesta: Procedimiento Almacenado

nop da el siguiente error

(0 row(s) affected)
(0 ms taken)

Error Code : 1064
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'END$$
DELIMITER' at line 1
(0 ms taken)
  #10 (permalink)  
Antiguo 24/12/2009, 11:35
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, 5 meses
Puntos: 2658
Respuesta: Procedimiento Almacenado

¿Con qué estás cargando el SP?
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #11 (permalink)  
Antiguo 24/12/2009, 13:06
 
Fecha de Ingreso: marzo-2006
Mensajes: 202
Antigüedad: 18 años, 1 mes
Puntos: 2
Respuesta: Procedimiento Almacenado

con que interfaz, sis es eso es con SQLyog version 5.12
  #12 (permalink)  
Antiguo 28/12/2009, 07:25
 
Fecha de Ingreso: marzo-2006
Mensajes: 202
Antigüedad: 18 años, 1 mes
Puntos: 2
Respuesta: Procedimiento Almacenado

sera posible que me faciliten un ejemplo para poder implementarlo, me refiero una tabla x con unos 3 campos, el SP que haga lo que sea insertar o cambiar o lo que sea y el como llamarlo desde PHP? yo creo que es mucho pedir, pero como dicen en pedir no hay engaño....
  #13 (permalink)  
Antiguo 28/12/2009, 07:33
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, 5 meses
Puntos: 2658
Respuesta: Procedimiento Almacenado

De acuerdo a esto: Working with Views, Stored Procedures and Triggers, el problema está dado por tu versión de SQLyog, ya que tienes la 5.12, y la sintaxis que yo proponía corresponde a la soportada por la 5.17.

Prueba poniendo la anterior:
Código MySQL:
Ver original
  1. DELIMITER $$ ;
  2. DROP PROCEDURE IF EXISTS `IntroducePersona`$$
  3. CREATE PROCEDURE `IntroducePersona`
  4.     (IN v_unidad_zn VARCHAR(5),
  5.     IN v_descripcion VARCHAR(50),
  6.     IN v_dominio VARCHAR(20))
  7.     INSERT INTO unidad_zn(unidad_zn,descripcion,dominio)
  8.     VALUES(v_unidad_zn, v_descripcion, v_dominio);
  9. END$$
  10. DELIMITER  ; $$

Yo personalmente prefiero trabajar con el MySQL Query Browser, que al ser de MySQL, es completamente compatible.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
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 09:33.