Tentei criar um procedimento para ajustar uma sequência de acordo com o valor máximo em uma coluna. Para obter o valor máximo da coluna e armazená-lo em uma variável, acabei usando um cursor "fictício". Imagino que haja uma maneira mais simples, mas não consegui fazer nenhuma delas funcionar. Alguma sugestão sobre como me livrar do cursor e ainda conseguir usar o valor máximo na instrução alter?
--#SET TERMINATOR @
CREATE OR REPLACE PROCEDURE Adjust_Sequence(
IN p_table_schema VARCHAR(128),
IN p_table_name VARCHAR(128),
IN p_column_name VARCHAR(128),
IN p_sequence_name VARCHAR(128)
)
LANGUAGE SQL
BEGIN
DECLARE v_max_value BIGINT DEFAULT 1;
DECLARE v_sql_stmt VARCHAR(1000);
DECLARE cur CURSOR FOR S;
-- Construct SQL to get the max value of the specified column
SET v_sql_stmt = 'SELECT COALESCE(MAX(' || p_column_name || '), 0) + 1 FROM ' || p_table_schema || '.' || p_table_name;
-- Prepare and execute the statement properly
PREPARE S FROM v_sql_stmt;
OPEN cur;
FETCH cur INTO v_max_value;
CLOSE cur;
-- Construct SQL to alter the sequence to restart with the new max value
SET v_sql_stmt = 'ALTER SEQUENCE ' || p_sequence_name || ' RESTART WITH ' || v_max_value;
-- Execute the sequence alteration
EXECUTE IMMEDIATE v_sql_stmt;
END @
--#SET TERMINATOR ;
Você pode usar a
SET
instrução para gerar umALTER SEQUENCE
comando apropriado.BTW, sequências também têm nomes de esquema.
Então, você deve ter algo como
IN p_sequence_schema VARCHAR(128)
declaração e usar esse parâmetro adequadamente...