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 :

adapter procédure stockée sql server à mysql


Sujet :

SQL Procédural MySQL

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 20
    Points : 16
    Points
    16
    Par défaut adapter procédure stockée sql server à mysql
    Bonjour.
    Je suis stagiare au sein d'une entreprise de production mécanique et mon projet de stage consiste à migrer leur site intranet gérant la maintenance de premier niveau des machines outils, de IIS+sql server vers une solution open source qui est un LAMP+mysql.
    N'étant pas en formation de développeur mais de gestionnaire de ressource informatique, j'ai un peu de mal (enfin beaucoup) à adapter les procédures stockées établies sous sql server sur MySql.
    Mon souci premier est le fait que MySql ne prenne pas encore en charge les curseurs de type "scroll cursor".
    Auriez-vous une parade pour arriver à recréer une procédure sous MySql donnant le même résultat?

    Voici la procédure que je dois adapter:
    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
    if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[action_ensemble]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
    drop procedure [dbo].[action_ensemble]
    GO
     
    SET QUOTED_IDENTIFIER ON 
    GO
    SET ANSI_NULLS OFF 
    GO
     
    CREATE PROCEDURE action_ensemble
     
    AS
     
     
    DECLARE @machine char(5)
    DECLARE @tache char(100)
    DECLARE @thisdate datetime
    DECLARE @date_dep datetime
    DECLARE @date_fin datetime
    DECLARE @temp char(10)
     
    DECLARE @secteur char(25)
    DECLARE @period int
    DECLARE @sql char(255)
     
    DECLARE C_tache_machine SCROLL CURSOR FOR
     
    SELECT nom_machine,nom_tache FROM t_tache_machine  WHERE (t_tache_machine.periode_tache <> 9999 AND t_tache_machine.periode_tache <> 999 ) ORDER by nom_machine
     
    OPEN C_tache_machine
     
    FETCH NEXT FROM C_tache_machine INTO @machine,@tache
     
    WHILE @@FETCH_STATUS = 0
    BEGIN
     
     
    DECLARE c_date SCROLL CURSOR FOR
    SELECT Date_prev FROM T_data WHERE nom_machine =RTRIM(@machine)  AND nom_tache= RTRIM(@tache)  AND date_prev=(select max(date_prev) FROM T_data WHERE nom_machine =  + RTRIM(@machine)   AND nom_tache=  RTRIM(@tache) )
     
     
    DECLARE c_donne SCROLL CURSOR FOR
    SELECT nom_machine,secteur_machine,nom_tache,periode_tache FROM T_tache_machine WHERE nom_machine =@machine AND nom_tache=@tache AND  (t_tache_machine.periode_tache <> 9999 AND t_tache_machine.periode_tache <> 999 )
     
    OPEN C_date
    OPEN C_donne
     
    FETCH FIRST FROM C_date INTO @thisdate
    FETCH FIRST FROM C_donne INTO @machine,@secteur,@tache,@period
    SELECT @thisdate
     
    IF DATEDIFF(day,@thisdate,GETDATE()) > 31 OR @@FETCH_STATUS <> 0
    BEGIN
    	SELECT @date_dep = DATEADD(day,- DATEPART(weekday,GETDATE()) + 8,GETDATE())
    	SELECT @date_dep = CONVERT(datetime,CONVERT(Varchar(2),DATEPART(day,@date_dep)) + '/' + CONVERT(Varchar(2),DATEPART(mm,@date_dep)) + '/' + CONVERT(Varchar(4),DATEPART(yy,@date_dep)))
    	SELECT @date_dep
    END 
    ELSE 
    BEGIN
    	SELECT @date_dep = ISNULL(@thisdate,CONVERT(datetime,CONVERT(Varchar(2),DATEPART(day,DATEADD(day,- DATEPART(weekday,GETDATE()) + 8,GETDATE()))) + '/' + CONVERT(Varchar(2),DATEPART(mm,DATEADD(day,- DATEPART(weekday,GETDATE()) + 8,GETDATE()))) + '/' + CONVERT(Varchar(4),DATEPART(yy,DATEADD(day,- DATEPART(weekday,GETDATE()) + 8,GETDATE())))))
    END
     
     
    SELECT @date_fin=DATEADD(day,- DATEPART(weekday,GETDATE()) + 14,GETDATE())
     
    WHILE (SELECT @date_dep )< @Date_fin 
    BEGIN
     
     
     
    IF (SELECT DATEPART(dw,@date_dep))<6 
    BEGIN 
    INSERT T_data (nom_machine,secteur_machine,nom_tache,date_prev,periodicite_tache) 
    	VALUES (@machine,@secteur,@tache,@date_dep,@period)
    END 
    SELECT @date_dep = DATEADD(hh,@period * 4 ,@date_dep)
    END
     
     
    DEALLOCATE C_donne
    DEALLOCATE C_date
    FETCH NEXT FROM C_tache_machine INTO @machine,@tache
    END
     
     
    DEALLOCATE C_tache_machine
    GO
    SET QUOTED_IDENTIFIER OFF 
    GO
    SET ANSI_NULLS ON 
    GO
    Merci d'avance pour l'aide que vous pourrez m'apporter.

    PS: j'ai utilisé tsql2mysql ce qui m'a bien aidé pour le début, mais il n'a pas tout adapté.

  2. #2
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 20
    Points : 16
    Points
    16
    Par défaut
    Bonjour!!
    J'avance petit à petit de mon côté.
    Si j'ai bien compris, le curseur de type "scroll cursor" permet de définir comment la "scrutation" de celui ci doit se comporter. Ceci est défini par la "valeur" que prend le FETCH. Dans mon cas FETCH est défini sur FIRST donc je suppose que seule la première ligne du retour de mon curseur sera "retenu".
    Pourriez-vous me confirmer si mes hypothèses sont correctes?

    Merci d'avance.

    PS: Veuillez m'excuser des erreurs de langage, je n'ai fais que très peu de SQl lors de ma formation.

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 20
    Points : 16
    Points
    16
    Par défaut
    Bonjour!!
    Après d'ENORMES prise de têtes, j'ai enfin réussi (enfin presque) à adapter ma procédure stocké Sql à MySql.
    La seule erreur que me renvoie le compiler Sql de Sql maestro for MySql vient du dernier "END;" tout à la fin de ma procédure et je n'arrive pas à la résoudre.
    Quelqu'un aurai une idée?

    Voici ce que ça donne:

    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
     
     
     
    DELIMITER |
     
    use maintenance1 |
    SET SQL_MODE = ANSI |
    DROP PROCEDURE IF EXISTS action_ensemble|
     
    CREATE DEFINER = 'maintenance'@'localhost' PROCEDURE `action_ensemble` ()
    BEGIN
    	DECLARE var_machine char( 5);
    	DECLARE var_tache char( 100);
    	DECLARE var_thisdate datetime;
    	DECLARE var_date_dep datetime;
    	DECLARE var_date_fin datetime;
    	DECLARE var_temp char( 10);
    	DECLARE var_secteur char( 25);
    	DECLARE var_period int;
    	DECLARE fetch_status INTEGER default 0;
    	DECLARE var_sql char( 255);
     
    	DECLARE C_tache_machine CURSOR FOR
    		SELECT nom_machine, nom_tache
    		FROM t_tache_machine
    		WHERE ( t_tache_machine.periode_tache <> 9999 
    		AND t_tache_machine.periode_tache <> 999)
    		ORDER BY nom_machine;
     
    	DECLARE C_date CURSOR FOR
    		SELECT Date_prev FROM T_data WHERE nom_machine =RTRIM(var_machine) 
    		AND nom_tache= RTRIM(var_tache)  AND date_prev=(select max(date_prev) 
    		FROM T_data WHERE nom_machine =  + RTRIM(var_machine) 
    		AND nom_tache=  RTRIM(var_tache) ) limit 1;
     
    	DECLARE C_donne CURSOR FOR
    		SELECT nom_machine, secteur_machine, nom_tache, periode_tache
    		FROM T_tache_machine
    		WHERE nom_machine= var_machine AND nom_tache= var_tache 
    		AND(t_tache_machine.periode_tache<> 9999 
    		AND t_tache_machine.periode_tache<> 999) limit 1;
     
     
     
     
      OPEN C_tache_machine;
      FETCH	NEXT FROM C_tache_machine INTO var_machine, var_tache;
      WHILE FETCH_STATUS= 0 DO
     
      OPEN C_date;
      OPEN C_donne;
     
      FETCH FROM C_date INTO var_thisdate;
      FETCH FROM C_donne INTO var_machine, var_secteur, var_tache, var_period;
      SELECT var_thisdate;
     
      IF DATEDIFF(var_thisdate, Now())> 31 OR FETCH_STATUS<> 0 
    	THEN
    		SELECT var_date_dep = ADDDATE(curdate(), - DATE_FORMAT (curdate(), '%w') + 8);
    		SELECT DATE_FORMAT(var_date_dep, "%d/%m/%Y") as var_date_dep;
    		SELECT var_date_dep;
    	ELSE
    		SELECT var_date_dep= COALESCE(var_thisdate, (date_format((adddate(curdate(), (-date_format(curdate(), "%w")+8))), "%d/%m/%Y")));
     
      END IF;
     
    SELECT var_date_fin= ADDDATE(curdate(), (- DATE_FORMAT (curdate(), '%w') + 14));
    	WHILE (select var_date_dep) < var_date_fin DO
    		IF (SELECT DATE_FORMAT(var_date_dep, '%w')) < 6 
    			THEN
    				INSERT T_data (nom_machine, secteur_machine, nom_tache, date_prev, periodicite_tache) 
    				VALUES (var_machine, var_secteur, var_tache, var_date_dep, var_period);
    		END IF;
    		SELECT var_date_dep= ADDTIME (var_date_dep, var_period * 4);
    	END WHILE;
    	CLOSE C_donne;
    	CLOSE C_date;
    	FETCH NEXT FROM C_tache_machine INTO var_machine, var_tache;
    	END WHILE;
    	CLOSE C_tache_machine;
    END|
     
    DELIMITER ;
    Merci d'avance.

Discussions similaires

  1. Problème LIKE Procédure stocké SQL Server 2000
    Par Pilhole dans le forum MS SQL Server
    Réponses: 8
    Dernier message: 18/02/2008, 09h24
  2. Procédures stockées SQL Server, récupération sous Delphi
    Par rophi dans le forum Bases de données
    Réponses: 10
    Dernier message: 03/12/2007, 14h48
  3. Réponses: 1
    Dernier message: 04/03/2007, 15h40
  4. [procédure stockée][SQL server]Extraction, réinsertion
    Par caelum dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 14/02/2006, 07h59
  5. Procédures stockées SQL Server compatibles avec MySQL ?
    Par Nen'S dans le forum SQL Procédural
    Réponses: 2
    Dernier message: 24/01/2006, 19h18

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