sql >> Database teknologi >  >> RDS >> Mysql

MySQL:IF / THEN sætninger i lagrede procedurer

Du har et par problemer, så vidt jeg kan se:

  1. Som David påpegede, skal hvert eneste udsagn afsluttes med en ;
  2. Hvis du laver en SELECT , sørg for, at den kun kan vælge én værdi ved at lave en LIMIT 1; Hvis du har en samlet funktion som min() så kan der kun komme én værdi ud.
  3. Hvis du skriver proceduren ved hjælp af CREATE PROCEDURE ... syntaks, glem ikke at indstille DELIMITER $$ før CREATE PROCEDURE ... END $$ body og en DELIMITER ; efter.
  4. Hvis du har flere udsagn i din IF THEN ... END IF blok, er det en god idé at sætte dem i en BEGIN ... END; blokere.
  5. Hvis du har en returværdi, f.eks. bureau her, hvorfor så ikke gøre det til et FUNCTION name (arg1: INTEGER) RETURNS INTEGER i stedet for et PROCEDURE name (IN arg1 INTEGER, OUT agency INTEGER) . Funktionen er meget mere alsidig.
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. Hvad skal jeg ellers gøre for at rense brugerinput?

  2. Ydelsestest ved hjælp af MySQLdump og MySQL Shell Utility

  3. Hvordan får man den næste post i mysql-resultatdatasættet?

  4. Er det muligt for SQL Output-sætning at returnere en kolonne, der ikke er indsat?