1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52
| // chaine à traiter
$chaine = "DROP FUNCTION IF EXISTS maFonction (INTEGER,INTEGER,TIMESTAMP);
CREATE FUNCTION maFonction (INTEGER,INTEGER,TIMESTAMP)
RETURNS INTEGER
AS $$
DECLARE
id INTEGER;
BEGIN
blabla;
IF id IS NULL THEN
blabla $1;
END IF;
RETURN id;
END;
$$ LANGUAGE PLPGSQL;
DROP FUNCTION IF EXISTS maFonction (INTEGER,INTEGER,TIMESTAMP);
CREATE FUNCTION maFonction (INTEGER,INTEGER,TIMESTAMP)
RETURNS INTEGER
AS $$
DECLARE
id INTEGER;
BEGIN
blabla;
IF id IS NULL THEN
blabla $1;
END IF;
RETURN id;
END;
$$ LANGUAGE PLPGSQL;";
// motif détectant le corps d'une fonction plpgsql
$pattern = "#create\sfunction(.*)plpgsql#siU";
// fonction remplaçant les point virgules (destinée à traiter le corps de la fonction)
function remplacePointsVirgules($arg) {
return str_replace(';', '###', $arg[0]);
}
// traitement du corps de la fonction pour remplacer ses points-vigules
$tmp = preg_replace_callback($pattern, "remplacePointsVirgules", $chaine);
// explode sur les points-virgules restants (en dehors des corps de fonction
$tmp = explode(';', $tmp);
// traitement du tableau obtenu avec rétablissement des points-virgules des corps de fonction et en fin de commande SQL
foreach ($tmp as $sql) {
$sql = trim($sql);
if (strlen($sql))
$tableauSQL[] = str_replace('###', ';', $sql).';';
}
var_dump($tableauSQL); |
Partager