Запрос работает в Workbench, но возвращает ошибку в ColdFusion

Я создал хранимую процедуру для доступа к учетным данным из FreeRADIUS, которая была протестирована в MySQL Workbench и работает нормально, но при запуске как cfquery/cfstoredproc я получаю сообщение об ошибке «Неверные аргументы для EXECUTE».

Я проверил, что драйвер настроен для MySQL 4/5 (база данных — MySQL 5), и попытался скопировать и вставить вызов из MySQL Workbench и запустить его без использования cfqueryparam, как показано ниже, но он по-прежнему возвращает ту же ошибку.

Хранимая процедура была создана с

DELIMITER $$
CREATE PROCEDURE radius.GetUserDataUsageForMonth(IN StartDate DATE, IN EndDate DATE, IN UserName     
VARCHAR(100))
BEGIN

SET @records = (SELECT COUNT(UserName) FROM `radius`.`radacct` WHERE userName = @UserName AND AcctStartTime BETWEEN @StartDate AND @EndDate) - 1;

SET @SqlQuery = 'SELECT SUM(AcctOutputOctets) AS BytesIN, SUM(AcctInputOctets) AS BytesOUT FROM
        (SELECT * FROM `radius`.`radacct` WHERE userName = @UserName AND AcctStartTime BETWEEN @StartDate AND @EndDate LIMIT ? 

        UNION ALL

        SELECT * FROM `radius`.`radacct` WHERE userName = @UserName AND AcctStartTime < @StartDate ORDER BY AcctStartTime DESC LIMIT 1) AS Totals;';

PREPARE stmt FROM @SqlQuery;
EXECUTE stmt USING @records;
DEALLOCATE PREPARE stmt;
END $$
DELIMITER ;

Чтобы вызвать это, я использую:

<cfquery name="qRadAccount_currentData" datasource="#application.datasource_radius#">
    CALL radius.GetUserDataUsageForMonth('2011-06-01','2011-07-01','ryan.french');
</cfquery>

я тоже пробовал

<cfstoredproc procedure="radius.GetUserDataUsageForMonth" datasource="#application.datasource_radius#" result="qRadAccount_currentData">
    <cfprocparam cfsqltype="cf_sql_date" value="2011-06-01">
    <cfprocparam cfsqltype="cf_sql_date" value="2011-07-01">
    <cfprocparam cfsqltype="cf_sql_varchar" value="ryan.french">
</cfstoredproc>

person Ryan French    schedule 23.06.2011    source источник
comment
Вы уверены, что ваше подключение к данным указывает на правильную схему БД?   -  person Limey    schedule 24.06.2011
comment
У меня работает с CF9/mySQL5.1.42. Но все ли переменные учтены в вашем операторе EXECUTE stmt USING ...? Это одна из причин ошибки Incorrect arguments to EXECUTE. rpbouman.blogspot.com/2005/11/   -  person Leigh    schedule 24.06.2011
comment
@Leigh Да, я почти уверен, что они есть. Вызов подпрограммы из MySQL Workbench работает нормально. Только когда я перемещаю запрос в свою установку CF9, я получаю сообщение об ошибке.   -  person Ryan French    schedule 24.06.2011
comment
@Limey Да, источник данных должен быть в порядке, поскольку мы используем его в других, более простых запросах.   -  person Ryan French    schedule 24.06.2011
comment
@Ryan - Просто для улыбки, вы все еще получаете сообщение об ошибке, если закомментируете часть динамического sql и просто запустите базовую оболочку proc? т.е. CREATE PROCEDURE radius.GetUserDataUsageForMonth(IN StartDate DATE, IN EndDate DATE, IN UserName VARCHAR(100)) BEGIN END   -  person Leigh    schedule 24.06.2011
comment
Если ошибка ушла, значит что-то в процедуре sql. Добавляйте утверждения по одному. Посмотрите, сможете ли вы точно определить, какой из них вызывает ошибку. Иначе проблема в другом.   -  person Leigh    schedule 24.06.2011
comment
@Leigh Спасибо, удаление динамического sql остановило ошибку, однако мне все еще кажется странным, что он работает в workbench, а не в cfml. На данный момент я вынул запрос из хранимой процедуры и просто запускаю его в cfquery сам по себе, и он отлично работает.   -  person Ryan French    schedule 24.06.2011
comment
@Ryan - Возможно, проблема с драйвером ..? Но вы пробовали добавлять утверждения по одному. Посмотрите, сможете ли вы определить причинно-следственную связь. (Может не относиться к вам, но я также видел эту проблему bugs.mysql.com/bug .php?id=33851)   -  person Leigh    schedule 24.06.2011


Ответы (1)


Проблема возникла в строке

SET @records = (SELECT COUNT(UserName) FROM `radius`.`radacct` WHERE userName = @UserName AND AcctStartTime BETWEEN @StartDate AND @EndDate) - 1;

При запуске в виде запроса это вернет правильное значение, однако, когда значения передаются в виде хранимой процедуры из ColdFusion, результат будет -1 (строки из запроса не найдены).

В основном я работаю с MS SQL, но считаю, что в MySQL символ @ определяет локальную или сеансовую переменную. В результате при вызове из ColdFusion переменная не существовала, что приводило к ошибке.

Я заменил строку выше на

SET @records = (SELECT COUNT(UserName) FROM `radius`.`radacct` WHERE userName = UserName AND AcctStartTime BETWEEN StartDate AND EndDate) - 1;

и вызов хранимой процедуры вернул правильный результат.

person Ryan French    schedule 24.06.2011
comment
О, вы правы в том, что @ для переменных сеанса (я тоже больше человек ms sql) stackoverflow.com/questions/1009954/ Но вы уверены, что WHERE userName = UserName действительно работает? Я бы подумал, что имя переменной и столбца должно быть другим... - person Leigh; 24.06.2011
comment
Я проверил это по результатам выполнения запроса вне хранимой процедуры, и он работает нормально. - person Ryan French; 24.06.2011