2011-01-05 8 views
0

Am MySQL 5 auf OS X - Snow Leopard ...MySQL 5: Der Versuch, dynamische Sequenz IDs als gespeicherte Funktion zu generieren oder Stored Procedure

Haben Sie an Ort und Stelle arbeiten Code, der die höchste Sequenznummer ID aus einer Sequenz erhält Tabelle und dann inkrementiert und ordnet es der entsprechenden Tabelle zu:

Der ursprüngliche Code dient dazu, die letzte Sequenz-ID einer bestimmten Tabelle dynamisch zu inkrementieren und die ID der entsprechenden Tabelle auf diesen neuen Wert zu setzen.

Hinweise:


1. Original-Code Snippet (das funktioniert):

Erhalten letzte Sequenznummer

replace into my_sequence_id_s set id = 
(select max(CONVERT(sequence_id, signed)) from my_table_t); 

erhöht die Anzahl

insert into my_sequence_id_s set id = null; 

Speichert die Zahl als Variable

set @dynamicId = last_insert_id(); 

Drucken

select @dynamicId; 

2. Refactoring:

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. Hier ist die Aufruffunktion (die nicht):

- id

call generate_dynamic_id(
    'my_sequence_id_s', 'my_table_t', 'table_id', @dynamicId); 

Fehler dynamisch erhöht Get:

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 

Aus irgendeinem seltsamen Grund sind dynamische Funktionsaufrufe in gespeicherten Funktionen oder Triggern nicht erlaubt, deshalb wurde eine Stored Procedure verwendet.

Wie Sie sehen können, bin ich Varchars bei den Parametern einrichten und dann versuchen, sie als Strings verketten und sie in vorbereiteten Anweisungen ausführen.

Jede Hilfe wäre sehr dankbar ...

Antwort

3

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

wo Raum zwischen _sequence_table und SET ID?