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

Procedimientos almacenados variable out

Estas en el tema de Procedimientos almacenados variable out en el foro de Mysql en Foros del Web. tengo este procedimiento creado que genera codigos create PROCEDURE Genera (param varchar(40),OUT codgen varchar(8)) BEGIN declare ceros int; declare ult INT; SELECT ult=numero + 1 ...
  #1 (permalink)  
Antiguo 09/04/2012, 23:32
 
Fecha de Ingreso: abril-2012
Ubicación: surquillo
Mensajes: 44
Antigüedad: 12 años
Puntos: 0
Procedimientos almacenados variable out

tengo este procedimiento creado que genera codigos

create PROCEDURE Genera (param varchar(40),OUT codgen varchar(8))
BEGIN
declare ceros int;
declare ult INT;
SELECT ult=numero + 1 FROM `generador` WHERE Parametro = param;
SET ceros = 3 - LENGTH(ult);
SET codgen = LEFT(param,5)+REPEAT('0',ceros) +convert(ult,char);
update `generador` set numero=ult where parametro =param;
END



al momento de coorer el procedimiento "Genera" dentro d otro procedimiento me sale error

create procedure usu_nuevo(INOUT codusu varchar(8),id varchar(20),pass varchar(20))
begin
declare xcod varchar(8);
call Genera ('usuarios', xcod);//procedimiento Genera
set codusu=xcod;
insert into usuarios VALUES(codusu,id,pass);
end;

call usu_nuevo('','clever','123');

OUT or INOUT argument 1 for routine ferreteria.usu_nuevo is not a variable or NEW pseudo-variable in BEFORE trigger

ayuda porfa creo q el error esta en la variable de salida out
  #2 (permalink)  
Antiguo 10/04/2012, 04:24
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: Procedimientos almacenados variable out

Cita:
OUT or INOUT argument 1 for routine ferreteria.usu_nuevo is not a variable or NEW pseudo-variable in BEFORE trigger
No. El problmea está en el primer parámetro.
En realidad el problema es que no existe el tipo "PARAM" entre los tipos de parámetros de un SP.
Debe ser uno de tres: IN, OUT o INOUT.

No te olvides que estás usando MySQL, no otro DBMS. Respeta la sintaxis.
__________________
¿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 11/04/2012, 00:22
 
Fecha de Ingreso: abril-2012
Ubicación: surquillo
Mensajes: 44
Antigüedad: 12 años
Puntos: 0
Respuesta: Procedimientos almacenados variable out

man param es una variable q lo e llamado asi :( ayuda con el codigo xfa
  #4 (permalink)  
Antiguo 11/04/2012, 06:12
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: Procedimientos almacenados variable out

Mirando con cuidado, el problema es simple. El SP usu_nuevo requiere como parámetro de entrada una variable o pseudovariable, pero le estás enviando una constante:
Código MySQL:
Ver original
  1. CALLusu_nuevo('','clever','123');
Como puedes ver, en el primer parámetro estás entrando un caracter vací, pero lo estás haciendo directamente y no con una variable.
Como el parámetro es de entrada salida, y por definición a una constante no se le puede asignar un valor, el SP falla al intentar hacerlo.
¿Se entiende?

Debes si o si usar una variable de usuario para llamar ese SP en forma directa, o bien una variable local si lo llamas desde otro 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)
  #5 (permalink)  
Antiguo 11/04/2012, 07:51
 
Fecha de Ingreso: abril-2012
Ubicación: surquillo
Mensajes: 44
Antigüedad: 12 años
Puntos: 0
Respuesta: Procedimientos almacenados variable out

ya mira t explico este codigo lo tengo hecho en sql funciona ala perfeccion pero en mysql no me sale
CODIGO SQL :

CREATE TABLE generador (Parametro varchar(40)primary key,
numero int)
go
insert into generador values('usuarios',0) //para q el codigo generado sea en en la tabla usuarios

CREATE PROCEDURE SPGENERADOR
@PARAM VARCHAR(40),
@CODGEN VARCHAR(8) OUTPUT
AS
DECLARE @CEROS INT,@ULT INT
SELECT @ULT = numero + 1 FROM GENERADOR WHERE PARAMETRO = @PARAM
SET @CEROS = 3 - LEN(CONVERT(VARCHAR,@ULT))
SET @CODGEN = LEFT(@PARAM,5) + REPLICATE('0',@CEROS) + CONVERT(VARCHAR,@ULT)
UPDATE GENERADOR SET numero = @ULT WHERE PARAMETRO = @PARAM// param es uan variable declarada

create table usuarios(//la tabla debe llamarse q el campo de la tabla genereador
codusu varchar(8)primary key,
acc varchar(20),
idusu varchar(20),
passusu varchar(20)
)
create proc SP_NueUsu
@codUsu varchar(8)output,
@acc varchar(20),
@id varchar(20),
@pass varchar(20)
as
begin
declare @XCOD varchar(8)
EXECUTE SPGENERADOR 'usuarios',@XCOD OUTPUT// aca se agisna q es variable d salida pero en el mysql no se como asignarla
SET @codUsu= @XCOD
INSERT INTO usuarios VALUES(@codUsu,@acc,@id,@pass)
END
GO

EXEC SP_NueUsu '','Administrador','Papi','123'// aca corre correctamente pero en mysql no :V
creo q es x la variable out put variable de salida

si quieres prueba el codigo en sql y veras q sale
gracias x tu ayuda
  #6 (permalink)  
Antiguo 11/04/2012, 10:17
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: Procedimientos almacenados variable out

En primer lugar, y por sobre todas las cosas, debes recordar un detalle: No existe un PL/SQL estandar.
Eso significa que cada DBMS hace con su versión de PL/SQL lo qe se le canta, y niniguno es compatible con la sintaxis de otro DBMS diferente (la próxima vez recuerda que no existe el SQL como DBMS, sino el MICROSOFT SQL SERVER).
Con esto quiero decir que en irrelevante si tu SP funciona en SQL Server, porque ni la sintaxis ni la lógica, ni el uso de las variables se parecen. Tiene4s que atenerte a la sintaxis de MySQL, no la de SQL Server. Y esa sintaxis la puedes ver sin problema en el manual de referencia.

En cuanto a este detalle:
Código SQL:
Ver original
  1. EXEC SP_NueUsu '','Administrador','Papi','123'
Me resulta extraño que SQL Server acepte una constante donde debería existir una variable, pero si esto no prdue un error, puede ser asunto de SQL Server el cómo lo maneja.
En cuanto a MySQL, lo primero que debo preguntarte es ¿cómo llamas al SP usu_nuevo? ¿Programáticamente o a través de otro script?

SI lo haces programáticamente, la variable debe ser una variable de sesión de usuario de MySQL, y la conexión debe ser permanente.
Si lo haces dentro de un SP, se puede usar una variable local.

Empecemos por allí.
__________________
¿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 11/04/2012, 13:09
 
Fecha de Ingreso: abril-2012
Ubicación: surquillo
Mensajes: 44
Antigüedad: 12 años
Puntos: 0
Respuesta: Procedimientos almacenados variable out

SP USU NUEVO es un procedimiento almacenado para crear un nuevo usuario dentro d este procedimiento se ejecuta otro procedimiento que es sp_generador que generada el codigo para el usuario clientes mediante esta sintaxis

EXECUTE SPGENERADOR 'usuarios',@XCOD OUTPUT// aca se agisna q es variable d salida pero en el mysql no se como asignarla
SET @codUsu= @XCOD


la constante que esta vacia es la constante donde va ir el codigo generado osea el
EXECUTE SPGENERADOR 'usuarios',@XCOD OUTPUT
SET @codUsu= @XCOD //aca se asigna a la variable codusu a xcod q xcod va ser el codigo generado por sp_generador


EXEC Y EXECUTE ES IGUAL EN SQL
el codigo en sql CORRE EN SQL SERVER MANAGEMENT STUDIO

Última edición por losaltlv; 11/04/2012 a las 13:20
  #8 (permalink)  
Antiguo 12/04/2012, 10:43
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: Procedimientos almacenados variable out

Volvamos al principio:
Procedimiento Genera:
Código MySQL:
Ver original
  1. DELIMITER $$
  2. CREATE PROCEDURE Genera(IN param VARCHAR(40), OUT codgen V(8))
  3.     DECLARE ceros INT;
  4.     DECLARE ult INT;
  5.     SET ULT = (SELECT (numero + 1) FROM `generador` WHERE Parametro = param);
  6.     SET ceros = 3 - LENGTH(ult);
  7.          /* Suponiendo que lo que quieres es crear una cadena rellena con ceros a la izquierda,
  8.          más  un numero final. */
  9.     SET codgen = CONCAT(LPAD('0',ceros, LEFT(param,5), ult);
  10.     UPDATE `generador` SET numero = ult WHERE parametro = param;
  11. END$$
  12. DELIMITER ;

Procedimiento usu_nuevo:
Código MySQL:
Ver original
  1. DELIMITER $$
  2. CREATE PROCEDURE usu_nuevo(INOUT codusu VARCHAR(8),IN id VARCHAR(20), IN pass VARCHAR(20))
  3.     DECLARE xcod VARCHAR(8);
  4.     CALL Genera('usuarios', xcod);
  5.     INSERT INTO usuarios VALUES(xcod, id, pass);
  6.     SET codusu = xcod;
  7. END$$
  8. DELIMIITER ;

Llamando a USU_NUEVO:
Código MySQL:
Ver original
  1. SET @id := ''; /* Crear una variable de sesión de usuario, sin ella, el  llamado no funciona*/
  2. CALL usu_nuevo(@id, 'clever', '123');
__________________
¿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 13/04/2012, 00:15
 
Fecha de Ingreso: abril-2012
Ubicación: surquillo
Mensajes: 44
Antigüedad: 12 años
Puntos: 0
Respuesta: Procedimientos almacenados variable out

DELIMITER $$
CREATE PROCEDURE Genera(IN param VARCHAR(40), OUT codgen char(8))
BEGIN
DECLARE ceros INT;
DECLARE ult INT;
SET ULT = (SELECT (numero + 1) FROM `generador` WHERE Parametro = param);
SET ceros = 3 - LENGTH(ult);
/* Suponiendo que lo que quieres es crear una cadena rellena con ceros a la izquierda,
más un numero final. */
SET codgen = CONCAT(LPAD('0',ceros, LEFT(param,5), ult);
UPDATE `generador` SET numero = ult WHERE parametro = param;
END$$
DELIMITER ;

sale este error :

Incorrect parameter count in the call to native function 'LPAD'


la sintaxis creo q sta mal :v
la finalidad d este codigo es tener un auto generador de codigo y q cuente los usuarios q tienen ellos q estos se alojan en la tabla genereador
si no legal usare el auto_increment :v odio irme x lo facil pero q qeda
igual man agradesco toda tu ayuda

Última edición por losaltlv; 13/04/2012 a las 00:37
  #10 (permalink)  
Antiguo 13/04/2012, 04:07
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: Procedimientos almacenados variable out

Acá encontrarás la sintaxis correcta de la función que necesitas, aunque en lugar de LPAD probablemente lo que necesites sea RPAD que es su complementaria:

MySQL :: 12 Funciones y operadores


Por otro lado, ¿por que no nos explicas exactamente cómo debe quedar armado el código con algún ejemplo?
De esa forma podríamos entender lo que quieres lograr... Que tú lo entiendas no implica que nosotros entendamos lo que quieres fabricar.
Un ejemplo siempre es la mejor idea.
__________________
¿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 13/04/2012, 09:55
 
Fecha de Ingreso: abril-2012
Ubicación: surquillo
Mensajes: 44
Antigüedad: 12 años
Puntos: 0
Respuesta: Procedimientos almacenados variable out

ok tengo la tabla genereador
Parametro
num

la tabla usuarios
cod
nom
ape

ahora tengo qiero crear un procedimiento almacenado que me genere codigos este procedimiento debe agarrar las 3 del Parametro de la tabla generador y esas 3 o 4 letras se suman con los numero por ejemplo

ingreso un usuario
me tendria q salir algo asi ya q el parametro es 'usuarios'
el primer usuario saldria
usu01 clever caceres
el segundo
usu02 angel david
asi sucesivamente

el generador a la ves q genereda los codigos
tambien cuenta los usuarios que se han ingresado

yaq ingrese dos usuarios

la tabla generador me debedia salir asi

Parametro num
usuarios 2

bueno espero q me haiga explicado mejor jejejejee
mas bien disculpe por no haber hecho esto es q soy nuevo en el foro
  #12 (permalink)  
Antiguo 15/04/2012, 00:23
 
Fecha de Ingreso: abril-2012
Ubicación: surquillo
Mensajes: 44
Antigüedad: 12 años
Puntos: 0
Respuesta: Procedimientos almacenados variable out

ya se cerro este caso :(?
  #13 (permalink)  
Antiguo 15/04/2012, 08:06
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: Procedimientos almacenados variable out

No, pero el fin de semana lo dedico más a jugar con mis hijos...

Mira, para transformar dos datos en un "código" (personalmente lo solucionaría de otra forma, pero es tu decisión), en tu caso no es necesario que uses dos stored procedures, sino un stored procedure y un stored function.
Los SF son parecidos a los SP, pero sólo devuelven un único valor, no pueden devolver tablas y todos sus parámetros son IN., pero es exactamente lo que necesitas.
El modelo de clave que usas está compuesta en realidad de dos datos, nada más: Una cadena y un número, con longitud fija y rellenado de ceros a la izquierda. Entonces para lograr una función que devuelva eso necesitas:
Código MySQL:
Ver original
  1. DELIMITER $$
  2. CREATE FUNCTION generarclave(v_cadena varchar(50), v_numero INT, v_ancho INT) RETURNS VARCHAR(50)
  3.     DECLARE retorno VARCHAR(50);
  4.     SET retorno = CONCAT(v_cadena, LPAD(v_numero, v_ancho, '0'));
  5.     RETURN retorno;
  6. END$$
  7. DELIMITER ;
Este tipo de SF daría como resultado:
Código SQL:
Ver original
  1. mysql> SELECT GENERARCLAVE('USU', 123, 5);
  2. +-----------------------------+
  3. | GENERARCLAVE('USU', 123, 5) |
  4. +-----------------------------+
  5. | USU00123                    |
  6. +-----------------------------+
  7. 1 ROW IN SET (0.00 sec)

El SP sería, entonces:
Código MySQL:
Ver original
  1. DELIMITER $$
  2. CREATE PROCEDURE usu_nuevo(INOUT codusu VARCHAR(8),IN id VARCHAR(20), IN pass VARCHAR(20))
  3.     DECLARE v_cod INT;
  4.     SET v_cod = (SELECT (numero + 1) FROM `generador` WHERE Parametro = 'usuarios');
  5.     SET codusu = generarclave('usu', v_cod, 5);
  6.     INSERT INTO usuarios VALUES(codusu, id, pass);
  7. END$$
  8. DELIMIITER ;

Incluso, si lo que quieres es que te devuelva una clave que puedas crear más dinámicamnete, especificando el ancho de la cadena que quieres que tome, lo único que debes hacer es agregar el parámetro para ser usado donde corresponda.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #14 (permalink)  
Antiguo 16/04/2012, 00:00
 
Fecha de Ingreso: abril-2012
Ubicación: surquillo
Mensajes: 44
Antigüedad: 12 años
Puntos: 0
Respuesta: Procedimientos almacenados variable out

sale este error :V

Cannot create stored routine `generarclave`. Check warnings

tengo el mysql 6.0.4 de appserver ? tiene algo q ver?
  #15 (permalink)  
Antiguo 16/04/2012, 03:56
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: Procedimientos almacenados variable out

¿Revisaste los Warnings?
¿El user que utilizas tiene todos los privilegios?
MySQL 6.x me recuerda una versión fallida de MySQL que esxistió hace unos años. Fue luego reemplazada por la 5.1.x
Yo procuraría usar la MySQL Community Server 5.5.23
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #16 (permalink)  
Antiguo 16/04/2012, 17:40
 
Fecha de Ingreso: abril-2012
Ubicación: surquillo
Mensajes: 44
Antigüedad: 12 años
Puntos: 0
Respuesta: Procedimientos almacenados variable out

si man tiene razon parece q mysql ta mal ahora lo probe la funcion en la pc d mi instituto y si corrio
  #17 (permalink)  
Antiguo 16/04/2012, 17:53
 
Fecha de Ingreso: abril-2012
Ubicación: surquillo
Mensajes: 44
Antigüedad: 12 años
Puntos: 0
Respuesta: Procedimientos almacenados variable out

una consulta como genero para agregar un nuevo usuario y q tenga el codigo generado ? v como lo hago XD cxfa
call usu_nuevo('','losaltlv'.'123'); ?

Etiquetas: procedimientos, select, almacenar, variables
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 02:56.