sql >> Databasteknik >  >> RDS >> Mysql

Skapa dynamisk fråga i lagrad procedur MySQL

Du sammanfogar pArea parametern till SQL utan citat. Det vill säga innehållet i @Query som du förbereder för utförande är:

SELECT PinCode FROM Areas WHERE AreaName = Teynampet

Sedan Teynampet är utan citattecken, tolkas den som en (n okänd) SQL-identifierare snarare än en sträng. Du bör antingen:

  • citera det i din SQL:

    SET @City  = CONCAT(' WHERE AreaName = ', QUOTE(pArea));
    
  • skicka den till den förberedda satsen som en parameter:

    SET @City  = CONCAT(' WHERE AreaName = ?');
    SET @param = pArea;
    

    och sedan:

    EXECUTE stmt USING @param;
    

Men varför använda förberedda uttalanden här? Din procedur kan skrivas om som en enkel SELECT (vilket väcker frågan om du behöver använda en lagrad procedur överhuvudtaget):

CREATE PROCEDURE mp_test(IN pArea VARCHAR(255))
  SELECT PinCode FROM Areas WHERE pArea IN (AreaName, '');

(Observera att jag rekommenderar att du använder NULL istället för den tomma strängen '' , i vilket fall ovanstående test skulle vara pArea IS NULL OR pArea = AreaName ).




  1. MySQL-fältet DATETIME trunkerar ISO8601

  2. php sammanfoga json-arrayer

  3. Ansluter du till flera CloudSQL-instanser med Cloud sql-proxy?

  4. Välj COUNT(*) med DISTINCT