IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

SQL Procédural MySQL Discussion :

Ne pas récupérer les résultats intermédiaires dans une procédure stockée


Sujet :

SQL Procédural MySQL

  1. #1
    Membre éclairé Avatar de mioux
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Novembre 2005
    Messages
    368
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Finance

    Informations forums :
    Inscription : Novembre 2005
    Messages : 368
    Par défaut Ne pas récupérer les résultats intermédiaires dans une procédure stockée
    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...

  2. #2
    Membre prolifique Avatar de Artemus24
    Homme Profil pro
    Agent secret au service du président Ulysses S. Grant !
    Inscrit en
    Février 2011
    Messages
    6 788
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Agent secret au service du président Ulysses S. Grant !
    Secteur : Finance

    Informations forums :
    Inscription : Février 2011
    Messages : 6 788
    Par défaut
    Salut Mioux.

    Voici le script de test :
    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
    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
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    SET AUTOCOMMIT = 0;
    START TRANSACTION;
     
    -- ======================
    -- Base de Données `base`
    -- ======================
     
    DROP DATABASE IF EXISTS `base`;
     
    CREATE DATABASE `base`
    	DEFAULT CHARACTER SET `latin1`
    	DEFAULT COLLATE       `latin1_general_ci`;
     
    use `base`;
     
    -- =======================
    -- Création table `tabone`
    -- =======================
     
    DROP TABLE IF EXISTS `tabone`;
     
    CREATE TABLE `tabone`
    ( `id_client`  integer unsigned  NOT NULL
    ) ENGINE=InnoDB
      DEFAULT CHARSET=`latin1` COLLATE=`latin1_general_ci`
      ROW_FORMAT=COMPRESSED;
     
    -- =======================
    -- Insertion dans `tabone`
    -- =======================
     
    insert into `tabone` (`id_client`) values  (1),(4);
     
    -- ==================
    -- Vidage de `tabone`
    -- ==================
     
    select * from `tabone`;
     
    -- =======================
    -- Création table `tabtwo`
    -- =======================
     
    DROP TABLE IF EXISTS `tabtwo`;
     
    CREATE TABLE `tabtwo`
    ( `client`  integer unsigned  NOT NULL
    ) ENGINE=InnoDB
      DEFAULT CHARSET=`latin1` COLLATE=`latin1_general_ci`
      ROW_FORMAT=COMPRESSED;
     
    -- =======================
    -- Insertion dans `tabtwo`
    -- =======================
     
    insert into `tabtwo` (`client`) values  (2),(4);
     
    -- ==================
    -- Vidage de `tabtwo`
    -- ==================
     
    select * from `tabtwo`;
     
    -- =======================
    -- Création table `client`
    -- =======================
     
    DROP TABLE IF EXISTS `client`;
     
    CREATE TABLE `client`
    ( `id`  integer unsigned  NOT NULL
    ) ENGINE=InnoDB
      DEFAULT CHARSET=`latin1` COLLATE=`latin1_general_ci`
      ROW_FORMAT=COMPRESSED;
     
    -- =======================
    -- Insertion dans `client`
    -- =======================
     
    insert into `client` (`id`) values  (1),(2),(4);
     
    -- ==================
    -- Vidage de `client`
    -- ==================
     
    select * from `client`;
     
    commit;
     
    -- ==========================
    -- Procédure stockée `fusion`
    -- ==========================
     
    DROP PROCEDURE IF EXISTS `fusion`;
     
    DELIMITER $$
    CREATE PROCEDURE `fusion` (IN  _source  integer,
                               IN  _dest    integer)
    DETERMINISTIC
    NO SQL
    BEGIN
    	declare _msg  varchar(255) default null;
     
    -- ====================
    --  Test des Paramètres
    -- ====================
     
    	IF (_source IS NULL) THEN
    		set _msg = 'id_source ne peut pas être NULL.';
    		SIGNAL SQLSTATE value '07777' SET MESSAGE_TEXT = _msg , MYSQL_ERRNO = 01;
    	END IF;
     
    	IF (_dest IS NULL) THEN
    		set _msg = 'id_dest ne peut pas être NULL.';
    		SIGNAL SQLSTATE value '07777' SET MESSAGE_TEXT = _msg , MYSQL_ERRNO = 02;
    	END IF;
     
    	IF (_source = _dest) THEN
    		set _msg = concat('id_source = id_dest = ', _source, ', Impossible de transférer un client sur lui même.');
    		SIGNAL SQLSTATE value '07777' SET MESSAGE_TEXT = _msg , MYSQL_ERRNO = 03;
    	END IF;
     
    -- ==============================
    --  Test de conformité des tables
    -- ==============================
     
    	if ((select 1 FROM INFORMATION_SCHEMA.COLUMNS where (table_schema, table_name, column_name) in (('base','tabone','id_client'))) is null) THEN
    		set _msg = 'La table ''tabone'' n''est pas conforme.';
    		SIGNAL SQLSTATE value '07777' SET MESSAGE_TEXT = _msg , MYSQL_ERRNO = 10;
    	END IF;
     
    	if ((select 1 FROM INFORMATION_SCHEMA.COLUMNS where (table_schema, table_name, column_name) in (('base','tabtwo','client'))) is null) THEN
    		set _msg = 'La table ''tabtwo'' n''est pas conforme.';
    		SIGNAL SQLSTATE value '07777' SET MESSAGE_TEXT = _msg , MYSQL_ERRNO = 11;
    	END IF;
     
    	if ((select 1 FROM INFORMATION_SCHEMA.COLUMNS where (table_schema, table_name, column_name) in (('base','client','id'))) is null) THEN
    		set _msg = 'La table ''client'' n''est pas conforme.';
    		SIGNAL SQLSTATE value '07777' SET MESSAGE_TEXT = _msg , MYSQL_ERRNO = 12;
    	END IF;
     
    -- =================
    --  Test d'existence
    -- =================
     
    	if ((select 1 from `client` where id = _source) is null) then
    		set _msg = concat('Source : Client = ', _source, ' non présent dans table ''client''.');
    		SIGNAL SQLSTATE value '07777' SET MESSAGE_TEXT = _msg , MYSQL_ERRNO = 20;
    	END IF;
     
    	if ((select 1 from `client` where id = _dest) is null) THEN
    		set _msg = concat('Destinataire : Client = ', _dest, ' non présent dans table ''client''.');
    		SIGNAL SQLSTATE value '07777' SET MESSAGE_TEXT = _msg , MYSQL_ERRNO = 21;
    	END IF;
     
    	if ((select 1 from `tabone` where id_client = _source) is null) THEN
    		set _msg = concat('Source : Client = ', _source, ' non présent dans table ''tabone''.');
    		SIGNAL SQLSTATE value '07777' SET MESSAGE_TEXT = _msg , MYSQL_ERRNO = 22;
    	END IF;
     
    	if ((select 1 from `tabtwo` where client = _dest) is null) THEN
    		set _msg = concat('Destinataire : Client = ', _dest, ' non présent dans table ''tabtwo''.');
    		SIGNAL SQLSTATE value '07777' SET MESSAGE_TEXT = _msg , MYSQL_ERRNO = 23;
    	END IF;
    END$$
    DELIMITER ;
     
    commit;
     
    -- ===============
    -- Appel Procédure
    -- ===============
     
    call `fusion` (NULL, 2   );
    call `fusion` (1,    NULL);
    call `fusion` (1,    1   );
    call `fusion` (3,    1   );
    call `fusion` (1,    3   );
    call `fusion` (2,    4   );
    call `fusion` (4,    1   );
    call `fusion` (1,    2   );
     
    -- ===
    -- Fin
    -- ===
     
    COMMIT;
    SET AUTOCOMMIT = 1;
    exit
    Et voici l'exécutable :
    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
    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
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    --------------
    SET AUTOCOMMIT = 0
    --------------
     
    --------------
    START TRANSACTION
    --------------
     
    --------------
    DROP DATABASE IF EXISTS `base`
    --------------
     
    --------------
    CREATE DATABASE `base`
            DEFAULT CHARACTER SET `latin1`
            DEFAULT COLLATE       `latin1_general_ci`
    --------------
     
    --------------
    DROP TABLE IF EXISTS `tabone`
    --------------
     
    --------------
    CREATE TABLE `tabone`
    ( `id_client`  integer unsigned  NOT NULL
    ) ENGINE=InnoDB
      DEFAULT CHARSET=`latin1` COLLATE=`latin1_general_ci`
      ROW_FORMAT=COMPRESSED
    --------------
     
    --------------
    insert into `tabone` (`id_client`) values  (1),(4)
    --------------
     
    --------------
    select * from `tabone`
    --------------
     
    +-----------+
    | id_client |
    +-----------+
    |         1 |
    |         4 |
    +-----------+
    --------------
    DROP TABLE IF EXISTS `tabtwo`
    --------------
     
    --------------
    CREATE TABLE `tabtwo`
    ( `client`  integer unsigned  NOT NULL
    ) ENGINE=InnoDB
      DEFAULT CHARSET=`latin1` COLLATE=`latin1_general_ci`
      ROW_FORMAT=COMPRESSED
    --------------
     
    --------------
    insert into `tabtwo` (`client`) values  (2),(4)
    --------------
     
    --------------
    select * from `tabtwo`
    --------------
     
    +--------+
    | client |
    +--------+
    |      2 |
    |      4 |
    +--------+
    --------------
    DROP TABLE IF EXISTS `client`
    --------------
     
    --------------
    CREATE TABLE `client`
    ( `id`  integer unsigned  NOT NULL
    ) ENGINE=InnoDB
      DEFAULT CHARSET=`latin1` COLLATE=`latin1_general_ci`
      ROW_FORMAT=COMPRESSED
    --------------
     
    --------------
    insert into `client` (`id`) values  (1),(2),(4)
    --------------
     
    --------------
    select * from `client`
    --------------
     
    +----+
    | id |
    +----+
    |  1 |
    |  2 |
    |  4 |
    +----+
    --------------
    commit
    --------------
     
    --------------
    DROP PROCEDURE IF EXISTS `fusion`
    --------------
     
    --------------
    CREATE PROCEDURE `fusion` (IN  _source  integer,
                               IN  _dest    integer)
    DETERMINISTIC
    NO SQL
    BEGIN
            declare _msg  varchar(255) default null;
     
     
     
     
     
            IF (_source IS NULL) THEN
                    set _msg = 'id_source ne peut pas être NULL.';
                    SIGNAL SQLSTATE value '07777' SET MESSAGE_TEXT = _msg , MYSQL_ERRNO = 01;
            END IF;
     
            IF (_dest IS NULL) THEN
                    set _msg = 'id_dest ne peut pas être NULL.';
                    SIGNAL SQLSTATE value '07777' SET MESSAGE_TEXT = _msg , MYSQL_ERRNO = 02;
            END IF;
     
            IF (_source = _dest) THEN
                    set _msg = concat('id_source = id_dest = ', _source, ', Impossible de transférer un client sur lui même.');
                    SIGNAL SQLSTATE value '07777' SET MESSAGE_TEXT = _msg , MYSQL_ERRNO = 03;
            END IF;
     
     
     
     
     
            if ((select 1 FROM INFORMATION_SCHEMA.COLUMNS where (table_schema, table_name, column_name) in (('base','tabone','id_client'))) is null) THEN
                    set _msg = 'La table ''tabone'' n''est pas conforme.';
                    SIGNAL SQLSTATE value '07777' SET MESSAGE_TEXT = _msg , MYSQL_ERRNO = 10;
            END IF;
     
            if ((select 1 FROM INFORMATION_SCHEMA.COLUMNS where (table_schema, table_name, column_name) in (('base','tabtwo','client'))) is null) THEN
                    set _msg = 'La table ''tabtwo'' n''est pas conforme.';
                    SIGNAL SQLSTATE value '07777' SET MESSAGE_TEXT = _msg , MYSQL_ERRNO = 11;
            END IF;
     
            if ((select 1 FROM INFORMATION_SCHEMA.COLUMNS where (table_schema, table_name, column_name) in (('base','client','id'))) is null) THEN
                    set _msg = 'La table ''client'' n''est pas conforme.';
                    SIGNAL SQLSTATE value '07777' SET MESSAGE_TEXT = _msg , MYSQL_ERRNO = 12;
            END IF;
     
     
     
     
     
            if ((select 1 from `client` where id = _source) is null) then
                    set _msg = concat('Source : Client = ', _source, ' non présent dans table ''client''.');
                    SIGNAL SQLSTATE value '07777' SET MESSAGE_TEXT = _msg , MYSQL_ERRNO = 20;
            END IF;
     
            if ((select 1 from `client` where id = _dest) is null) THEN
                    set _msg = concat('Destinataire : Client = ', _dest, ' non présent dans table ''client''.');
                    SIGNAL SQLSTATE value '07777' SET MESSAGE_TEXT = _msg , MYSQL_ERRNO = 21;
            END IF;
     
            if ((select 1 from `tabone` where id_client = _source) is null) THEN
                    set _msg = concat('Source : Client = ', _source, ' non présent dans table ''tabone''.');
                    SIGNAL SQLSTATE value '07777' SET MESSAGE_TEXT = _msg , MYSQL_ERRNO = 22;
            END IF;
     
            if ((select 1 from `tabtwo` where client = _dest) is null) THEN
                    set _msg = concat('Destinataire : Client = ', _dest, ' non présent dans table ''tabtwo''.');
                    SIGNAL SQLSTATE value '07777' SET MESSAGE_TEXT = _msg , MYSQL_ERRNO = 23;
            END IF;
    END
    --------------
     
    --------------
    commit
    --------------
     
    --------------
    call `fusion` (NULL, 2   )
    --------------
     
    ERROR 1 (07777) at line 174: id_source ne peut pas être NULL.
    --------------
    call `fusion` (1,    NULL)
    --------------
     
    ERROR 2 (07777) at line 175: id_dest ne peut pas être NULL.
    --------------
    call `fusion` (1,    1   )
    --------------
     
    ERROR 3 (07777) at line 176: id_source = id_dest = 1, Impossible de transférer un client sur lui même.
    --------------
    call `fusion` (3,    1   )
    --------------
     
    ERROR 20 (07777) at line 177: Source : Client = 3 non présent dans table 'client'.
    --------------
    call `fusion` (1,    3   )
    --------------
     
    ERROR 21 (07777) at line 178: Destinataire : Client = 3 non présent dans table 'client'.
    --------------
    call `fusion` (2,    4   )
    --------------
     
    ERROR 22 (07777) at line 179: Source : Client = 2 non présent dans table 'tabone'.
    --------------
    call `fusion` (4,    1   )
    --------------
     
    ERROR 23 (07777) at line 180: Destinataire : Client = 1 non présent dans table 'tabtwo'.
    --------------
    call `fusion` (1,    2   )
    --------------
     
    --------------
    COMMIT
    --------------
     
    --------------
    SET AUTOCOMMIT = 1
    --------------
     
    Appuyez sur une touche pour continuer...
    Pour vérifier si la procédure stockée est correcte, vous devez tester le code retour !

    @+

  3. #3
    Membre éclairé Avatar de mioux
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Novembre 2005
    Messages
    368
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Finance

    Informations forums :
    Inscription : Novembre 2005
    Messages : 368
    Par défaut
    Ca marche pour les tests de conformité, mais dans ma fusion je vais avoir besoin d'affecter des variables, et de retourner une table avec une certaine quantité de données qui sont utilisées dans l'applicatif derrière.

    Il y a quelques petit traitements à opérer (par exemple, mettre à jour un user sur la nouvelle société, et en supprimer un sur l'ancienne société), vérifier le nombre de contrats transférés, et autres joyeusetés qui vont m'imposer de variabiliser quelques données, j'aimerais que quand je lance mon CALL, seul le dernier SELECT soit renvoyé au client.

    Derrière, il y a des développeurs PHP qui vont exploiter mes procédures stockées, et il ne faut pas que je leur envoie de données inutile (même si, j'espère qu'ils sauraient gérer ce surplus de données).

    Du coup, je cherche toujours à ne pas afficher d'autres résultats intermédiaires

  4. #4
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 952
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 952
    Par défaut
    Apparemment chaque SELECT est renvoyé.
    Il faut stocker les SELECT intermédiaire dans une table temporaire créée dans la procédure afin de n'écrire qu'un seul SELECT en fin de procédure qui lui sera renvoyé.

  5. #5
    Membre prolifique Avatar de Artemus24
    Homme Profil pro
    Agent secret au service du président Ulysses S. Grant !
    Inscrit en
    Février 2011
    Messages
    6 788
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Agent secret au service du président Ulysses S. Grant !
    Secteur : Finance

    Informations forums :
    Inscription : Février 2011
    Messages : 6 788
    Par défaut
    Salut mioux.

    Citation Envoyé par mioux
    Ca marche pour les tests de conformité, ...
    Je ne comprends pas trop ce que vous essayez de me dire.
    J'ai repris votre exemple et j'ai fait en sorte de tester la présence de la table et des colonnes.
    Si absence alors message d'anomalie qui doit être testé avec le code retour de la procédure stockée.

    Citation Envoyé par mioux
    mais dans ma fusion je vais avoir besoin d'affecter des variables,
    Quelles variables et pour quel usage ?

    Citation Envoyé par mioux
    ... et de retourner une table avec une certaine quantité de données qui sont utilisées dans l'applicatif derrière.
    Est-ce toujours la même table, c'est-à-dire ayant le même descriptif ?
    Une table non temporaire serait mieux parce que vous risquez de perdre son contenu.

    Que doit contenir votre table et pour quel usage ?

    Citation Envoyé par mioux
    Il y a quelques petit traitements à opérer (par exemple, mettre à jour un user sur la nouvelle société, et en supprimer un sur l'ancienne société), ...
    Rien de bien difficile à faire. Mais cela doit se faire lors de l'appel de la procédure ou sur un déclenchement particulier, genre une mise à jour d'une table ?

    Citation Envoyé par mioux
    ... vérifier le nombre de contrats transférés, et autres joyeusetés qui vont m'imposer de variabiliser quelques données, ...
    Etes-vous certain que cela doit se faire au travers d'une procédure stockée et non un traitement applicatif sous forme d'un script ?

    Citation Envoyé par mioux
    j'aimerais que quand je lance mon CALL, seul le dernier SELECT soit renvoyé au client.
    Normalement dans une procédure stockée, tout doit se faire par les paramètres.
    Ce qui s'affiche, ce sont les messages d'anomalies et rien d'autre.

    Que désirez-vous transmettre et sous quelle forme à votre client ?

    Citation Envoyé par mioux
    Du coup, je cherche toujours à ne pas afficher d'autres résultats intermédiaires
    Pour un select, pour ne pas voir son contenu s'afficher, vous avez trois solutions :
    1) il vous retourne une et une seule ligne et dans ce cas, vous utilisez le "into" pour affecter le résultat dans des variables locaux à la procédure stockée.
    2) faire le remplissage d'une table.
    3) utiliser un cursor, ce qui revient en quelque sorte à faire le cas 1).

    @+

  6. #6
    Membre éclairé Avatar de mioux
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Novembre 2005
    Messages
    368
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Finance

    Informations forums :
    Inscription : Novembre 2005
    Messages : 368
    Par défaut
    Citation Envoyé par Artemus24 Voir le message
    Salut mioux.
    Quelles variables et pour quel usage ?
    Ce sont des variables qui me permettent de transmettre des données depuis le client d'une société A vers un autre client d'une société B.
    Il y a plusieurs tables qui sont concernées (par exemple on déplace les coordonnées, on met à jour le mot de passe du nouveau client avec celui de l'ancien client...)

    Citation Envoyé par Artemus24 Voir le message
    Est-ce toujours la même table, c'est-à-dire ayant le même descriptif ?
    Une table non temporaire serait mieux parce que vous risquez de perdre son contenu.
    Dans le cas de la fusion (et je pense dans tous les autres cas, je n'ai pas encore étudié les autres scripts que j'ai à modifier), oui. Une fois la fusion terminée, j'ai besoin de renvoyer l'ID du nouvel administrateur, le nombre de contrats transférés, ou autres...

    Citation Envoyé par Artemus24 Voir le message
    Que doit contenir votre table et pour quel usage ?
    Ca dépendra du script (ce n'est que le premier d'une longue série).

    Citation Envoyé par Artemus24 Voir le message
    Rien de bien difficile à faire. Mais cela doit se faire lors de l'appel de la procédure ou sur un déclenchement particulier, genre une mise à jour d'une table ?
    Pareil, ça dépendra du script, mais dans tous les cas, on aura une SP par action complexe

    Citation Envoyé par Artemus24 Voir le message
    Etes-vous certain que cela doit se faire au travers d'une procédure stockée et non un traitement applicatif sous forme d'un script ?
    Les devs de la boite ayant tendance à modifier une partie du code mais pas le reste, on a préféré jouer la sécurité, et en passer un maximum par des SP (et le but était aussi d'accélérer les traitements par précompilation des SP, mais je me suis rendu compte que MySQL ne précompilait pas).

    Citation Envoyé par Artemus24 Voir le message
    Pour un select, pour ne pas voir son contenu s'afficher, vous avez trois solutions :
    1) il vous retourne une et une seule ligne et dans ce cas, vous utilisez le "into" pour affecter le résultat dans des variables locaux à la procédure stockée.
    2) faire le remplissage d'une table.
    3) utiliser un cursor, ce qui revient en quelque sorte à faire le cas 1).
    Je ne connaissait pas la syntaxe avec SELECT INTO variable (je viens de MsSQL à la base, et cette syntaxe, je l'utilisait essentiellement pour remplir des tables, pas des variables )

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Récupérer les mails Outlook dans une table Access
    Par zerrokooll dans le forum VBA Access
    Réponses: 79
    Dernier message: 07/07/2009, 14h22
  2. Réponses: 1
    Dernier message: 04/11/2007, 15h03
  3. Réponses: 4
    Dernier message: 28/03/2007, 13h47
  4. Réponses: 4
    Dernier message: 01/10/2006, 15h37
  5. Récupérer les données interbase dans une TStringGrid
    Par Ousse dans le forum Bases de données
    Réponses: 1
    Dernier message: 24/03/2005, 12h51

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo