Variabelen (MySQL): verschil tussen versies

Uit De Vliegende Brigade
Naar navigatie springen Naar zoeken springen
Regel 43: Regel 43:
 
</pre>
 
</pre>
  
== Input-argumenten bij sprocs ==
+
== Sprocs & input-variabelen ==
  
Een input-argument (of hoe dat moge heten) in een sproc, heeft geen '@' nodig, maar er zijn wel beperkingen:
+
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:
  
 
<pre>
 
<pre>
CREATE DEFINER=`root`@`localhost` PROCEDURE `ExportFixNull`(in tblname tinytext )
+
CREATE DEFINER=`root`@`localhost` PROCEDURE `sprocs_en_variabelen`(in argument tinytext )
 
BEGIN
 
BEGIN
  
  select tblname;          -- Dit werkt!
+
   select * from argument;               -- Foutmelding dat tabel 'argument' niet bestaat
   select * from tblname;   -- Werk niet: Foutmelding dat tabel 'tblname' niet bestaat
+
   select * from @argument;             -- Syntax error
   select * from @tblname;   -- Syntax error
+
  select * from root where sku=argument -- OK
  
 
END
 
END
 
</pre>
 
</pre>
  
En een voorbeeld dat ehh, het tegendeel bewijst:
+
Een complexer voorbeeld:
  
 
<pre>
 
<pre>

Versie van 11 mei 2016 12:54

Variabelen & SQL

In reguliere SQL-expressies kun je variabelen gebruiken, zij het met beperkingen.

Voorbeeld: Set & select een variabele

set @aanbod = true;
select @aanbod;
1

Voorbeeld: Output van een query naar een variabele

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");

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:

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

Bronnen