¿Puedo llamar a un procedimiento almacenado en un cfloop y generar parámetros de salida dinámicos en Coldfusion?

Última pregunta para esta noche, sigo usando Coldfusion8 y MySQL.

Tengo una tabla con productos, cada uno con precio A, B y C. Necesito recuperar los valores mínimo y máximo para A, B, C en todos los precios (A_min, A_max, B_min, B_max, C_min, C_max)

Pensé que crearía un procedimiento almacenado y recorrería A, B, C así:

  <cfloop list="A,B,C" index="what" delimiters=",">
    <cfstoredproc procedure="proc_search_select_minmax" datasource="dtb">
        <cfprocparam type="in" value="#what#" cfsqltype="cf_sql_varchar" maxlength="15">
        <cfprocparam type="in" value="#variables.xxx#" cfsqltype="cf_sql_varchar" maxlength="13">
        <cfprocparam type="in" value="#variables.yyy#" cfsqltype="cf_sql_varchar" maxlength="13">
        <cfprocparam type="in" value="#variables.zzz#" cfsqltype="cf_sql_text" maxlength="4">
        <cfprocparam type="out" cfsqltype="cf_sql_decimal" variable="#what#_min">
        <cfprocparam type="out" cfsqltype="cf_sql_decimal" variable="#what#_max">   
     </cfstoredproc>
  </cfloop>

Entonces, la idea era ejecutar esto tres veces para A, B y C y obtener las variables A_min, A_max, B_min... fuera del ciclo.

Pero tengo problemas con mis parámetros de salida, que dentro de MySQL, declaro como:

 CREATE ... PROCEDURE `proc_search_select_minmax`(..., OUT `outputMin` DECIMAL(12,2), OUT `outputMax` DECIMAL(12,2))

 .... 
 SET outputMin = min(what);
 SET outputMax = max(what);

error de fusión fría dice:

Error Executing Database Query
@
<cfprocparam type="out" cfsqltype="cf_sql_decimal" variable="#what#_min">
<cfprocparam type="out" cfsqltype="cf_sql_decimal" variable="#what#_max">

Preguntas:
¿Tengo que dar a mis parámetros de salida el mismo nombre que dentro de MySQL o es suficiente el orden correcto?
Más importante aún, ¿puedo establecer variables de salida dinámicamente de esta manera? Si no, ¿existen otras formas además de llamar al procedimiento almacenado tres veces por separado?

preguntado el 12 de junio de 12 a las 21:06

¿Obtiene el mismo error si elimina #qué# de la variable? Es posible que no pueda tener una variable CF dentro de esta etiqueta CF:

Mh. Mismo error. Yo leo este y pensé que tal vez también podría usar esto dentro de un proceso almacenado:

Necesito volver a verificar lo que está sucediendo en MySQL. -

3 Respuestas

Nunca me gustó la forma de retorno variable de hacer esto. Útil pero a menudo difícil (depende del pedido, etc.).

Tengo 2 sugerencias para ti.

Primero, convierta la salida en un conjunto de datos. En su procedimiento almacenado, cree una tabla temporal (#myMinMax o lo que sea) con 2 columnas como mínimo y máximo: complete la tabla con una inserción y luego selecciónela y devuélvala como un <cfstoredprocresult..>

En segundo lugar, probablemente crearía un proceso almacenado que realice el bucle y devuelva un conjunto de datos completo con una columna de "tipo" ... por lo que terminaría con un conjunto de datos que tiene un tipo (como en A) mínimo (como en 10) y máximo ( como en 100) ... una fila para A, una para B y otra para C. Una sola conexión a la fuente de datos podría devolverle este conjunto de datos, evitando 3 (o más) llamadas a la base de datos.

Respondido el 12 de junio de 12 a las 23:06

está bien. Buenos consejos. Entonces, ¿estoy haciendo un bucle dentro de MySQL? Nunca hice eso. Haré ambas sugerencias. ¡Gracias hasta ahora! - frecuente

Acuerde las variables type="out". ¡Nunca logré que estos funcionaran! - frecuente

hizo exactamente eso. Me queda un pequeño error en "mi SQL", así que si quieres echar un vistazo: stackoverflow.com/questions/11062812/… - frecuente

En SQL Server, configuramos nuestras variables con el signo @ en el atributo dbvarname.

<cfprocparam cfsqltype="cf_sql_integer" 
    value="#LOCAL.User_ID#" 
    dbvarname="@User_ID">

Pruébalo.

ACTUALIZAR ~ Acabo de revisar los documentos de CF, los consejos anteriores no lo ayudarán

http://livedocs.adobe.com/coldfusion/8/htmldocs/help.html?content=Tags_p-q_14.html

Se modificó el comportamiento del atributo dbvarname: ahora se ignora para todos los controladores. ColdFusion usa JDBC 2.2 y no admite parámetros con nombre.

Respondido el 12 de junio de 12 a las 21:06

@Leigh, corregí mi respuesta 10 segundos antes de que me entendieras. :) - Evik James

déjame ejecutar MySQL Debugger otra vez. Debe haberse perdido algo. - frecuente

@EvikJames - Sí, lo vi... solo después de Presioné enviar ;-) (Editar: traté de eliminar la corrección entonces redundante antes de que la vieras, pero soy demasiado lento :) - Leigh

Estoy de acuerdo con Mark sobre los parámetros de salida. Para un solo valor, puede ir en cualquier dirección. Pero más allá de eso, es más simple simplemente devolver un conjunto de resultados.

Error al ejecutar la consulta de la base de datos

Dicho esto, su código funciona bien con el siguiente procedimiento de ejemplo en CF8/MySQL5. Según el mensaje de error parcial, sospecho que el verdadero problema es un error de sintaxis en su procedimiento. ¿Lo probaste directamente en tu base de datos?

<cfloop>
    <cfstoredproc ...>
        ....
    </cfstoredproc>
</cfloop>
<cfoutput>
    #a_min# #a_max# <br />
    #b_min# #b_max# <br />
    #c_min# #c_max# <br />
</cfoutput>


CREATE PROCEDURE `test`.`proc_search_select_minmax` (
     what varchar(50)
     , xxx varchar(50)
     , yyy varchar(50)
     , zzz varchar(50)
     , OUT outputMin decimal(12,2)
     , OUT outputMax decimal(12,2)
 )
BEGIN

      SET outputMin = 1;
      SET outputMax = 20;
END 

Respondido el 14 de junio de 12 a las 08:06

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.