Bonjour,

J'ai une procédure stockée qui doit s'occuper du transfert de données entre 2 clients. Je fais plusieurs contrôles avant de démarrer la procédure à proprement parler (je n'ai aucune confiance aux devs par nature )

Le problème étant, MySQL me renvoie les résultats des SELECT intermédiaires. Comment les supprimer ?

Code : Sélectionner tout - Visualiser dans une fenêtre à part
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
MariaDB [Prisme]> call Fusion(100, 101);
+---------------------+
| @cptClt := COUNT(*) |
+---------------------+
|                   1 |
+---------------------+
1 row in set (0.00 sec)
 
+---------------------+
| @cptClt := COUNT(*) |
+---------------------+
|                   1 |
+---------------------+
1 row in set (0.00 sec)
 
+------------------------+
| @cptTables := COUNT(*) |
+------------------------+
|                     82 |
+------------------------+
1 row in set (0.66 sec)
 
+----------------------------+
| @cptTablesCtrl := COUNT(*) |
+----------------------------+
|                         82 |
+----------------------------+
1 row in set (0.66 sec)
 
+----------------------+
| OK on peut commencer |
+----------------------+
| OK on peut commencer |
+----------------------+
1 row in set (0.66 sec)
J'aimerais que ma requête ne renvoie que le OK final, que les devs ne puissent pas voir ce qui se passe pendant qu'ils exécutent la procédure

Pour info, mon code :

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
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
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
 
CREATE PROCEDURE `Fusion`(id_source INT, id_dest INT)
BEGIN
 
    SET @cptClt = 0;
    SET @cptTables = 0;
    SET @cptTablesCtrl = 0;
 
    IF (id_source IS NULL OR
       id_dest IS NULL) THEN
 
       SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'id_source et id_dest ne peuvent être null.';
 
    ELSEIF id_source = id_dest THEN
 
       SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'Impossible de transférer un client sur lui même.';
 
    END IF;
 
    SELECT    @cptClt := COUNT(*)
    FROM    client
    WHERE    id = id_source;
 
    IF @cptClt <> 1 THEN
        SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'Client source inexistant.';
    END IF;
 
    SELECT  @cptClt := COUNT(*)
    FROM    client
    WHERE   id = id_dest;
 
    IF @cptClt <> 1 THEN
        SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'Client de destination inexistant.';
    END IF;
 
    DROP TABLE IF EXISTS ps_Fusion_update_tables;
 
    CREATE TEMPORARY TABLE ps_Fusion_update_tables (
        id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
        table_schema VARCHAR(64) NOT NULL DEFAULT '__DB__',
        table_name VARCHAR(64) NOT NULL,
        column_name VARCHAR(64) NOT NULL,
        condition_update VARCHAR(400) NULL DEFAULT NULL
    )
    CHARACTER SET utf8 COLLATE utf8_general_ci;
 
    INSERT INTO ps_Fusion_update_tables (table_name, column_name, condition_update)
    VALUES ('table_1', 'id_client', NULL),
           ('table_2', 'client', 'type = 1'),
           ('client', 'id', NULL);
 
 
    /**
     * Contrôle des combinaisons tables/colonnes
     */
 
    SELECT  @cptTables := COUNT(*)
    FROM    INFORMATION_SCHEMA.COLUMNS c INNER JOIN
            ps_Fusion_update_tables u ON u.table_name = c.table_name AND
                                         u.column_name = c.column_name AND
                                         u.table_schema = c.table_schema;
 
    SELECT  @cptTablesCtrl := COUNT(*)
    FROM    ps_Fusion_update_tables;
 
    IF (@cptTables <> @cptTablesCtrl) THEN
	DROP TABLE ps_Fusion_update_tables;
        SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'Une des tables ne contient pas la colonne associée. Vérifier la PS.';
    END IF;
 
    SELECT 'OK on peut commencer';
 
 
    DROP TABLE ps_Fusion_update_tables;
END

PS : J'ai oublié de préciser, il faut que ça fonctionne à la fois sous MySQL 5.5, Mysql 5.7, MariaDB 10.0 et MariaDB 10.1 (histoire que ce soit plus rigolo), car nos environnements ne sont pas équivalents sur toutes nos machines...