MySQL - Store Procedure

 
Vista:

Store Procedure

Publicado por Jaime Castillo Montes (1 intervención) el 11/05/2008 00:41:53
hola muchachos como estan, les vengo molestando con una duda, tengo masomenos cuatro dias intentando crear un store procedure y solamente estoy recibiendo errores, lo e intentado de mil maneras y nomas no, tengo una BD que se llama test, una tabla que se llama

prueba (
nombre varchar(20),
apellido varchar(20),
edad int,
sexo varchar(1)
)

y creo una function asi que creo es lo mas correcto

mysql> delimiter //
mysql> create function prueba_count (out param1 int)
mysql> begin
mysql> select count(*) into param1 from prueba;
mysql> end;
mysql>//

y recibo esto:

ERROR 164 (42000): You have an error in your SQL sintax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'out param int)
begin
select count(*) into param1 from prueba;
end' at line 1

cualquier ayuda muchas gracias
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:Store Procedure

Publicado por Gonzalo GC (339 intervenciones) el 11/05/2008 04:16:42
Una función se parece a un store procedure, pero tiene ciertas características:
1. TODOS los parámetros son SIEMPRE DE ENTRADA. No pueden ser de salida.
2. La función DEVUELVE UN SOLO VALOR, pero la devuelve conforme la declaración de prototipo. En tu caso sería CREATE FUNCTION PRUEBA_COUNT() RETURNS INT, y dentro del cuerpo, antes del END, debe ir RETURN PARAM1;
3. Las funciones hacer operaciones de diverso tipo, pero para leer o escribir tablas, debe indicarse antes del BEGIN: READS SQL DATA, ya que después puede dar un error de compilación en el momento de restaurar backups.
, en definitiva, el script necesario para la prueba sería:

DELIMITER //
CREATE FUNCTION prueba_count () RETURNS INT
READS SQLDATA
BEGIN
DELCARE param1 INT DEFAULT 0;
SELECT COUNT(*) INTO param1 FROM prueba;
END; //

DELIMITER ;
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Store Procedure

Publicado por Jaime Castillo Montes (9 intervenciones) el 11/05/2008 05:48:58
que onda gonzalo
muchas gracias por tu respuesta
fue muy rapida
ya no tengo el mismo error
jeje
pero tengo otro, haber si pudieses ayudarme
mira
mi script ahora quedo asi gracias a tu ayuda

create function prueba_count() returns int
reads sql data
begin
declare param1 int default 0;
select count(*) into param1 from prueba;
return param1;
end;//

y me marca el siguiente error

ERROR 1655 (HY000): Cannot create stored routine 'prueba_count'. Check warnings

de antemano muchas gracias
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Store Procedure

Publicado por Gonzalo GC (339 intervenciones) el 11/05/2008 17:24:31
En principio el código no tiene errores, salvo por dos detalles nimios, el segundo de los cuales que podría afectar si se ejecuta el script a nivel de consola y no con una interfase gráfica del tipo MySQL Qwery Browser:
1. El los script de creación de SP o functions, después de poner DELIMITER // o cualquier otro delimitador que prefieras menos el \ y el ;;), debes poner una sentencia de eliminación de toda versión anterior: DROP FUNCTION IF EXISTS prueba_count//
2. El script finaliza con END, pero este END lleva de cierre solamente el //, no el punto y coma, pero esto de todos modos lo he probado y no debería afectar la compilación.

Me ha quedado una sola duda, y es ¿qué versión de MySQL estás usando? ¿La 6.0?
Porque ese error no está listado para la 5.0 o la 4.0. Aparentemente tiene algo que ver con el sistema de recuperación de fallas o de creación de Tablespaces.

Yo sugiero que pruebes dropeando todo y empezando desde cero de vuelta (creando la tabla).
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Store Procedure

Publicado por Jaime Castillo Montes (9 intervenciones) el 11/05/2008 18:30:05
ajam
muchas gracias, entonces dejame empezar de nuevo, mi version del MySQL es la 6.0, dejame empezar de cero, y te dire como me fue
muchas gracias
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Store Procedure

Publicado por Jaime Castillo Montes (9 intervenciones) el 12/05/2008 06:26:42
hola gonzalo
estoy por aqui de nuevo, trate dropeando todo, y empezando de cero, hasta la BD borre, pero no funciono, me llamo la atencion que dijiste que habia una interfaz grafica, y la baje, intente con el query browser, y marca lo mismo

pero pues ahora ya se donde se esta parando, me llama la atencion que no pasa del create function. el query browser me dio ya un pedazo de script por default, yo solamente agregue lo del cuerpo
y me marca cannot create stored routine `prueba_contrador`. Check warnings

DELIMITER $$
DROP FUNCTION IF EXISTS `test`.`prueba_contador` $$
CREATE FUNCTION `test`.`prueba_contador` () RETURNS INT
BEGIN
declare param int default 0;
select count(*) into param from persona;
return param;
END $$

DELIMITER ;

mi version es la 6.0.4-alpha-community
muchas gracias
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Store Procedure

Publicado por Jaime Castillo Montes (9 intervenciones) el 12/05/2008 06:29:43
hola, me falto ponerle el reads sql data
si se lo puse y no funciono :(
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Store Procedure

Publicado por Gonzalo GC (339 intervenciones) el 12/05/2008 13:36:30
Vamos a intentar un ataque distinto al problema:
- Cuando te mandó la respuesta "ERROR 1655 (HY000): Cannot create stored routine 'prueba_count'. Check warnings ", debió haber un segundo renglón que comenzaba con "Warning: " y un número seguido de información. Posteá eso, a ver qué respondía.
- Verifica si en el archivo my.ini hay una línea que diga "sql-mode=" seguida de unos datos entrecomillados, al estilo sql-mode="STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION".
si la línea sql-mode está, anúlala , vuelve a inciar MySQL y prueba la función de nuevo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Store Procedure

Publicado por Jaime Castillo Montes (9 intervenciones) el 13/05/2008 07:18:34
que tal Gonzalo,
muchas gracias por tu valiosa ayuda, me sirvio de mucho, ya funciono :);
muchisimas gracias
si era por el renglon sql-mode
solo que no por el que esta en el archivo .ini
sino por el que esta en una tabla
solo tuve que hacer esto

mysql> set sql_mode = '';

y ya con eso se soluciono
muchas gracias
no sabes cuanto te lo agradesco
nos vemos luego, y si te puedo ayudar en algo, solo dilo, alomejor no sabre mucho, pero ago la lucha, soy desarrollador java, para lo que se te ofresca, no tendre mucha experiencia, pero tengo con que defenderme
nos vemos luego

y muchas gracias

hasta luego
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Store Procedure

Publicado por Gonzalo GC (339 intervenciones) el 13/05/2008 12:14:31
Gracias por tu oferta y me alegro que se haya solucionado.
Un saludo desde acá.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Store Procedure

Publicado por christain (1 intervención) el 06/06/2008 04:04:55
Gracias tenía el mismo problema... parece que en la versión 6 viene configurada por defecto el modo estricto...
Christian CM
Guayaquil - Ecuador
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Store Procedure

Publicado por Ronald Idone (1 intervención) el 20/09/2012 06:43:20
Gracias tenía el mismo problema...lo solucione ejecutando la sgte sentencia:

SET @@global.sql_mode= '';
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Store Procedure

Publicado por Anonimo (1 intervención) el 05/02/2015 03:52:42
Gracias!!!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar