PHP - MySQL, brevissimo tutorial su Stored Procedures e Stored Functions

Stored Procedures e Stored Functions sono elementi presenti da anni in PostgreSQL ed in altri DBMS e servono per far effettuare delle operazioni predefinite al DBMS, passando dei parametri in input e ricevendone degli altri in output, ma introdotti in MYSQL solo dalla versione 5.0 e successive, che sui server Tesene installiamo insieme a PHP 5.3.

Questo post, come altri, prende ispirazione dalla soluzione di problemi comuni nello sviluppo di software, ma di cui non è semplice trovare una soluzione dettagliata e funzionante in rete.

Dal punto di vista concettuale, una Stored Function ed una Stored Procedure sono cose molto simili tra di loro, però oltre ad avere una sintassi diversa richiedono anche un diverso trattamento in PHP.

Dato che questo non è un manuale on line, per i dettagli rimandiamo alle apposite pagine di documentazione:

  • http://dev.mysql.com/doc/refman/5.0/en/create-procedure.html per MYSQL 5.0
  • http://it.php.net/mysqli per PHP

Vediamo prima l'esempio più semplice, la Stored Function:  

In MYSQL

CREATE FUNCTION `hello`(s CHAR(20)) RETURNS char(50) CHARSET latin1
    DETERMINISTIC
RETURN CONCAT('Hello, ',s,'!')
 
In PHP:
 
$query="SELECT hello('world');";
 
$result=$mysqli->query($query);
while ($row = $result->fetch_row()) {
                var_dump($row);
}
 
E fin qui non c'è niente di particolare, se non mettere in atto quello che c'è scritto sulla documentazione tecnica. In pratica, una volta definita la funzione, questa si comporta come le altre normali funzioni di MySQL, come per dire ad esempio, se facessimo un SELECT now(); però, ovviamente, se fosse tutto banale, non staremo qui a scrivere questo post. 
Se effettuiamo lo stesso tipo di procedura, per una Stored Procedure, otterremmo un bel false al posto del riferimento al resultset.
 
Vediamo quindi l'esempio per la Stored Procedure:
 
In MYSQL:
 
PROCEDURE `simpleproc`(OUT param1 INT)
BEGIN
       SELECT COUNT(*) INTO param1 FROM test;
END
 
In PHP:
 
$query="CALL simpleproc(@a);SELECT @a ;";
 
if ($mysqli->multi_query($query)) {
    do {
        /* store first result set */
        if ($result = $mysqli->store_result()) {
            while ($row = $result->fetch_row()) {
                printf("%s\n", $row[0]);
            }
            $result->free();
        }
        /* print divider */
        if ($mysqli->more_results()) {
            printf("—————–\n<br/>\n");
        }
    } while ($mysqli->next_result());
}
 
In questo secondo caso, dal punto di vista del PHP, le query eseguite sono 2, per cui sono 2 anche i resultset che vengono restituiti, da cui la necessità di memorizzarli con store_result() e poi leggerli uno per volta.
Se questo mini tutorial vi è stato utile, vi prego di lasciarmi un commento qui sotto. 

 


Aumenta la diffusione di questo articolo View blog reactions

Scrivi un commento

Per inviare un commento devi fare il login.