MSSQL to MySQL

Nov 24, 2009 10:04

Планирую перевести один проект с MSSQL на MySQL.
Для начала перенёс функции Delphi/C++Builder кода на Java ;-)
В MSSQL активно используются хранимые процедуры (ХП).
Из Java с SQL работаю, используя Spring JDBC Templates.

Есть мелкий технический вопрос и большой философский.

Мелкий касается неприятной особенности MySQL:
MySQL считает присвоение переменной update’ом с обновленных строк == 0.

String sql = "set @i = 10; select @i;";
Statement st = ds.getConnection().createStatement();
boolean isRs = st.execute(sql);
assert !isRs; //получен не ResultSet, а UpdateCount --1
assert st.getUpdateCount() == 0;
assert 0 == simpleJdbcTemplate.update(sql);//аналогично^ -- 2

//wtf! throws org.springframework.dao.TransientDataAccessResourceException: ResultSet is from UPDATE. No Data.
simpleJdbcTemplate.queryForInt(sql);

Помогите! Обыскал всё! Может быть есть какой-нибудь параметр в my.ini/my.conf или в JDBC URL (вроде allowMultiQueries=true), к-ый бы отключил генерацию updateCount/ Rows Affected для переменных.

Переменные мне нужны, т.к. без них запросы получаются крайне громоздкими (вся логика была в хранимых, а T-SQL очень мощный язык).

Философский вопрос: ORM и/или хранимые процедуры (ХП).

Я много писал на Delphi+MSSQL. Есть люди, которые пишут только на T-SQL, PL/SQL,
т.к. это мощные языки, оптимизированные для работы с БД.
Опыт показывает, что часто код в ХП работает в ДЕСЯТКИ раз быстрее того же кода, вызываемого частями с клиента (ХП внутри, скомпилирована, план построен, данные по сети не гоняются). На ХП был написан не один биллинг и т.д. и т.п.

Но правильно ли я понимаю, что индустрия пришла к выводу, что ХП всё же тупиковый путь т.к.
ORM не сильно дружит с ХП?

Используете ли вы ХП или стоит всплакнуть по ним и забыть?

UPDATE:
На sql.ru посоветовали зверский, но рабочий способ. Я сделал доведенный до крайности пример:

set @a = null; set @b = null; set @c = null;

select @a, @b, @c;-- null, null, null - всё чисто и готово к эксперименту

select 'boo!', @a+@b+@c
FROM (SELECT @a := 1, @b := 2, @c := 3) t; -- boo!, 6 т.е. from отработал раньше!

select @a, @b, @c;-- 1,2,3 значения сохранились

select @a, @b, @c from (select @a := @a*10, @b:=@b*20, @c:=@c*30) t;-- 10,40,90 опять from отработал раньше!

select @a, @b, @c;-- 10,40,90 и значения сохранились

spring, jdbc, mysql

Previous post Next post
Up