MySQL 5. Попытка сгенерировать идентификаторы динамической последовательности в качестве хранимой функции или хранимой процедуры - PullRequest
0 голосов
/ 05 января 2011

Я использую 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 для параметров, а затем пытаюсь объединить их в виде строк и запустить их внутри подготовленных операторов.

Любая помощь будет принята с благодарностью ...

1 Ответ

3 голосов
/ 28 сентября 2011

concat ('REPLACE INTO', _sequence_table, 'SET ID =

где пробел между _sequence_table и SET ID?

...