Запрос работает в Workbench, но возвращает ошибку в ColdFusion - PullRequest
0 голосов
/ 24 июня 2011

Я создал хранимую процедуру для доступа к данным учета из 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>

1 Ответ

0 голосов
/ 24 июня 2011

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

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;

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

...