Resultados 1 al 10 de 10

Tema: Sentencia PREPARE y EXECUTE en MySql

  1. #1
      Super Moderador
    Avatar de Josber

    Registrado
    febrero de 2015
    Ubicación
    Alicante
    Mensajes
    796
    Última visita
    Ayer a las 12:00

    Agradecimientos
     
    Recibidos
    440
    Enviados
    362

    Citaciones y menciones
     
    Mentioned
    77 Post(s)
    Tagged
    0 Thread(s)
    Quoted
    13 Post(s)
    Poder de Reputación
    37
    Activista del Foro / Point Value: 0 Agradecimientos / Point Value: 0

    Predeterminado Sentencia PREPARE y EXECUTE en MySql

    ¿Alguien ha utilizado alguna vez las sentencias PREPARE, EXECUTE y EXECUTE INMEDIATE en PWC?

    Estoy intentando usarlas y me da error de sentencia mal construida, (error 37000)

    Un saludo y gracias.-

    0 Not allowed!

  2. #2
      Administrador
    Avatar de Kuk

    Registrado
    enero de 2015
    Ubicación
    Madrid
    Edad
    39
    Mensajes
    2,286
    Última visita
    Ayer a las 18:48

    Agradecimientos
     
    Recibidos
    1,036
    Enviados
    888

    Citaciones y menciones
     
    Mentioned
    102 Post(s)
    Tagged
    0 Thread(s)
    Quoted
    31 Post(s)
    Poder de Reputación
    10

    Predeterminado

    @Josber, he echado un vistazo, y la verdad es que no me he enterado muy bien de qué va exactamente. En teoría, el PREPARE crea una especie de instancia de una query y por ello reduce el costo en caso de múltiples llamadas con la misma query (pero diferentes valores).

    Vamos al grano. He leído que estas posibilidades pertenecen a la versión MySQL 5.7 que según Wikipedia es la última versión estable (22 de octubre de 2015; hace 4 meses). Lo cual quiere decir que para programar con SQL embebido sería necesario hacer un upgrade del precompilador/preprocesador de SQL.

    No sé para qué lo necesitas, pero a lo mejor podrías utilizar cursores?

    0 Not allowed!
    ¿Te han ayudado? NO TE OLVIDES de darle al botón
    ¿Quieres dirigirte a alguien en tu post? Notifícale con una mención, tienes 2 opciones:
    1. Haciendo clic en el icono al lado de su nick
    2. Haciendo clic en el botón en el editor y escribiendo su nick.

  3. #3
      Super Moderador
    Avatar de Josber

    Registrado
    febrero de 2015
    Ubicación
    Alicante
    Mensajes
    796
    Última visita
    Ayer a las 12:00

    Agradecimientos
     
    Recibidos
    440
    Enviados
    362

    Citaciones y menciones
     
    Mentioned
    77 Post(s)
    Tagged
    0 Thread(s)
    Quoted
    13 Post(s)
    Poder de Reputación
    37
    Activista del Foro / Point Value: 0 Agradecimientos / Point Value: 0

    Predeterminado

    A ver Kuk, como dijo Jack el destripador, "vamos por partes" ...

    - Utilizo la última versión de MySql, por lo que eso no es problema.

    - Necesito la sentencia PREPARE por lo que tú comentas, es para una misma consulta repetitiva con distintos valores, pero además ha de ser esta sentencia porque la tengo que montar con un STRING, por lo que no me vale una consulta estandar.

    - Por lo menos yo, la sentencia DECLARE, la utilizo siempre junto con la sentencia CURSOR, he intentado usarla como un PREPARE, pero no me ha funcionado y, como supongo que sabrás, un CURSOR va asociado a una lectura secuencial con FETCH, por lo que tampoco me vale. Puedo hacer el bucle con el FETCH y a la primera lectura salirme del bucle, pero aparte de ser más lento, no dá el resultado esperado.

    Sigo investigando.

    Gracias y un saludo.-

    0 Not allowed!

  4. #4
      Administrador
    Avatar de Kuk

    Registrado
    enero de 2015
    Ubicación
    Madrid
    Edad
    39
    Mensajes
    2,286
    Última visita
    Ayer a las 18:48

    Agradecimientos
     
    Recibidos
    1,036
    Enviados
    888

    Citaciones y menciones
     
    Mentioned
    102 Post(s)
    Tagged
    0 Thread(s)
    Quoted
    31 Post(s)
    Poder de Reputación
    10

    Predeterminado

    Cita Iniciado por Josber Ver Mensaje
    Utilizo la última versión de MySql, por lo que eso no es problema.
    El problema es que el precompilador SQL de PowerCOBOL no sabe interpretar estas sentencias, es a lo que me refería.

    Además, con el CURSOR justamente se hace lo que quieres. Si necesitas hacer la misma consulta varias veces, por ejemplo extraer varios clientes, se hace un cursor y en el WHERE se le pone la condición para que extraiga los que tu necesitas y los vas obteniendo uno a uno en el FETCH.

    0 Not allowed!
    ¿Te han ayudado? NO TE OLVIDES de darle al botón
    ¿Quieres dirigirte a alguien en tu post? Notifícale con una mención, tienes 2 opciones:
    1. Haciendo clic en el icono al lado de su nick
    2. Haciendo clic en el botón en el editor y escribiendo su nick.

  5. #5
      Super Moderador
    Avatar de Josber

    Registrado
    febrero de 2015
    Ubicación
    Alicante
    Mensajes
    796
    Última visita
    Ayer a las 12:00

    Agradecimientos
     
    Recibidos
    440
    Enviados
    362

    Citaciones y menciones
     
    Mentioned
    77 Post(s)
    Tagged
    0 Thread(s)
    Quoted
    13 Post(s)
    Poder de Reputación
    37
    Activista del Foro / Point Value: 0 Agradecimientos / Point Value: 0

    Predeterminado

    Cita Iniciado por Kuk Ver Mensaje
    Además, con el CURSOR justamente se hace lo que quieres. Si necesitas hacer la misma consulta varias veces, por ejemplo extraer varios clientes, se hace un cursor y en el WHERE se le pone la condición para que extraiga los que tu necesitas y los vas obteniendo uno a uno en el FETCH.
    No lo necesito así kuk, de una consulta con un WHERE, que es lo que hago. si son varios registros, me da lo mismo que sean 2 que 5000, sólo necesito el primero, por eso no lo quería hacer con un FETCH.

    Un saludo.-

    0 Not allowed!

  6. #6
      Administrador
    Avatar de Kuk

    Registrado
    enero de 2015
    Ubicación
    Madrid
    Edad
    39
    Mensajes
    2,286
    Última visita
    Ayer a las 18:48

    Agradecimientos
     
    Recibidos
    1,036
    Enviados
    888

    Citaciones y menciones
     
    Mentioned
    102 Post(s)
    Tagged
    0 Thread(s)
    Quoted
    31 Post(s)
    Poder de Reputación
    10

    Predeterminado

    Cita Iniciado por Josber Ver Mensaje
    sólo necesito el primero
    No entiendo a qué te refieres... Cual es la diferencia entre ejecutar la misma query varias veces con distinto identificador (que es lo que pretendes con PREPARE) y hacer un cursor?...

    0 Not allowed!
    ¿Te han ayudado? NO TE OLVIDES de darle al botón
    ¿Quieres dirigirte a alguien en tu post? Notifícale con una mención, tienes 2 opciones:
    1. Haciendo clic en el icono al lado de su nick
    2. Haciendo clic en el botón en el editor y escribiendo su nick.

  7. #7
      Super Moderador
    Avatar de Josber

    Registrado
    febrero de 2015
    Ubicación
    Alicante
    Mensajes
    796
    Última visita
    Ayer a las 12:00

    Agradecimientos
     
    Recibidos
    440
    Enviados
    362

    Citaciones y menciones
     
    Mentioned
    77 Post(s)
    Tagged
    0 Thread(s)
    Quoted
    13 Post(s)
    Poder de Reputación
    37
    Activista del Foro / Point Value: 0 Agradecimientos / Point Value: 0

    Predeterminado

    Cuando declaras un CURSOR, es como hacer un START en un fichero COBOL y la sentencia FETCH es como un READ fichero NEXT RECORD ..., es decir una lectura secuencial, cargas en memoria en una tabla virtual toda la consulta

    COBOL Código:
    1.       MOVE POW-NUMERIC OF CAMPO1 TO WB1.
    2.       MOVE POW-NUMERIC OF CAMPO2 TO WB2.
    3.       EXEC SQL
    4.               DECLARE cursor_CON CURSOR FOR
    5.                            SELECT * FROM CLIENTES
    6.                            WHERE CLICOD BETWEEN :WB1 AND :WB2
    7.                            ORDER BY CLINOM ASC
    8.       END-EXEC.
    9.  
    10.        EXEC SQL
    11.                OPEN cursor_CON
    12.        END-EXEC.
    13.  
    14.        PERFORM CARGAR THRU FIN-CARGAR UNTIL SQLSTATUS = "02000".
    15.  
    16.        EXEC SQL
    17.                CLOSE cursor_CON
    18.        END-EXEC.
    19.  
    20.        EXIT PROGRAM.
    21.  
    22. CARGAR.
    23.        EXEC SQL
    24.                FETCH cursor_CON
    25.                          INTO :CLICOD,
    26.                                  :CLINOM,
    27.                                        .
    28.                                        .
    29.                                        .
    30.        END-EXEC.

    Cuado usas la sentencia PREPARE, es como una lectura normal de un registro en COBOL, (READ fichero KEY IS ... INVALID KEY ...), si la consulta no varía, te vale con un simple SELECT, pero si varía, tienes que montar la instrucción de busqueda con un STRING, y utilizar un PREPARE, poque no hay otra manera de hacerlo, no puedes hacer un SELCT + el STRING de búsqueda, que es lo que yo necesito.

    COBOL Código:
    1.       MOVE POW-NUMERIC OF CAMPO1 TO WB1.
    2.       STRING "SELECT * FROM CLIENTES WHERE CLICOD = "
    3.                  WB1
    4.                 " LIMIT 1 INTO :CLICOD, :CLINOM , etc ..." DELIMITED BY SIZE INTO SQLCON
    5.       END-STRING.
    6.  
    7.       EXEC SQL
    8.               PREPARE consulta FROM :SQLCON
    9.       END-EXEC.
    10.  
    11.       EXEC SQL
    12.                EXECUTE consulta
    13.       END-EXEC
    14.  
    15.       EXEC SQL
    16.               COMMIT
    17.       END-EXEC.

    Pero me da la sensación que la sentencia PREPARE y EXECUTE, el compilador no las acepta y es una ****da, porque se utilizan bastante en SQL.

    Un saludo

    0 Not allowed!

  8. #8
      Administrador
    Avatar de Kuk

    Registrado
    enero de 2015
    Ubicación
    Madrid
    Edad
    39
    Mensajes
    2,286
    Última visita
    Ayer a las 18:48

    Agradecimientos
     
    Recibidos
    1,036
    Enviados
    888

    Citaciones y menciones
     
    Mentioned
    102 Post(s)
    Tagged
    0 Thread(s)
    Quoted
    31 Post(s)
    Poder de Reputación
    10

    Predeterminado

    @Josber, gracias por el ejemplo, no conocía el PREPARE y el EXECUTE.

    No es que te esté vacilando pero... Sigo sin entenderlo. Según tu código lo que varía es WB1, es eso? Es decir, necesitas ejecutar varias veces la misma consulta pero con WB1 distintos. ¿Es eso?

    En cuanto al CURSOR: no es un start, es un SELECT + ORDER BY por decirlo de alguna forma. el FETCH no es una lectura secuencial sino lectura uno a uno de lo que el SELECT ha traído. Todo depende efectivamente del WHERE. Puedes hacer:

    SQL Código:
    1. SELECT * FROM CLIENTES
    2.  WHERE CLICOD BETWEEN :WB1 AND :WB2
    3.  
    4. -- o también
    5. SELECT * FROM CLIENTES
    6.  WHERE CLICOD BETWEEN IN (...)
    7.  
    8. -- o también
    9. SELECT * FROM CLIENTES
    10.  WHERE CLICOD BETWEEN = ... OR ...

    Si lo que varía es el SELECT * pues tampoco veo mayor problema...

    Con todo esto quiero decir que no me estoy enterando en qué es imprescindible el PREPARE. Vale que se puede montar la query en dinámico pero normalmente se puede evitar.

    0 Not allowed!
    ¿Te han ayudado? NO TE OLVIDES de darle al botón
    ¿Quieres dirigirte a alguien en tu post? Notifícale con una mención, tienes 2 opciones:
    1. Haciendo clic en el icono al lado de su nick
    2. Haciendo clic en el botón en el editor y escribiendo su nick.

  9. #9
      Super Moderador
    Avatar de Josber

    Registrado
    febrero de 2015
    Ubicación
    Alicante
    Mensajes
    796
    Última visita
    Ayer a las 12:00

    Agradecimientos
     
    Recibidos
    440
    Enviados
    362

    Citaciones y menciones
     
    Mentioned
    77 Post(s)
    Tagged
    0 Thread(s)
    Quoted
    13 Post(s)
    Poder de Reputación
    37
    Activista del Foro / Point Value: 0 Agradecimientos / Point Value: 0

    Predeterminado

    No te preocupes, no pienso mal, el ejemplo que he puesto es una pequeña parte, necesito el PREPARE, para consulta dinámica como tu dices, porque dependiendo de otras variables, el STRING puede llevar más campos de consulta, por ejemplo zonas, importes y así hasta 18 campos que pueden estar o no estar.

    Un saludo.-

    0 Not allowed!

  10. #10
      Acabo de llegar...
    D

    Registrado
    junio de 2020
    Ubicación
    El Vendrell
    Edad
    70
    Mensajes
    12
    Última visita
    20.07.2023

    Agradecimientos
     
    Recibidos
    3
    Enviados
    16

    Citaciones y menciones
     
    Mentioned
    8 Post(s)
    Tagged
    0 Thread(s)
    Quoted
    0 Post(s)
    Poder de Reputación
    0

    Predeterminado

    Hola Josber

    He leído con interés este post que has publicado

    Cita Iniciado por Josber Ver Mensaje
    Cuando declaras un CURSOR, es como hacer un START en un fichero COBOL y la sentencia FETCH es como un READ fichero NEXT RECORD ..., es decir una lectura secuencial, cargas en memoria en una tabla virtual toda la consulta

    COBOL Código:
    1.       MOVE POW-NUMERIC OF CAMPO1 TO WB1.
    2.       MOVE POW-NUMERIC OF CAMPO2 TO WB2.
    3.       EXEC SQL
    4.               DECLARE cursor_CON CURSOR FOR
    5.                            SELECT * FROM CLIENTES
    6.                            WHERE CLICOD BETWEEN :WB1 AND :WB2
    7.                            ORDER BY CLINOM ASC
    8.       END-EXEC.
    9.  
    10.        EXEC SQL
    11.                OPEN cursor_CON
    12.        END-EXEC.
    13.  
    14.        PERFORM CARGAR THRU FIN-CARGAR UNTIL SQLSTATUS = "02000".
    15.  
    16.        EXEC SQL
    17.                CLOSE cursor_CON
    18.        END-EXEC.
    19.  
    20.        EXIT PROGRAM.
    21.  
    22. CARGAR.
    23.        EXEC SQL
    24.                FETCH cursor_CON
    25.                          INTO :CLICOD,
    26.                                  :CLINOM,
    27.                                        .
    28.                                        .
    29.                                        .
    30.        END-EXEC.

    Cuado usas la sentencia PREPARE, es como una lectura normal de un registro en COBOL, (READ fichero KEY IS ... INVALID KEY ...), si la consulta no varía, te vale con un simple SELECT, pero si varía, tienes que montar la instrucción de busqueda con un STRING, y utilizar un PREPARE, poque no hay otra manera de hacerlo, no puedes hacer un SELCT + el STRING de búsqueda, que es lo que yo necesito.

    COBOL Código:
    1.       MOVE POW-NUMERIC OF CAMPO1 TO WB1.
    2.       STRING "SELECT * FROM CLIENTES WHERE CLICOD = "
    3.                  WB1
    4.                 " LIMIT 1 INTO :CLICOD, :CLINOM , etc ..." DELIMITED BY SIZE INTO SQLCON
    5.       END-STRING.
    6.  
    7.       EXEC SQL
    8.               PREPARE consulta FROM :SQLCON
    9.       END-EXEC.
    10.  
    11.       EXEC SQL
    12.                EXECUTE consulta
    13.       END-EXEC
    14.  
    15.       EXEC SQL
    16.               COMMIT
    17.       END-EXEC.

    Pero me da la sensación que la sentencia PREPARE y EXECUTE, el compilador no las acepta y es una ****da, porque se utilizan bastante en SQL.

    Un saludo

    El cual aporta el trato de un tema muy interesante.
    En mi caso he pensado en utilizar el PREPARE para construir el CURSOR, sigo investigando, pero me preguntaba si después de varios años, uds. han logrado algo más del información


    Saludos

    0 Not allowed!

Información de Tema

Usuarios Viendo este Tema

Actualmente hay 1 usuarios viendo este tema. (0 miembros y 1 visitantes)

Temas Similares

  1. [Herramienta] Me inicio en MySql
    Por Hrmcobol en el foro MySQL
    Respuestas: 5
    Último Mensaje: 11.06.2021, 15:12
  2. [Sintaxis] Error de property en "Execute"
    Por Hector en el foro PowerCOBOL (ActiveX, v4 - v11)
    Respuestas: 4
    Último Mensaje: 09.05.2018, 16:47
  3. Sentencia CLASS en SPECIAL-NAMES
    Por Lascu en el foro PowerCOBOL (ActiveX, v4 - v11)
    Respuestas: 1
    Último Mensaje: 29.01.2016, 09:39
  4. [Sintaxis] Funciones de encriptación MySql
    Por Josber en el foro MySQL
    Respuestas: 8
    Último Mensaje: 12.07.2015, 02:06
  5. [Noticia] WampServer - MySQL ilimitado en PC
    Por Kuk en el foro MySQL
    Respuestas: 2
    Último Mensaje: 23.02.2015, 15:29

Etiquetas para este Tema

Marcadores

Marcadores

Permisos de Publicación

  • No puedes crear nuevos temas
  • No puedes responder temas
  • No puedes subir archivos adjuntos
  • No puedes editar tus mensajes
  •