Bonjour,
Je n'arrive pas à trouver comment faire une regex qui trouve les point-virgules pour séparer des requêtes SQL, sachant qu'il peut y avoir des fonctions (qui contiennent donc des points virgules dans leur corps);
Par exemple, avec un preg_replace(), je souhaite convertir :
Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14 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; END IF; RETURN id; END; $$ LANGUAGE PLPGSQL;
en :
Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14 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; END IF; RETURN id; END; $$ LANGUAGE PLPGSQL;###
La difficulté est donc de ne pas tenir compte des point-virgules entre "CREATE FUNCTION" ET "PLPGSQL" par exemple.
Après, il me suffit de faire un explode sur '###' pour mettre chaque requête séparément dans un tableau.
(EDIT : ou preg_split(), et rajout du point-virgule en fin de chaque chaine)
J'ai regardé du côté des assertions avant/arrières, mais je n'ai pas réussi à mettre en œuvre quelque chose qui fonctionne...
Merci d'avance pour l'aide apportée.
Partager