PDA

Ver la Versión Completa : Ayuda con un Stored Procedure en MySQL


enecumene
09-09-2008, 18:15:04
Hola compañeros, tengo este procedimiento:

CREATE PROCEDURE sp_Consped
(
OUT S_No bigint(11),
OUT S_noped varchar(10),
OUT S_status varchar(100),
OUT S_respon varchar(100),
OUT S_fecharec date,
OUT S_fechaent date,
OUT S_Dpto varchar(100),
OUT S_tramiteno varchar(20),
OUT S_Area varchar(50),
OUT S_tipo varchar(20),
OUT S_urgente varchar(2),
OUT S_ficha varchar(15),
OUT S_fechasol date,
OUT S_solname varchar(100),
OUT S_hora1 varchar(25),
OUT S_User varchar(50),
OUT S_Dateuser date,
OUT S_Dptoid INT,
OUT S_Rubroid INT,
OUT S_Rubro varchar(100),
OUT S_Responid INT,
OUT S_Statusid INT,
OUT S_Hora varchar(25),
OUT S_Respon1 varchar(100)
)
BEGIN
/*Muestra los registros*/

Select p.no, p.no_ped, p.status, p.statusid, p.responsable, p.responsable1, p.fecha_sol_ped,
p.dpto, p.dptoid, p.fecha_rec_ped, p.tipo_exp, p.descripcion, p.fecha_ent_exp, p.tramite_no,
p.area, p.urgente, p.ficha, p.sol_name, p.hora, p.hora1, p.user, p.date, p.rubroid, p.responid
INTO S_No, S_noped, S_status, s_Statusid, S_Respon, S_Respon1, S_fechasol, S_Dpto, S_Dptoid, S_fecharec,
S_tipo, S_Rubro, S_fechaent, S_tramiteno, S_Area, S_urgente, S_ficha, S_solname, S_Hora, S_hora1, S_User,
S_Dateuser, S_Rubroid, S_Responid from reg_pedidos p;

END;

Al generarlo a través de PhpAdmin me tira el error:

MySQL ha dicho: http://localhost/phpmyadmin/themes/original/img/b_help.png (http://dev.mysql.com/doc/refman/5.1/en/error-messages-server.html)
#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 '' at line 36

¿Me está indicando que debo poner comillas? de veras no encuentro el problema o ¿es que debo generarlo en la linea de comando?

Saludos.

maeyanes
09-09-2008, 18:23:01
Hola...

Checa esta línea:


p.area, p.urgente, p.ficha, p.sol_name, p.hora, p.hora1, p.user, p.date, p.rubroid, p.responid

Si te fijas estás usando user y date, las cuales son dos palabras reservadas de SQL. Intenta encerrandolas entre comillas dobles: p."user", p."date".


Saludos...

enecumene
09-09-2008, 18:30:01
Hola...

Checa esta línea:

Código SQL [-] (http://www.clubdelphi.com/foros/#)p.area, p.urgente, p.ficha, p.sol_name, p.hora, p.hora1, p.user, p.date, p.rubroid, p.responid


Si te fijas estás usando user y date, las cuales son dos palabras reservadas de SQL. Intenta encerrandolas entre comillas dobles: p."user", p."date".


Saludos...

#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 '"user"', p.'"date"', p.rubroid, p.responid
INTO S_No, S_noped, S_status, s_Sta' at line 33

Esto me salió.

Saludos.

enecumene
09-09-2008, 18:58:57
Aparentemente no son esos campos, porque los quité y me da el mismo error. ¿Qué leñes será? :D, es la primera vez que estoy trabajando con SP, ¿es posible que hay usar comillas ``, "" ó ''?.

Saludos.

egostar
09-09-2008, 19:06:08
Hola

Dos cosas amigo, porque usas p.xxxxxx si no estas usando mas que una sola tabla, la otra es que pasa si usas comilla simple en lugar de comillas.

Salud OS

enecumene
09-09-2008, 19:08:40
Hola

Dos cosas amigo, porque usas p.xxxxxx si no estas usando mas que una sola tabla, la otra es que pasa si usas comilla simple en lugar de comillas.

Salud OS

Bueno lo primero son cosas mías por novatadas :D, lo segundo me da el mismo error.

jhonny
09-09-2008, 19:14:31
No conozco los procedimiento almacenados de MySQL, pero supongo que deberia quedar asi:

CREATE PROCEDURE sp_Consped
(
OUT S_No bigint(11),
OUT S_noped varchar(10),
OUT S_status varchar(100),
OUT S_respon varchar(100),
OUT S_fecharec date,
OUT S_fechaent date,
OUT S_Dpto varchar(100),
OUT S_tramiteno varchar(20),
OUT S_Area varchar(50),
OUT S_tipo varchar(20),
OUT S_urgente varchar(2),
OUT S_ficha varchar(15),
OUT S_fechasol date,
OUT S_solname varchar(100),
OUT S_hora1 varchar(25),
OUT S_User varchar(50),
OUT S_Dateuser date,
OUT S_Dptoid INT,
OUT S_Rubroid INT,
OUT S_Rubro varchar(100),
OUT S_Responid INT,
OUT S_Statusid INT,
OUT S_Hora varchar(25),
OUT S_Respon1 varchar(100)
)
BEGIN
/*Muestra los registros*/

Select p.no, p.no_ped, p.status, p.statusid, p.responsable, p.responsable1, p.fecha_sol_ped,
p.dpto, p.dptoid, p.fecha_rec_ped, p.tipo_exp, p.descripcion, p.fecha_ent_exp, p.tramite_no,
p.area, p.urgente, p.ficha, p.sol_name, p.hora, p.hora1, p.user, p.date, p.rubroid, p.responid
from reg_pedidos p
INTO S_No, S_noped, S_status, s_Statusid, S_Respon, S_Respon1, S_fechasol, S_Dpto, S_Dptoid, S_fecharec,
S_tipo, S_Rubro, S_fechaent, S_tramiteno, S_Area, S_urgente, S_ficha, S_solname, S_Hora, S_hora1, S_User,
S_Dateuser, S_Rubroid, S_Responid;

END;


Bueno lo primero son cosas mías por novatadas En cuanto a esto, debo confesar que tambien lo hago muy a menudo, pero es porque en muchas ocasiones necesito extendender el SQL un poco mas, de esa forma me evito posibles inconvenientes de una vez por todas.

enecumene
09-09-2008, 19:18:25
Pues me hace lo mismo amigo Jhonny, siempre es en la línea 35, 36, parece que hay que usar '' pero no lo entiendo de verdad.

Saludos.

egostar
09-09-2008, 19:31:31
Lo que he leido al respecto indica que deberias de usar el delimitador ``. Otra cuestión tal vez a manera de chapuza :D:D:D, estás haciendo un select de todos los campos de tu tabla????, si es así, porque no usar


SELECT * FROM TABLA
INTO .........


Salud OS

jhonny
09-09-2008, 19:36:01
Pues me hace lo mismo amigo Jhonny, siempre es en la línea 35, 36, parece que hay que usar '' pero no lo entiendo de verdad.

Saludos.

Para mi que debe ser lo que ya ha dicho maeyanes, user y date, deben ser palabras reservadas.

enecumene
09-09-2008, 19:43:24
¡Me rindo! :mad: :mad:

enecumene
09-09-2008, 19:45:22
Lo que he leido al respecto indica que deberias de usar el delimitador ``. Otra cuestión tal vez a manera de chapuza :D:D:D, estás haciendo un select de todos los campos de tu tabla????, si es así, porque no usar

Código SQL [-] (http://www.clubdelphi.com/foros/#)SELECT * FROM TABLA INTO .........


Salud OS

No amigo, no son todos los campos que quiero mostrar.

Para mi que debe ser lo que ya ha dicho maeyanes, user y date, deben ser palabras reservadas.

Había comentado anteriormente que los había quitado y me presentaba el mismo error.

Saludos.

jhonny
09-09-2008, 19:54:26
Había comentado anteriormente que los había quitado y me presentaba el mismo error.

Saludos.

¿Cuando los quitaste, Te aseguraste tambien de quitar la referencia a las variables de salida?, osea, S_User, S_Dateuser

egostar
09-09-2008, 19:55:26
Amigo

En Firebird, los parámetros de salida los tengo que asignar con ':' antes del parámetro, de tal forma que sería algo así....


INTO :S_No, :S_noped, :S_status, :s_Statusid, :S_Respon, :S_Respon1, .....


Salud OS

enecumene
09-09-2008, 19:56:54
¿Cuando los quitaste, Te aseguraste tambien de quitar la referencia a las variables de salida?, osea, S_User, S_Dateuser

Sip, los había quitado. ;)

Saludos.

PD. me da la impresión de que deberé hacerlo por comando :eek: (Cosa que odio :mad:).

TOPX
09-09-2008, 19:58:56
Hola,
Podría ser el delimiter:

DELIMITER //

CREATE PROCEDURE sp_Consped(
/* ... */
)
BEGIN
/* ...; */
END //

DELIMITER ;
Si define el montón de parámetros OUT es porque guardará sus valores en @variables, pero si sólo va a retornar los registros del select, casi estoy seguro no harían falta los parámetros.

enecumene
09-09-2008, 20:00:42
Amigo

En Firebird, los parámetros de salida los tengo que asignar con ':' antes del parámetro, de tal forma que sería algo así....

Código SQL [-] (http://www.clubdelphi.com/foros/#)INTO :S_No, :S_noped, :S_status, :s_Statusid, :S_Respon, :S_Respon1, .....


Salud OS

MySQL ha dicho: http://localhost/phpmyadmin/themes/original/img/b_help.png (http://dev.mysql.com/doc/refman/5.1/en/error-messages-server.html)
#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 ':S_No, :S_noped, :S_status, :S_Statusid, :S_Respon, :S_Respon1, :S_fechasol, :S_' at line 34

:D:D:D:D:D

enecumene
09-09-2008, 20:04:42
Hola,
Podría ser el delimiter:

Código SQL [-] (http://www.clubdelphi.com/foros/#)DELIMITER //

CREATE PROCEDURE sp_Consped(
/* ... */
)
BEGIN
/* ...; */
END //

DELIMITER ;

Si define el montón de parámetros OUT es porque guardará sus valores en @variables, pero si sólo va a retornar los registros del select, casi estoy seguro no harían falta los parámetros.

Pues parece que tampoco es el delimiter:

MySQL ha dicho: http://localhost/phpmyadmin/themes/original/img/b_help.png (http://dev.mysql.com/doc/refman/5.1/en/error-messages-server.html)
#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 'DELIMITER //

CREATE PROCEDURE sp_Consped
(
OUT S_No bigint(11),
OUT S_nope' at line 1

Saludos.

felipe88
09-09-2008, 20:22:30
Hola, Tampoco conozco MySQL pero como dice jhonny ¿no te funciona? no hay que darle return o algo por el estilo, podrias mirar en este articulo (http://dev.mysql.com/doc/refman/5.0/es/create-procedure.html) a ver...

enecumene
09-09-2008, 20:30:39
Hola, Tampoco conozco MySQL pero como dice jhonny ¿no te funciona? no hay que darle return o algo por el estilo, podrias mirar en este articulo (http://dev.mysql.com/doc/refman/5.0/es/create-procedure.html) a ver...

Efectivamente ese es el artículo que he estado viendo y que no lo he entendido del todo, por eso puse este hilo aquí.

Saludos.

felipe88
09-09-2008, 21:17:50
No se porque, pero me llamó la atención este error, he leido en otras partes que puede ser debido a los permisos que tengas o inclusive por valores nulos... espero te sirva de algo :)


...aunque sea para subirte el animo :D

enecumene
13-09-2008, 20:47:08
Saludos colegas, perdonen la tardanza, gracias a mi amigo edgar(Poliburro), he podido lograr hacer un procedimiento sencillo con otro manejador que no es el PhpmyAdmin, al parecer dicho manejador no soporta procedimientos y triggers, el manejador que usaré a partir de ahora es el dreamcoder for MySQL. Seguiré haciendo procedimientos un poco mas complejos que iré posteando por aquí ;).


Saludos.

enecumene
14-09-2008, 23:17:57
Hola amigos, estoy haciendo el siguiente procedimiento:

CREATE PROCEDURE `SP_Buscaped`(Filtro varchar(20),Ano INT(4),Texto Varchar(50))
BEGIN

/*****************************************************************************/
/* OPERACION QUE REALIZA LA BUSQUEDA DE ACUERDO AL FILTRO */
/*****************************************************************************/
if Filtro = 'Pedido' THEN

SELECT * FROM reg_pedidos WHERE no_ped Like :Texto And fecha_rec_ped >= CONCAT(:Ano,'-01','-01') And fecha_rec_ped<= CONCAT(:Ano,'-12','-31');

END IF;
END;

La cuestión es ¿como le doy valores a los parametros de entrada desde Delphi?, lo estoy llamando desde un TQuery:

call SP_buscaped(Filtro,Ano,Texto);


Pero no me regresa nada, :confused:

Saludos.