Я использую MySQL 5 на OS X - Snow Leopard ...
Иметь рабочий код на месте, который получает наибольший идентификатор порядкового номера из таблицы последовательности, а затем увеличивает его и присваивает его соответствующей таблице:
Цель исходного кода состоит в том, чтобы динамически увеличивать идентификатор последней последовательности конкретной таблицы и устанавливать для идентификатора соответствующей таблицы это новое значение.
Примечания:
1. Оригинальный фрагмент кода (который работает):
Получить последний порядковый номер
replace into my_sequence_id_s set id =
(select max(CONVERT(sequence_id, signed)) from my_table_t);
Увеличивает число
insert into my_sequence_id_s set id = null;
Сохраняет число как переменную
set @dynamicId = last_insert_id();
Печать
select @dynamicId;
2. Рефакторинг:
DROP PROCEDURE IF EXISTS generate_dynamic_id#
CREATE PROCEDURE generate_dynamic_id
(IN _sequence_table varchar(40),
IN _actual_table varchar(40),
IN _id_field VARCHAR(40),
OUT dynamic_id varchar(40))
BEGIN
-- Get Last Sequence Number
set @getLastSequenceNumberSQL =
concat('REPLACE INTO ', _sequence_table, 'SET ID =
(select max(CONVERT(',_id_field,', signed))
from ', _actual_table, ');');
prepare lastRecordStmt from @getLastSequenceNumberSQL;
execute lastRecordStmt;
deallocate prepare lastRecordStmt;
-- Increments the number.
set @createNewSequenceNumberSQL =
concat('insert into ', _sequence_table ,' set id = null;');
prepare newSequenceNumberStmt from @createNewSequenceNumberSQL;
execute newSequenceNumberStmt;
deallocate prepare newSequenceNumberStmt;
-- Set the number as a dynamic variable.
set @dynamic_id = last_insert_id();
END;
#
3. Вот вызывающая функция (которая не работает):
- Получить динамически увеличенный идентификатор
call generate_dynamic_id(
'my_sequence_id_s', 'my_table_t', 'table_id', @dynamicId);
Ошибка:
com.mysql.jdbc.exceptions.MySQLSyntaxErrorException:
You have an error in your SQL syntax;
check the manual that corresponds to your MySQL server version
for the right syntax to use near
'ID = (select max(CONVERT(id_field, signed)) from my_table_t)' at line 1
По какой-то странной причине динамические вызовы функций недопустимы в хранимых функциях или триггерах, поэтому была использована хранимая процедура.
Как видите, я настраиваю varchars для параметров, а затем пытаюсь объединить их в виде строк и запустить их внутри подготовленных операторов.
Любая помощь будет принята с благодарностью ...