mySql Query работает в браузере запросов, но не работает, когда я запускаю CFquery

Сначала я думал, что столкнулся с проблемой cfqueryparam и mysql. Однако, когда я меняю, заменяя их статическими значениями, я получаю ту же ошибку. Это ставит меня в тупик, я слишком привык к Microsoft SQL Server, я думаю. Любая помощь будет принята с благодарностью.

Вот запрос, он отлично работает в браузере запросов mySql, но не работает, когда я запускаю в cfquery:

LOCK TABLE categories WRITE;

SELECT @myRight := rgt FROM categories WHERE catid = <cfqueryparam cfsqltype="cf_sql_integer" value="#parentCategoryId#">;

UPDATE categories SET rgt = rgt + 2 WHERE rgt > @myRight;
UPDATE categories SET lft = lft + 2 WHERE lft > @myRight;

INSERT INTO categories(categoryName, lft, rgt) VALUES(<cfqueryparam cfsqltype="cf_sql_varchar" value="#newCatName#">, @myRight, @myRight + 2);

UNLOCK TABLES;

Я получаю следующую ошибку:

У вас есть ошибка в синтаксисе SQL; проверьте руководство, соответствующее версии вашего сервера MySQL, на предмет правильного синтаксиса для использования рядом с 'SELECT @myRight := rgt FROM Categories WHERE catid = 5; ОБНОВЛЕНИЕ категории SE' в строке 2

VENDORERRORCODE: 1064 Состояние SQL: 42000


person mc.    schedule 31.12.2009    source источник
comment
Возможно, проблема с драйвером базы данных?   -  person ale    schedule 31.12.2009
comment
Действительно? Вы думаете, что это синтаксис @myRight := rgt взрывается?   -  person mc.    schedule 31.12.2009


Ответы (2)


Если вы явно не разрешили это на своем сервере MySQL, вы не можете иметь несколько операторов sql в одном и том же cfquery. MySQL запрещает это по умолчанию, поэтому каждый из ваших операторов обновления и вставки должен находиться в своих собственных тегах cfquery.

person Eric Cobb    schedule 31.12.2009
comment
Как вы явно разрешаете это на сервере mySql? - person mc.; 31.12.2009
comment
Если я размещу их в разных блоках cfquery, могу ли я добавить их в cftransaction или mysql этого не сделает? - person mc.; 31.12.2009
comment
Вот технический ответ dev.mysql.com/ doc/refman/5.0/en/c-api-multiple-queries.html, но, насколько я помню, это настройка сервера где-то, которую вы должны иметь возможность изменить с помощью любого программного обеспечения, которое вы используете для управления своим сервером (navicat, sqlyog и т.д..) Точно не помню. Как и вы, я провожу большую часть своего времени в SQL Server (или Oracle). - person Eric Cobb; 31.12.2009
comment
Будут ли переменные mysql сохраняться в блоках cfquery? - person mc.; 31.12.2009
comment
Вы должны быть в состоянии поместить их в блок cftransaction без каких-либо проблем, хотя я не могу сказать наверняка, так как передо мной нет установки MySQL, чтобы протестировать ее. - person Eric Cobb; 31.12.2009
comment
Будут ли переменные mysql сохраняться в блоках cfquery? Вам нужно будет поместить их в CF vars. - person Eric Cobb; 31.12.2009

CFGears прав, вы не можете поместить несколько запросов в один оператор.

Чтобы сделать это из cf, вам нужно отказаться от переменных mySQL. (В любом случае это хорошо, потому что, если вы будете придерживаться более или менее стандартного SQL, ваше приложение будет легче переносить на какой-либо другой бренд табличного сервера.) Что-то вроде этого? Если вы имеете дело с таблицами myISAM, вам нужно будет поместить таблицы блокировки и таблицы разблокировки вокруг этого. Выполнение этого в транзакции будет работать нормально, если вы работаете с InnoDB.

Что-то вроде этого может сработать.

<cfquery name ="getright" datasource="#whatever#">
SELECT rgt 
  FROM categories 
 WHERE catid = <cfqueryparam cfsqltype="cf_sql_integer" value="#parentCategoryId#">
</cfquery>

<cfquery name="rgt_up_2" datasource="#whatever#">
UPDATE categories 
   SET rgt = rgt + 2 
 WHERE rgt >
  (SELECT rgt 
     FROM categories 
    WHERE catid = <cfqueryparam cfsqltype="cf_sql_integer" value="#parentCategoryId#">)
</cfquery>

<cfquery name="lft_up_2" datasource="#whatever#">
UPDATE categories 
   SET lft = lft + 2 
 WHERE lft >
  (SELECT rgt 
     FROM categories 
    WHERE catid = <cfqueryparam cfsqltype="cf_sql_integer" value="#parentCategoryId#">)
</cfquery>

<cfquery name="insrgt" datasource="#whatever#">
INSERT INTO categories(categoryName, lft, rgt) VALUES(
<cfqueryparam cfsqltype="cf_sql_varchar" value="#newCatName#">,
<cfqueryparam cfsqltype="cf_sql_integer" value="#getright.rgt#">,
<cfqueryparam cfsqltype="cf_sql_integer" value="#getright.rgt#"> + 2)
</cfquery>
person O. Jones    schedule 31.12.2009
comment
Как насчет хранимой процедуры? Будет ли это лучше в хранимой процедуре? - person mc.; 02.01.2010