sql >> Database >  >> RDS >> Mysql

MySQL:IF / THEN-instructies in opgeslagen procedures

Je hebt een paar problemen voor zover ik kan zien:

  1. Zoals David aangaf, moet elke verklaring worden afgesloten met een ;
  2. Als je een SELECT doet , zorg er dan voor dat het maar één waarde kan selecteren door een LIMIT 1 . te doen; Als je een verzamelfunctie hebt zoals min() dan kan er maar één waarde uitkomen.
  3. Als u de procedure schrijft met behulp van de CREATE PROCEDURE ... syntaxis, vergeet niet DELIMITER $$ in te stellen vóór de CREATE PROCEDURE ... END $$ body en een DELIMITER ; na.
  4. Als je meerdere uitspraken hebt in je IF THEN ... END IF blok, is het een goed idee om ze in een BEGIN ... END; . te plaatsen blok.
  5. Als u een retourwaarde heeft, zoals bureau hier, waarom maakt u er dan geen FUNCTION name (arg1: INTEGER) RETURNS INTEGER van in plaats van een PROCEDURE name (IN arg1 INTEGER, OUT agency INTEGER) . De functie is veel veelzijdiger.
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 ;


  1. Installeer en maak verbinding met PostgreSQL 10 op Ubuntu 16.04

  2. sql voor het berekenen van punten voor games

  3. Hoe kan ik het schema van een database exporteren in PostgreSQL?

  4. C# met MySQL INSERT-parameters