Variabelen (MySQL)
- In gewone SQL-scripts kun je variabelen gebruiken, zij het met beperkingen
- In sprocs zijn er minder beperkingen
- Variabelen hoeven niet vantevoren te worden gedeclareerd.
Voorbeeld: Set & select een variabele
set @aanbod = true; select @aanbod; 1
Voorbeeld: Output van een query naar een variabele
INTO
select into @var1 count(*) from tbl_root;
Iets met haakjes
Om de ééndimensionale output van een query aan een variabele toe te wijzen, moet je haakjes om de query gebruiken, met de punk-komma buiten het sluithaakje:
set @ouder=(select tid from term_data where name = "DeWalt" and description = "Koolborstels voor DeWalt");
Exotisch
Eén van de bronnen hieronder komt echter met hele andere syntaxis, waarbij de crux is dat de variabele binnen het select-statement gebracht moet worden:
SET @user := 123456; SELECT @group := `group` FROM user WHERE user = @user; SELECT * FROM user WHERE `group` = @group;
Voorbeeld: Variabele in where-clause
Wellicht is de regel, dat je altijd een variabele kunt gebruiken waar je anders een waarde uit een tabel zou gebruiken. In dit voorbeeld gaat die analogie in ieder geval op:
set @begin="2016-01-01"; set @eind="2016-02-01"; select "koolborstels", sum(order_total), count(*) from koolborstels.uc_orders where order_status="Completed" and created >= unix_timestamp(@begin) and created < unix_timestamp(@eind)
Sprocs & input-variabelen
Input-variabelen in sprocs kun je als dynamische argumenten gebruiken in SQL-statements. Er zijn echter onduidelijke beperkingen: Variabelen mogen aan de rechterkant voorkomen in een vergelijking, maar ogenschijnlijk niet op andere plekken. Misschien zoals hiervoor al opgemerkt: Je kunt een variabele gebruiken op plekken waar anders sowieso een dynamische waarde zou hebben gestaan (dus alles wat bij compilatie nog niet bekend is):
CREATE DEFINER=`root`@`localhost` PROCEDURE `sprocs_en_variabelen`(in argument tinytext ) BEGIN select * from argument; -- Foutmelding dat tabel 'argument' niet bestaat select * from @argument; -- Syntax error select * from root where sku=argument -- OK END
Een complexer voorbeeld:
CREATE DEFINER=`root`@`localhost` PROCEDURE `AddColumnUnlessExists`( IN dbName tinytext, IN tableName tinytext, IN fieldName tinytext, in fieldDef varchar(100) ) begin IF NOT EXISTS ( SELECT * FROM information_schema.COLUMNS WHERE column_name=fieldName and table_name=tableName and table_schema=dbName ) THEN set @ddl=CONCAT('ALTER TABLE ',dbName,'.',tableName, ' ADD COLUMN ',fieldName," ",fieldDef); prepare stmt from @ddl; execute stmt; END IF; end
Een vergelijkbaar voorbeeld:
CREATE DEFINER=`root`@`localhost` PROCEDURE `insert_column_names`(in tabelnaam tinytext) BEGIN set @ddl1=(select group_concat(column_name) from information_schema.columns where table_name=tabelnaam); select @ddl1;