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 Oracle Discussion :

Gestion des Tables d'Object


Sujet :

SQL Oracle

  1. #21
    Rédacteur


    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    7 171
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 7 171
    Points : 15 060
    Points
    15 060
    Billets dans le blog
    1
    Par défaut
    C'est que je fais déjà
    Methode d'un objet Disque:
    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
     
     Member Function Insert_Path(Path IN Varchar2) Return Repertoire is
      -- Recherche et insére une suite de répertoire dans l'arborescence
      RépertoireCourant	Repertoire; 
      Ref_RépertoireCourant	Ref Repertoire; 
      Ref_Disque		Ref Disque;
     
      Tampon	Varchar2(257);
      FindPath	Varchar2(257);
     
      PosBackSlash	Integer;
      IsInsert		Boolean; 
     
     Begin
      If Path is NULL or IsPath(Path)=False 
       Then 
         Raise_Application_Error(-20000,'Le nom de chemin '||Path||' est mal formé.');
      End If;
      Tampon:=Substr(Path,3+1);  -- Supprime le début du path 'A:\'
      Tampon:=Rtrim(Tampon,'\');  -- RemoveBackSlash
      RépertoireCourant:=SELF.Get_Root(); -- Démarre la lecture à partir du ROOT
      Ref_Disque:=Self.Get_Ref; -- Récupére un pointeur sur le disque courant
      IsInsert:=False;			-- Démarre en mode recherche
     
      if RépertoireCourant is NULL
        Then 
         Insert Into Repertoires R  -- Insére le root
           Values (Repertoire(IDRepertoires.NextVal,Ref_Disque,Path,'ROOT',NULL)) 
          Returning Value(R) Into RépertoireCourant;
      End IF;
     
      If Tampon is NULL		-- Path=Root
       Then Return(RépertoireCourant);
      End If; 
     
      Begin  -- Parcourt le chemin sous-répertoire par sous-répertoire.
      Loop
       PosBackSlash:=InStr(Tampon,'\',1);			-- Recherche la premiére occurence de '\'
        If PosBackSlash<>0 
        Then FindPath:=Substr(Tampon,1,PosBackSlash-1);	-- Extrait le répertoire courant sans le Backslash
             Tampon:=Substr(Tampon,PosBackSlash+1);		-- Supprime le répertoire courant avec le Backslash
        Else FindPath:=Tampon; -- C'est donc le dernier répertoire
       End IF; 
       Begin
       If IsInsert=False -- Si mode Recherche , recherche le dernier répertoire contenue dans Findpath
         Then
          Select value(R) Into RépertoireCourant from Repertoires R -- Recherche le fils de nom Findpath
          WHERE R.Nom=FindPath and DeRef(R.pere)=RépertoireCourant;
       End If;   
       Exception
        WHEN NO_DATA_FOUND 
         THEN  IsInsert:=True; -- On passe en mode création
       End;
     
       If IsInsert  -- Le dernier repertoire recherché n'existe pas.
        Then
         Insert Into Repertoires R -- Insére le répertoire courant
           Values (Repertoire(IDRepertoires.NextVal,Ref_Disque,FindPath,Path,RépertoireCourant.Get_Ref)) 
          Returning Value(R) Into RépertoireCourant;
       End If;
     
       If PosBackSlash=0 -- Il n'y a plus de sous répertoires, on sort de la boucle 
        Then Exit; 
       End IF; 
      End loop;
      End;
      Return( RépertoireCourant); -- Renvoie le dernier trouvé ou le dernier inséré
     End;
    C'est une ébauche et je ne suis pas certain que cela soit la bonne approche.
    Mais la gestion des arbre n'est pas aisée en sql si je ne me trompe...

  2. #22
    Membre expérimenté

    Profil pro
    Inscrit en
    Mai 2003
    Messages
    412
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mai 2003
    Messages : 412
    Points : 1 326
    Points
    1 326
    Par défaut
    Personnelement je pense que n'importe quel type d'approche est bon.

    Maintenant la gestion d'un arbre en pl n'est pas plus difficile qu'avec un autre language. Le tout est de bien penser l'algo avant.

    Maintenant apères avoir regardé ton code, je trouve cette ébauche un peu plus compliquée que si tu avais utilisé une bonne vieille table (mais ceci n'est que mon avis.)

    Ensuite certaines parties sont peut etre un peut trop recursive mais cela peut etre arrangé

    Maintenant question: Ou est ce que cela pose probleme dans ton code?
    Lenteur ou autre?

    Souhaites tu revoir une autre méthode (avec de bonnes vieilles table )

  3. #23
    Rédacteur


    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    7 171
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 7 171
    Points : 15 060
    Points
    15 060
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par helyos
    Ensuite certaines parties sont peut etre un peut trop recursive mais cela peut etre arrangé

    Maintenant question: Ou est ce que cela pose probleme dans ton code?
    Lenteur ou autre?
    Je n'utilise pas la récursivité.
    C'est plus un pb de lenteur.
    Mais la configuration des tables (pctfree,...) n'est pas gérée.
    Je vais regarder de ce coté là et utiliser dbms_profiler pour vérifier ce qui est lent.
    peut être une répétition de code et/ou de lecture de donnée.

    Citation Envoyé par helyos
    Souhaites tu revoir une autre méthode (avec de bonnes vieilles table )
    Je peux effectivement utiliser des tables relationnel en lieu et place de tables objets.

    Mais ma problématique est la suivante :
    trouver le + rapidement possible dans l'arborescence le point d'insertion d'un nouveau répertoire ( son pére).
    Si ce nouveau répertoire n'existe pas trouver le point d'insertion le plus proche ( création d'une 'branche' ).

    Je ne sais pas utiliser 'Connect by' pour ce type de requête, ie
    trouve-moi le ROWID du chemin ('C:\temp\rep1\zz\XX')

    Par contre pour l'affichage de l'arborescence 'Connect by' répond trés bien au besoin.

  4. #24
    Membre expérimenté

    Profil pro
    Inscrit en
    Mai 2003
    Messages
    412
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mai 2003
    Messages : 412
    Points : 1 326
    Points
    1 326
    Par défaut
    Oki je vois ce que tu veux dire
    Je vais regarder si je peux te faire une sorte d'algo qui ferait les recherches et insertion dans la table d'arbre (sur le principe de table normales ).

    Par contre je vois pas trop l'interet du pctfree, pctused et autre car dans ton cas c plus des inserts donc au niveau tuning ca changera pas grand chose ou alors tres peu.

  5. #25
    Membre expérimenté

    Profil pro
    Inscrit en
    Mai 2003
    Messages
    412
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mai 2003
    Messages : 412
    Points : 1 326
    Points
    1 326
    Par défaut
    Alors voila le code dont je t'ai parlé.

    Création des bonnes vieilles tables.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    create table T_PATH
    (
      PATH VARCHAR2(257),
      PERE ROWID
    );
     
    create table T_FILE
    (
      PATH     ROWID,
      FILENAME VARCHAR2(257)
    );
    Création des index

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    create index IDX1 on T_PATH (PATH,PERE);
    create index PATHIDX on T_PATH (PATH);
    create index PEREIDX on T_PATH (PERE);
    Ensuite création de mon petit package.

    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
    CREATE OR REPLACE PACKAGE BODY pathpack IS
     
      FUNCTION check_path(p_tampon VARCHAR2, p_pere ROWID DEFAULT NULL)
        RETURN ROWID IS
        TYPE cur_dyn IS REF CURSOR;
        curpere   cur_dyn;
        v_rowid   ROWID;
        v_requete VARCHAR2(500);
      BEGIN
        IF p_pere IS NULL THEN
          v_requete := 'SELECT ROWID FROM   t_path WHERE  pere IS NULL AND path =''' ||
                       REPLACE(p_tampon, '''', '''''') || '''';
        ELSE
          v_requete := 'SELECT ROWID FROM   t_path WHERE  pere =''' || p_pere ||
                       ''' AND path =''' || REPLACE(p_tampon, '''', '''''') || '''';
        END IF;
        --Comme il n'est cencé n'y avoir que 1 seul répertoire avec ce nom la à la racine pas 
        --besoin de boucle
        OPEN curpere FOR v_requete;
        FETCH curpere
          INTO v_rowid;
        CLOSE curpere;
        IF v_rowid IS NULL THEN
          --Le repertoire n'existe pas je l'ajoute
          INSERT INTO t_path
          VALUES
            (p_tampon, p_pere)
          RETURNING ROWID INTO v_rowid;
          COMMIT;
          RETURN v_rowid;
        ELSE
          --Le repertoire existe je renvoie son rowid
          RETURN v_rowid;
        END IF;
      END;
     
      PROCEDURE insertpath IS
        CURSOR cur_test IS
          SELECT * FROM dispatchobjet;
        tampon      VARCHAR2(257);
        v_rowidpere ROWID;
        v_temppath  VARCHAR2(257);
        v_date      DATE := SYSDATE;
      BEGIN
        FOR rec IN cur_test LOOP
          tampon := substr(lower(rec.pathnom), 3 + 1);
          tampon := rtrim(tampon, '\');
          --Si c que un repertoire
          IF instr(tampon, '\') = 0 AND rec.objettype = 'R' THEN
            v_rowidpere := check_path(tampon);
          ELSE
            --Si y a plusieur sous repertoire
            LOOP
              EXIT WHEN instr(tampon, '\') = 0;
              --On prend le premier repertoire
              v_temppath  := substr(tampon, 1, instr(tampon, '\') - 1);
              v_rowidpere := check_path(v_temppath, v_rowidpere);
              tampon      := substr(tampon, instr(tampon, '\') + 1);
            END LOOP;
            --on fini le dernier repertoire
            v_rowidpere := check_path(tampon, v_rowidpere);
            IF rec.objettype = 'F' THEN
              INSERT INTO t_file VALUES (v_rowidpere, rec.filenom);
              COMMIT;
            END IF;
          END IF;
          v_rowidpere := NULL;
        END LOOP;
        htp.prn((SYSDATE - v_date) * 1440);
      END;
     
    END pathpack;
    Donc tu remplis ta table intermediaire dispatchobjet.

    Puis tu lances la procédure insertpath.

    Je stocke directement les rowid pour la relation pere fils (je n'ai pas fait les contraintes)

    Il met 4 minutes pour 21544 lignes sur un P3 1ghz.

    Dis moi si ca t'aide ou pas?

  6. #26
    Rédacteur


    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    7 171
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 7 171
    Points : 15 060
    Points
    15 060
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par helyos
    Dis moi si ca t'aide ou pas?
    Je regarde ça.

    Le ROWID est persistant aprés un Import /Export ?
    Merci

  7. #27
    Membre expérimenté

    Profil pro
    Inscrit en
    Mai 2003
    Messages
    412
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mai 2003
    Messages : 412
    Points : 1 326
    Points
    1 326
    Par défaut
    Oula c'est une tres bonne question pour le rowid je vais faire des recherches.

  8. #28
    Rédacteur


    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    7 171
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 7 171
    Points : 15 060
    Points
    15 060
    Billets dans le blog
    1
    Par défaut
    Bonjour,
    Voici ce que j'ai trouvé sur Metalink.

    Merci a tous.

    Bug No. 3064929
    Filed 23-JUL-2003
    Updated 19-AUG-2003
    Product Oracle Server - Enterprise Edition V7
    Product Version 9.2.0.3.0
    Platform Generic
    Platform Version No Data
    Database Version 9.2.0.3.0
    Affects Platforms Generic
    Severity Severe Loss of Service
    Status Closed, not feasible to fix
    Base Bug N/A
    Fixed in Product Version No Data

    Problem statement:

    ORA-2332 CREATING AN INDEX ON A REF COLUMN IN 9.2.0.3

    *** 07/23/03 06:48 am ***
    TAR:
    ----
    3262208.999
    .
    PROBLEM:
    --------
    ORA-2332 error trying to create an index on a REF COLUMN in 9.2.0
    This same operation works succesfully in 9.0.1

    DIAGNOSTIC ANALYSIS:
    --------------------
    Reproduced in 9.2.0
    The index is created succesfully in 9.0.1.4

    WORKAROUND:
    -----------
    None

    RELATED BUGS:
    -------------
    BUG 2744943

    REPRODUCIBILITY:
    ----------------
    Every time in 9.2.0.x
    It works succesfully in 9.0.1.

    TEST CASE:
    ----------
    drop table tab_obj_Sections;
    drop table tab_obj_Departments;
    drop type typ_obj_Section;
    drop type typ_obj_Department;
    .
    CREATE TYPE typ_obj_Department is object
    (
    Code VARCHAR2(10),
    Nom VARCHAR2(50)
    ) NOT FINAL;
    /
    CREATE TABLE tab_obj_Departments OF typ_obj_Department
    (
    CONSTRAINT pk_Departments PRIMARY KEY(Code)
    ) OIDINDEX oid_Departments
    /
    CREATE TYPE typ_obj_Section is object
    (
    Code VARCHAR2(10),
    Nom VARCHAR2(50),
    RefDepartment REF typ_obj_Department
    ) NOT FINAL;
    /
    CREATE TABLE tab_obj_Sections OF typ_obj_Section
    (
    CONSTRAINT fk_Sections_Dept FOREIGN KEY(RefDepartment) REFERENCES
    tab_obj_Departments
    ) OIDINDEX oid_Sections
    /
    CREATE UNIQUE INDEX pk_Sections ON tab_obj_Sections (RefDepartment.Code)
    /

    This last statement reports this error in 9.2.0.1
    ORA-2332: cannot create index on attributes of this column
    but works fine in 9.0.1.4

    STACK TRACE:
    ------------
    NA
    .
    SUPPORTING INFORMATION:
    -----------------------
    24 HOUR CONTACT INFORMATION FOR P1 BUGS:
    ----------------------------------------
    DIAL-IN INFORMATION:
    --------------------

    IMPACT DATE:
    ------------
    After upgrade from 9.0.1 to 9.2 customer is not able to create this kind of
    indexes, so this problem is affecting seriously their environment.
    .
    *** 07/23/03 08:43 am *** (CHG: Sta-&gt;16 Asg-&gt;NEW OWNER)
    *** 07/24/03 01:55 am *** (CHG: Sta-&gt;11 Asg-&gt;NEW OWNER)
    *** 07/24/03 01:55 am ***
    *** 07/24/03 10:55 am *** (CHG: Asg-&gt;NEW OWNER)
    *** 07/24/03 10:55 am ***
    *** 08/01/03 06:12 am *** (CHG: Asg-&gt;NEW OWNER)
    *** 08/06/03 11:03 pm ***
    *** 08/06/03 11:04 pm *** (CHG: Sta-&gt;44)
    *** 08/19/03 03:12 am ***
    *** 08/19/03 03:14 am *** (CHG: Sta-&gt;84)
    *** 08/19/03 03:14 am ***
    The pk-based reference have packed representation. Thus we don't have the cloumn information for each attribute. As per base, this behavior is okay as we.
    are trying to create a index on the type attrbute (RefDepartment.Code).So ora-2332 is the right error message. The fact that it used to work in 9014 was an undesirable behavior.

    To resolve this bug, enhancement is required in the product. Closing this
    bug as not feasible to fix. File a seperate enhancement request.
    Raised Enhancement request for this BUG against Bug number 3104504.

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

Discussions similaires

  1. Gestion des tables avec PARTITION BY HASH
    Par popsmelove dans le forum Requêtes
    Réponses: 8
    Dernier message: 23/05/2008, 09h49
  2. gestion des tables lier
    Par poxvx dans le forum Access
    Réponses: 2
    Dernier message: 11/12/2007, 16h04
  3. Gestion des tables partionnées
    Par marvelromy dans le forum Administration
    Réponses: 24
    Dernier message: 05/12/2007, 15h33
  4. Base fractionnée : gestion des tables liées
    Par hannii dans le forum Access
    Réponses: 5
    Dernier message: 26/02/2007, 11h02
  5. Réponses: 3
    Dernier message: 18/01/2007, 16h25

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