Mysql
 sql >> Datenbank >  >> RDS >> Mysql

MySQL:IF / THEN-Anweisungen in gespeicherten Prozeduren

Soweit ich sehen kann, hast du ein paar Probleme:

  1. Wie David betonte, muss jede einzelne Anweisung mit einem ; abgeschlossen werden
  2. Wenn Sie ein SELECT machen , stellen Sie besser sicher, dass nur ein Wert ausgewählt werden kann, indem Sie ein LIMIT 1 ausführen; Wenn Sie eine Aggregatfunktion wie min() haben dann kann nur ein Wert herauskommen.
  3. Wenn Sie die Prozedur mit CREATE PROCEDURE ... schreiben Syntax, vergessen Sie nicht, DELIMITER $$ zu setzen vor dem CREATE PROCEDURE ... END $$ body und ein DELIMITER ; nach.
  4. Wenn Sie mehrere Anweisungen in Ihrem IF THEN ... END IF haben -Block, ist es eine gute Idee, sie in einen BEGIN ... END; einzufügen blockieren.
  5. Wenn Sie einen Rückgabewert haben, wie hier eine Agentur, warum machen Sie ihn nicht zu einem FUNCTION name (arg1: INTEGER) RETURNS INTEGER anstelle eines PROCEDURE name (IN arg1 INTEGER, OUT agency INTEGER) . Die Funktion ist viel vielseitiger.
DELIMITER $$
CREATE PROCEDURE name(arg1 INTEGER, arg2 INTEGER, ...)
BEGIN

  SELECT SET agency = 
    COALESCE((SELECT org_agency_o_id 
            FROM orgs_agencies 
            WHERE org_agency_code = maj_agency_cat) LIMIT 1,
    (SELECT min(org_id) FROM orgs     
    WHERE org_name LIKE CONCAT('U.S.',SUBSTRING(maj_agency_cat,5)))); 

  IF agency IS NULL THEN BEGIN
    -- execute multiple queries   
    INSERT INTO orgs (org_name
                     ,org_name_length
                     ,org_type
                     ,org_sub_types) 
    VALUES (CONCAT('U.S. ',SUBSTRING(maj_agency_cat,5))
           ,LENGTH(CONCAT('U.S. ',SUBSTRING(maj_agency_cat,5)))
           ,'org','Org,GovernmentEntity,Federal,Agency');

    SET agency = LAST_INSERT_ID();
  END; END IF;
END $$

DELIMITER ;