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

PL/SQL Oracle Discussion :

trigger d'une bd vers une autre bd


Sujet :

PL/SQL Oracle

  1. #21
    Débutant
    Inscrit en
    Février 2003
    Messages
    54
    Détails du profil
    Informations forums :
    Inscription : Février 2003
    Messages : 54
    Points : 35
    Points
    35
    Par défaut
    je copie colle la procédure qu'un collègue m'a donné et qui m'a permis de résoudre le problème :

    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
     QUICK START GUIDE: 
    Windows NT - Generic Connectivity using ODBC
     
     
    Purpose
    -------
     
    This document describes the steps to be performed when configuring Generic 
    Connectivity on Windows NT. It is not intended to replace the Oracle8i 
    Administrators Guide. Please refer to the Oracle8i Administrators Guide for 
    more detailed information.
     
     
    What Is Generic Connectivity?
    -----------------------------
     
    Generic connectivity is intended for low-end data integration solutions 
    requiring the ad hoc query capability to connect from Oracle8i to non-Oracle 
    database systems. Generic connectivity is enabled by Oracle Heterogeneous 
    Services, allowing you to connect to non-Oracle systems with improved 
    performance and throughput.
     
    Generic connectivity is implemented as a Heterogeneous Services ODBC agent. An 
    ODBC agent is included as part of your Oracle8i system. Be sure to use the 
    agent shipped with your particular Oracle system and installed in the same 
    $ORACLE_HOME. 
     
     
    Generic Connectivity Architecture
    ---------------------------------
     
    To access the non-Oracle data store using generic connectivity, the agent works
     
    with an ODBC driver. Oracle8i provides support for the ODBC driver interface. 
    The driver that you use must be on the same machine as the agent. The non-Oracle
     
    data stores can reside on the same machine as Oracle8i or a different machine. 
     
     
    Installation Steps
    ------------------
     
    1) Configure an ODBC system data source for the target datastore. Use an ODBC 
       client application or ODBC test to verify connectivity to the target 
       datastore.
     
     
    2) Make sure the following entries are in the tnsnames.ora and listener.ora.
     
    TNSNAMES.ORA
     
    hsmsql =
      (DESCRIPTION =
        (ADDRESS_LIST =
          (ADDRESS = (PROTOCOL = tcp)(host=winhost)(port=1521))
        )
        (CONNECT_DATA =
          (SID = msql)      <== needs to match the sid in listener.ora.
        )
      (HS=OK)               <== HS clause goes in the description.
      )
     
     
    LISTENER.ORA
     
    LISTENER =
      (DESCRIPTION_LIST =
        (DESCRIPTION =
          (ADDRESS_LIST =
            (ADDRESS = (PROTOCOL = TCP)(HOST = winhost)(PORT = 1521))
          )
        )
     
    SID_LIST_LISTENER =
      (SID_LIST =
        (SID_DESC =
          (SID_NAME = msql)          <== needs to match the sid in tnsnames.ora
          (ORACLE_HOME = E:\Ora816)
          (PROGRAM = hsodbc)         <== hsodbc is the executable       
        )
      )
     
     
    4) Start the listener. 
       Run "lsnrctl services" to verify that you now have a service handler for the
     
       hsmsql sid.
       ==============================================================
       LSNRCTL> services
       Connecting to (address=(protocol=tcp)(host=winhost)(port=1521))
       Services Summary...
         msql          has 1 service handler(s)     
           DEDICATED SERVER established:0 refused:0
             LOCAL SERVER
       The command completed successfully
       ==============================================================
     
     
    5) Create the Initialization file.
     
       You must create and customize an initialization file for your generic 
       connectivity agent. Oracle supplies a sample initialization file named 
       "inithsodbc.ora" which is stored in the $ORACLE_HOME\hs\admin directory.
     
       To create an initialization file, copy the appropriate sample file and rename
     
       the file to initHS_SID.ora. In this example the sid noted in the listener and
     
       tnsnames is msql so our new initialization file is called initmsql.ora.
     
    6) Make sure the following noted entries are in the initmsql.ora located in 
       $ORACLE_HOME/hs/admin:
     
    INITMSQL.ORA
     
    # HS init parameters
    #
    HS_FDS_CONNECT_INFO = msql            <= odbc data_source_name
    HS_FDS_TRACE_LEVEL = 0               <= trace levels 0 - 4  (4 is verbose)
    HS_FDS_TRACE_FILE_NAME = hsmsql.trc  <= trace file name
    #
    # Environment variables required for the non-Oracle system
    #
    #set <envvar>=<value>
     
     
    7) Create a database link to access the target database. Be sure to use the 
       appropriate quotes as noted below.
     
    SQL> create database link msql
    SQL> connect to "user" identified by "password" <= user/pwd on the target DB
    SQL> using  'hsmsql';
     
    8) To test, run a simple query of a known table on the target datastore.
     
    SQL> select * from employee@msql;
     
         empid firstname       lastname        department job
    ---------- --------------- --------------- ---------- ---
         10000 Jerry           Rice            Networking CDW
         10001 John            Lund            Sales      WNV
         10002 Julie           Reynolds        Relations  NPI
         10003 Peter           Loren           Relations  NPO
         10004 Eric            Michael         Telemarket PHN
         10005 Ian             Alexander       Sales      WND
         10006 Ed              Smith           Networking CDG
         10007 Mike            Seibt           Coordinate IDW
     
    11 rows selected.

    j'ai fais ce ceci il ya 15 jours maintenant, et je ne sais plus exactement, mais il y a une histoire de services à ne pas oublier de redémarrer

    Voilà, en tout cas, c'est résolvable

  2. #22
    Membre habitué Avatar de johnkro
    Étudiant
    Inscrit en
    Juin 2006
    Messages
    276
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2006
    Messages : 276
    Points : 187
    Points
    187
    Par défaut
    Bonjour tout le monde,

    Je pense avoir le même genre de problèmes que clément a eu, mais je ne connais rien au trigger. En fait je dois copier quotidiennement des données d'une base Oracle distante dans ma base locale MySQL. Mon problème est qu'il y a beaucoup de données à copier (4.000 lignes environ par jour), j'arrive à en copier 2.000 de la façon suivante (2.000 sur 4.000 car le temps d'exécution maximal est dépassé, je ne peux pas le modifier, car je n'ai pas les droits, et de plus, j'aimerais optimiser mon script) :

    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
    $c=ocilogon($user,$password,$database);
    include ('date_format_julien.php');
    $resultat=ociparse($c,"SELECT * FROM ops\$icb2g.HISTORIQUE1 WHERE DDATE='$jour_format_julien'");
    ociexecute($resultat,OCI_DEFAULT);
    include ('connexion_pems.ini');
    $id_faute1=1;$id_faute2=1;$id_faute3=1;$id_faute4=1;
     
    while (ocifetch($resultat)){
    echo $i;echo '<br>';
    	$DDATE=ociresult($resultat,1);
    	$SYSCAA=ociresult($resultat,2);
    	$GPS=ociresult($resultat,3);
    	$SGTQS=ociresult($resultat,4);
    	$NUMES=ociresult($resultat,5);
    	$NBR=ociresult($resultat,6);
     
    	//On interroge la base locale MySQL locale pour ne sélectionner  
    	$requete_seuil = "SELECT * FROM seuil WHERE Mess='$NUMES' AND Priorite!=''";
    	$resultat_seuil = mysql_query($requete_seuil) or die ("requete incorrecte au niveau de la recuperation de donnees a partir de la table seuil");
    	$row_seuil = mysql_fetch_array($resultat_seuil);
    	$Seuil=$row_seuil['Seuil'];
    	$Priorite=$row_seuil['Priorite'];	
    	$Libelle=$row_seuil['Libelle'];
    	$FicheAQF=$row_seuil['FicheAQF'];
    	$Position=$row_seuil['Position'];
    	$Domaine=$row_seuil['Domaine'];
    	//Comparaison du seuil entre la table Historique et la table Seuil
    	if ($NBR > $Seuil){		
    		//Mise a jour des donnees dans les tables volum_faute1,2,3,4
    		if ($Priorite=='Faute1' OR $Priorite=='faute1') {				
    			$sql = "INSERT INTO volum_faute1 (ID,Messages,NB,SGTQS,Seuil,Domaine,Priorite,Libelle,FicheAQF,Position) 
    				VALUES ('$id_faute1','$NUMES','$NBR','$SGTQS','$Seuil','$Domaine','$Priorite','$Libelle','$FicheAQF','$Position')";
    			$res = mysql_query($sql) or die ("requete incorrecte au niveau de l'ajout de donnees dans volum_faute1");
    			$id_faute1=$id_faute1+1;
    		}
    		if ($Priorite=='Faute2' OR $Priorite=='faute2') {
    			$sql = "INSERT INTO volum_faute2 (ID,Messages,NB,SGTQS,Seuil,Domaine,Priorite,Libelle,FicheAQF,Position) 
    				VALUES ('$id_faute2','$NUMES','$NBR','$SGTQS','$Seuil','$Domaine','$Priorite','$Libelle','$FicheAQF','$Position')";
    			$res = mysql_query($sql) or die ("requete incorrecte au niveau de l'ajout de donnees dans volum_faute2");
    			$id_faute2=$id_faute2+1;
    		}
    		if ($Priorite=='Faute3' OR $Priorite=='faute3') {
    			$sql = "INSERT INTO volum_faute3 (ID,Messages,NB,SGTQS,Seuil,Domaine,Priorite,Libelle,FicheAQF,Position) 
    				VALUES ('$id_faute3','$NUMES','$NBR','$SGTQS','$Seuil','$Domaine','$Priorite','$Libelle','$FicheAQF','$Position')";
    			$res = mysql_query($sql) or die ("requete incorrecte au niveau de l'ajout de donnees dans volum_faute3");
    			$id_faute3=$id_faute3+1;
    		}
    		if ($Priorite=='Faute4' OR $Priorite=='faute4') {
    			$sql = "INSERT INTO volum_faute4 (ID,Messages,NB,SGTQS,Seuil,Domaine,Priorite,Libelle,FicheAQF,Position) 
    				VALUES ('$id_faute4','$NUMES','$NBR','$SGTQS','$Seuil','$Domaine','$Priorite','$Libelle','$FicheAQF','$Position')";
    			$res = mysql_query($sql) or die ("requete incorrecte au niveau de l'ajout de donnees dans volum_faute4");
    			$id_faute4=$id_faute4+1;
    		}
    	}
    }

    Ensuite, j'ai essayé de faire une jointure entre mes 2 tables pour faire diminuer ce temps d'exécution. Celle-ci me permettrait de faire un tri données important et donc faire moins de tour de boucle, mais je n'arrive pas à la mettre en oeuvre. Si j'y arrivais, cela pourrait suffir à passer en dessous des 30 secondes, mais cela est-il possible?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    $c=ocilogon($user,$password,$database);
    include ('date_format_julien.php');
    include ('connexion_pems.ini');
    $resultat=ociparse($c,"SELECT * FROM ops\$icb2g.HISTORIQUE1 INNER JOIN seuil ON ops\$icb2g.HISTORIQUE1.NUMES=seuil.Mess WHERE DDATE='$jour_format_julien'");
    ociexecute($resultat,OCI_DEFAULT);

    La jointure est-elle possible entre mes 2 tables Oracle et MySQL? Si oui, vaut-il mieux faire une jointure ou serait-il bien d'utiliser les triggers? S'il vaut mieux utiliser les triggers, comment pourrais-je le mettre en oeuvre? Il faudrait que dans une première partie je sélectionne et dans une seconde j'inserts?

    La jointure serait beaucoup plus facile à mettre en oeuvre pour moi, donc s'il n'y a pas une grosse différence de performance entre ces 2 solutions, une aide sur les jointures pourrait me suffir...

    Merci d'avance pour vos aides
    L'eau est un liquide si corrosif, qu'une seule goutte suffit pour troubler le pastis.

  3. #23
    Membre habitué Avatar de johnkro
    Étudiant
    Inscrit en
    Juin 2006
    Messages
    276
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2006
    Messages : 276
    Points : 187
    Points
    187
    Par défaut
    Arf pas de réponse, je pensais bien trouver une solution sur ce post...
    L'eau est un liquide si corrosif, qu'une seule goutte suffit pour troubler le pastis.

  4. #24
    Membre à l'essai
    Inscrit en
    Avril 2007
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 14
    Points : 12
    Points
    12
    Par défaut
    Citation Envoyé par jlucch Voir le message
    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
     
    connect user2/XXX@instance2
    drop database link INSTANCE1 ;
    create database link INSTANCE1 CONNECT TO user1 identified by XXX;
     
    conn user1/user1@instance1
    create table T1 (n number);
     
    conn user2/user2@instance2
    create table T2 (n number);
    desc user1.T1@instance1;
    CREATE oR REPLACE TRIGGER trg_T2 before insert on T2
    for each row
    BEGIN
    insert into user1.T1@instance values (:new.n);
    when others then
       RAISE_APPLICATION_ERROR(-20000,'Erreur  :'||substr(sqlerrm,1,150));
     END;
    /
     
    insert  into user2.T2 values (1);
    commit;
    select count(*) from  user1.T1@instance1;
    Bonjour,

    ton script est très intéressent et j'essaye depuis tout à l'heure de travailler avec mais le problème je veux savoir user1 c'est quoi, instance 1 c'est quoi (est ce que c'est les tables ou autre ...)

    Merci pour la réponse

  5. #25
    Futur Membre du Club
    Inscrit en
    Mai 2009
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 5
    Points : 7
    Points
    7
    Par défaut Trigger d'une base vers une autre mysql
    Salut à tous j'ai le même problème mais moi c'est avec mysql. Je vous explique j'ai une table users1 dans une bd1 et je souhaite qu'à chaque insertion ou mis à jour de cette table que ma table users2 dans la base bd2 soit mis à jour merci de me donner un coup de main.

+ Répondre à la discussion
Cette discussion est résolue.
Page 2 sur 2 PremièrePremière 12

Discussions similaires

  1. [VB.Net] Comment copier une DataRow d'une table vers une autre ?
    Par YLF dans le forum Accès aux données
    Réponses: 7
    Dernier message: 05/09/2012, 23h23
  2. [C#] transferer une ligne d'une datagrid vers une autre datagrid
    Par nassimmm dans le forum Windows Forms
    Réponses: 4
    Dernier message: 11/08/2006, 09h38
  3. copier une ligne d'une table vers une autre
    Par Adren dans le forum Langage SQL
    Réponses: 5
    Dernier message: 08/08/2006, 11h54
  4. copier une partie d'une image vers une autre
    Par gregcat dans le forum Langage
    Réponses: 1
    Dernier message: 14/04/2006, 13h39
  5. [VB.NET] Copie d'une table d'une DB vers une autre
    Par SergeF dans le forum Windows Forms
    Réponses: 9
    Dernier message: 20/11/2004, 09h54

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