Maison  >  Questions et réponses  >  le corps du texte

Créez une fonction MySQL pour renvoyer une valeur à partir d'un résultat SELECT

Je souhaite créer cette fonction sur mySql 8. Cela créera un numéro de série comme 00001,00002

CREATE FUNCTION dbOne.create_sequence_number(lastNumber CHAR(255), numberLength INT, lastValue CHAR(255) ) RETURNS char(255)
BEGIN
    DECLARE select_var CHAR(255);
    SET select_var = (SELECT 
        CASE WHEN lastNumber = lastValue 
        THEN
        LPAD( '1', numberLength, '0' ) 
        ELSE 
        LPAD(CAST(( CAST(COALESCE ( lastNumber, '0' ) AS INT) + 1 ) AS VARCHAR, numberLength, '0' ) INTO select_var);
    RETURN select_var;
END

Je ne sais pas quel est le problème avec cette requête mais j'obtiens toujours cette erreur.

SQL Error [1064] [42000]: 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 'INT) + 1 ) AS VARCHAR, numberLength, '0' ) INTO select_var);
    RETURN select_var' at line 9
  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 'INT) + 1 ) AS VARCHAR, numberLength, '0' ) INTO select_var);
    RETURN select_var' at line 9
  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 'INT) + 1 ) AS VARCHAR, numberLength, '0' ) INTO select_var);
    RETURN select_var' at line 9

J'ai également essayé cette requête.

CREATE FUNCTION erhav2_db.create_sequence_number(lastNumber CHAR(255), numberLength INT, lastValue CHAR(255) ) RETURNS char(255)
BEGIN
    DECLARE select_var CHAR(255);
    SELECT 
        (CASE WHEN lastNumber = lastValue 
        THEN
        lpad( '1', numberLength, '0' ) 
        ELSE 
        lpad(CAST(( CAST(COALESCE ( lastNumber, '0' ) AS INT) + 1 ) AS VARCHAR, numberLength, '0' ))) INTO select_var;
    RETURN select_var;
END

Mais je me donne toujours la même erreur. Qu'est-ce qui pourrait mal se passer avec ma requête de fonction ?

P粉685757239P粉685757239188 Il y a quelques jours404

répondre à tous(1)je répondrai

  • P粉905144514

    P粉9051445142024-04-03 09:46:44

    CREATE FUNCTION dbOne.create_sequence_number(
        lastNumber /* CHAR(255) */ UNSIGNED, 
        numberLength INT, 
        lastValue CHAR(255) 
    ) 
    RETURNS CHAR(255)
    RETURN LPAD(CASE WHEN lastNumber = lastValue
                     THEN 1
                     ELSE COALESCE(lastNumber, 0) + 1
                     END,
                numberLength, 
                '0');
    

    Les conversions de types de données multiples sont redondantes : MySQL modifie implicitement les types de données en fonction du contexte de l'opération.

    Toutes les opérations peuvent être effectuées dans une seule instruction, ce qui rend inutiles à la fois la déclaration des variables et le BEGIN-END (ainsi que la réaffectation des délimiteurs).

    Le code nécessite lastNumber 才能转换为数字数据类型。如果不是,那么你和我的代码在严格 SQL 模式下都会失败。因此,我建议将 lastNumber CHAR(255) que le type de données du paramètre d'entrée soit modifié en UNSIGNED/INT - cela permettra de détecter l'inexactitude de la valeur au stade de l'appel de fonction, plutôt que dans le code de fonction.

    répondre
    0
  • Annulerrépondre