Можно ли вызвать хранимую процедуру в cfloop и вывести динамические выходные параметры в Coldfusion?

Последний вопрос на сегодня, все еще использующий Coldfusion8 и MySQL.

У меня есть таблица с продуктами, каждый с ценами A, B и C. Мне нужно извлечь минимальное и максимальное значения для A, B, C для всех цен (A_min, A_max, B_min, B_max, C_min, C_max)

Я думал, что создам хранимую процедуру и перебираю A, B, C примерно так:

  <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>

Таким образом, идея состояла в том, чтобы выполнить это три раза для A, B и C и получить переменные A_min, A_max, B_min ... из цикла.

Но у меня есть проблемы с моими out-параметрами, которые внутри MySQL, я заявляю как:

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

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

Ошибка Coldfusion говорит:

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

Questions:
Должен ли я присвоить своим параметрам то же имя, что и внутри MySQL, или достаточно правильного порядка?
Что еще более важно, я могу установить выходные переменные динамически как это? Если нет, есть ли другие способы, кроме трехкратного вызова хранимой процедуры?

 Brian Hoover12 июн. 2012 г., 22:10
Вы получаете ту же ошибку, если вы удалите # what # из переменной? Возможно, вы не сможете иметь переменную CF внутри этого тега CF
 frequent12 июн. 2012 г., 22:12
миллигенри Та же ошибка. Я читаюthis и подумал, может быть, я мог бы использовать это внутри хранимой процедуры, тоже
 frequent12 июн. 2012 г., 22:15
Необходимо перепроверить, что происходит в MySQL.

Ответы на вопрос(3)

вы можете пойти в любую сторону. Но помимо этого проще просто вернуть набор результатов.

Error Executing Database Query

Тем не менее, ваш код работает нормально с примером процедуры ниже в CF8 / MySQL5. Основываясь на частичном сообщении об ошибке, я подозреваю, что настоящей проблемой является синтаксическая ошибка в вашей процедуре. Вы проверяли это непосредственно в своей базе данных?

<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 

буте dbvarname.

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

Дайте это попробовать.

ОБНОВЛЕНИЕ ~ Я только что проверил документы CF, приведенный выше совет не поможет вам

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

Изменено поведение атрибута dbvarname: теперь оно игнорируется для всех драйверов. ColdFusion использует JDBC 2.2 и не поддерживает именованные параметры.

 frequent12 июн. 2012 г., 22:28
позвольте мне дать MySQL Debugger еще один запуск. Должно быть, что-то пропустил.
 12 июн. 2012 г., 22:24
@ Ли, я исправил свой ответ за 10 секунд до того, как ты меня понял. :)
 12 июн. 2012 г., 22:34
@EvikJames - Да, я видел это .. простоafter Я нажимаю "Отправить" ;-) (Изменить: Я пытался удалить излишнюю коррекцию, прежде чем вы увидели, но я слишком медленно :)
Решение Вопроса

но часто сложно (зависит от заказа и т. Д.).

У меня есть 2 предложения для вас.

Сначала сделайте вывод набором данных. В вашей хранимой процедуре создайте временную таблицу (#myMinMax или любую другую) с минимумом и максимумом 2 столбцов - заполните таблицу вставкой, а затем выберите ее, возвращая в виде<cfstoredprocresult..>

Во-вторых, я бы, вероятно, создал хранимый процесс, который выполняет зацикливание и возвращает весь набор данных с & quot; типом & quot; столбец ... так что вы получите набор данных, имеющий тип (как в A) минимум (как в 10) и максимум (как в 100) ... одна строка для A, одна для B и одна для C. подключение к источнику данных может вернуть вам этот набор данных, избегая 3 (или более) вызовов БД.

 frequent13 июн. 2012 г., 00:32
Согласитесь на type = & quot; out & quot; переменные. Никогда не получалось заставить их работать!
 frequent16 июн. 2012 г., 13:01
сделал именно это. У меня осталась небольшая ошибка в «моем SQL», так что если вы хотите посмотреть:stackoverflow.com/questions/11062812/…
 frequent13 июн. 2012 г., 00:29
Хорошо. Хорошие советы. Итак, я зациклен на MySQL? Никогда этого не делал. Я предложу оба предложения. Пока спасибо!

Ваш ответ на вопрос