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

mi primer stored procedure

Estas en el tema de mi primer stored procedure en el foro de Bases de Datos General en Foros del Web. Hola a todos. Bueno, el titulo lo dice todo. Me estoy haciendo unos lios de la ostia para ser algo a primera vista tan "sencillico"... ...
  #1 (permalink)  
Antiguo 05/11/2011, 13:51
 
Fecha de Ingreso: junio-2010
Mensajes: 373
Antigüedad: 14 años, 5 meses
Puntos: 11
mi primer stored procedure

Hola a todos.

Bueno, el titulo lo dice todo. Me estoy haciendo unos lios de la ostia para ser algo a primera vista tan "sencillico"...

En una primera prueba, tan solo quiero hacer algo asi como ver un dato de la BD y hacer un condicional; si este dato es mayor de 10 (por ejemplo), hacer una consulta SELECT, si no, mandar un mensaje indicando que el valor no supera el nº 10.

He hecho lo siguiente:

Código PHP:
Ver original
  1. $ID=1;
  2.  
  3. $txt_consulta = "DELIMITER ||
  4.             CREATE PROCEDURE condicion ()
  5.             BEGIN
  6.             SET numero = SELECT valor FROM principal WHERE ID = '$ID';
  7.             IF numero >10 THEN
  8.                 SELECT valor2 FROM estadisticas WHERE ID = '$ID'
  9.             ELSE mensaje = 'El valor minimo para acceder es de 11.';
  10.             END IF;
  11.             END ||
  12.             DELIMITER ;
  13.             CALL condicion()";
  14.  
  15. $consulta = mysql_query($txt_consulta,$conexion);
  16. $row = mysql_fetch_array($consulta);

Pero obtengo el tipico error de que lo estoy haciendo mal (seguramente, mal de cojones).

Bueno, os pido que me echeis una manica.... Seguramente hay fallos por un tubo pq aun no controlo bien estas cosas. Hablando claro, aun no se hacerlos, pero es que google no me ha dado buenos tutoriales y la mitad de lo que encuentro esta basado en clases y objetos, y paso de momento de eso, asi que..... eso..

Weno, 1 saludo y muchas gracias.
  #2 (permalink)  
Antiguo 05/11/2011, 14:51
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 17 años
Puntos: 2658
Respuesta: mi primer stored procedure

Por empezar, un stored procedure es una rutina programada en PL/SQL según la versión implementada en el DBMS que uses (en este caso MySQL) y que reside en el servidor. No es dependiente de ningún lenguaje de programación, y no puede contener variables o sentencias de otro lenguaje.
Un SP se carga una sola vez y no se envía nunca más, a menos que se desee modificar su cuerpo, cosa que algunas veces necesitas hacer.

Como sólo admite código SQL, no puedes incluir ese '$ID', porque eso es una cadena de texto constante en el SP. los parámetros que puedan necesitarse se deben incluir cuando se lo llama, y sólo a través de las variables declaradas en el prototipo.
Código MySQL:
Ver original
  1. DELIMITER $$
  2.  
  3. CREATE PROCEDURE condicion (IN ID INT)
  4.    BEGIN
  5.             DECLARE numero INT;
  6.             SET numero = (SELECT valor FROM principal WHERE ID = ID);
  7.             IF numero >10 THEN
  8.                 SELECT valor2 FROM estadisticas WHERE ID = ID
  9.             ELSE
  10.                 SELECT 'El valor minimo para acceder es de 11.' valor2;
  11.             END IF;
  12.    END$$
  13. DELIMITER ;
Para pedir el ID 1, sería:
Código MySQL:
Ver original
  1. CALL condicion(1);
Detalle: No uses "||" como delimitadores, puede traerte problemas en algunos casos porque esa es la forma del OR binario en SQL. Usa mejor lo que el manual dice: "$$"

Nota: DELIMITER sólo se usa si vas a cargar el Sp en la consola de MySQL, pero no si usas alguna aplicación, como phpMyadmin, Navicat o cosas asi. SI vas a crear programáticamente el SP, simplemente envíalo así:

Código MySQL:
Ver original
  1. CREATE PROCEDURE condicion (IN ID INT)
  2.    BEGIN
  3.             DECLARE numero INT;
  4.             SET numero = (SELECT valor FROM principal WHERE ID = ID);
  5.             IF numero >10 THEN
  6.                 SELECT valor2 FROM estadisticas WHERE ID = ID
  7.             ELSE
  8.                 SELECT 'El valor minimo para acceder es de 11.' valor2;
  9.             END IF;
  10.    END;

Tip final: El PL/SQL usado por cada DBMS no es compatible con el de otro DBMS porque no existe un estadar. Por eso no puedes usar el mismo código en SQL Server, Oracle, MySQL, DB2 o Postgre. Cada uno tiene su propia de escribir los 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)
  #3 (permalink)  
Antiguo 05/11/2011, 18:34
 
Fecha de Ingreso: junio-2010
Mensajes: 373
Antigüedad: 14 años, 5 meses
Puntos: 11
Respuesta: mi primer stored procedure

Hola gnzsoloyo, muchisimas gracias por la ayuda

Lo estoy intentando pero debo estar haciendo algo mal...

permiteme que cambie los nombres de las variables por los reales. Puse en un principio otros por hacerlo un poco mas generico.

Te comento: esto es lo que tengo introducido tal cual:

Código PHP:
Ver original
  1. $txt_consulta = "CREATE PROCEDURE condicion (IN ID INT)
  2.                     BEGIN
  3.                     DECLARE turnos INT;
  4.                     SET turnos = (SELECT turnos FROM principal WHERE ID = ID);
  5.                     IF turnos >9 THEN
  6.                         SELECT oro FROM recursos WHERE ID = ID;
  7.                     ELSE
  8.                         SELECT 'El valor minimo para acceder es de 10.';
  9.                     END IF;
  10.                 END;";
  11. $consulta = mysql_query($txt_consulta,$conexion);
  12. $row = mysql_fetch_array($consulta);

Disculpa que escriba como codigo PHP pero es que estoy tan verde en este asunto que ni tan siquiera estoy completamente seguro de que haya que hacerlo asi, es decir....supongo que todo se almacena como una cadena de texto en una variable ($txt_consulta en mi caso) y luego se hace la consulta....como si fuese una consulta normal...

Ahora, como llamo al SP?? se hace al final del todo? me refiero a, justo despues del ultimo end? te lo comento porque: 1º, no lo se, y 2º, tengo que montarmelo de alguna manera para poder poner la variable $ID. Si no , voy listo...

De todas formas, este ultimo asunto (de momento) esta de mas, porque parece ser que el error lo tengo antes de todo esto:

Resulta que he metido el SP en phpMyAdmin y me tira el siguiente error:

Código MySQL:
Ver original
  1. Error
  2.  
  3. consulta SQL:
  4.  
  5. CREATE PROCEDURE condicion( IN ID INT ) BEGIN DECLARE turnos INT;
  6.  
  7. MySQL ha dicho: Documentación
  8. #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 3

Notas adicionales:

1) me he tomado la "libertad" de borrar la palabra "valor2" que escribes al final de la linea de codigo nº 10 (o linea nº 8 en el 2º de los codigos)porque no me cuadraba en absoluto...no se si es que estoy mas verde que una lechuga o es que has tenido un pequeño despiste ahi. Disculpa si es lo 1º

2) Me he fijado que en tu codigo, al hacer los SELECT, no escribes: WHERE ID = 'ID', sino que lo haces sin comillas simples.....supongo que es correcto y no lo he cambiado.

Una vez mas, gracias por la paciencia y demas, de veras, y disculpa la enorme torpeza.

Saludos!
  #4 (permalink)  
Antiguo 06/11/2011, 05:55
 
Fecha de Ingreso: junio-2010
Mensajes: 373
Antigüedad: 14 años, 5 meses
Puntos: 11
Respuesta: mi primer stored procedure

Pues es que esto no lo pillo...

Si introduzco en phpMyAdmin:
Código MySQL:
Ver original
  1. CALL condicion(49);
reconoce el SP pero no muestra nada. No entiendo como puede reconocer algo que tengo escrito en un .php desde phpMyAdmin....no lo entiendo.

Por otro lado, abro la consola de MySQL, introduzco de nuevo lo mismo y ahora si que muestra el mensaje: El valor minimo para acceder es de 10. (cosa que ademas no deberia mostrar, ya que en la BD el dato es mayor de 10)....

es que no lo pillo...
  #5 (permalink)  
Antiguo 06/11/2011, 18:26
 
Fecha de Ingreso: junio-2010
Mensajes: 373
Antigüedad: 14 años, 5 meses
Puntos: 11
Respuesta: mi primer stored procedure

Solucionado. Muchas gracias de todas formas.

1 saludo.

Etiquetas: bd, mysql, primer, procedure, stored
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 14:32.