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 :

Clé primaire de type GUID et type date


Sujet :

SQL Oracle

  1. #41
    Rédacteur
    Avatar de Vincent Rogier
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    2 373
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 2 373
    Par défaut
    Tu ne fait pas le même test !!

    Tu utilises dbms_utility.get_time depuis le serveur et non pas une fonction locale au client comme clock() ou autres !

    Cela ne reflète donc pas le même temps. Ne comparons pas de pommes et des poires....

    Refais ton test avec un clock() local au client et donnes nous les résultats.
    Vincent Rogier.

    Rubrique ORACLE : Accueil - Forum - Tutoriels - FAQ - Livres - Blog

    Vous voulez contribuer à la rubrique Oracle ? Contactez la rubrique !

    OCILIB (C Driver for Oracle)

    Librairie C Open Source multi-plateformes pour accéder et manipuler des bases de données Oracle

  2. #42
    Rédacteur
    Avatar de Vincent Rogier
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    2 373
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 2 373
    Par défaut
    J'ai repris ton code pro*c et j'ai remplacé les get_time() par des clock() et voila le résultat :

    Starting test with pro*c..
    TEST_INSERT_1 : elapsed time (t1) 31.196000 secs
    TEST_INSERT_2 : elapsed time (t2) 22.180000 secs

    DIFF (t1-t2) = 9.016000 secs
    Humm.... Pareil que sql*plus et ocilib...

    Donc, entre le temps de process pur serveur et le temps total coté application, les deux méthodes montrent une différence très signifiante !

    Mais au final, pour le client, la solution guid est toujours plus long de 40 %...
    Vincent Rogier.

    Rubrique ORACLE : Accueil - Forum - Tutoriels - FAQ - Livres - Blog

    Vous voulez contribuer à la rubrique Oracle ? Contactez la rubrique !

    OCILIB (C Driver for Oracle)

    Librairie C Open Source multi-plateformes pour accéder et manipuler des bases de données Oracle

  3. #43
    Expert confirmé Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5 611
    Par défaut
    Citation Envoyé par vicenzo Voir le message
    J'ai repris ton code pro*c et j'ai remplacé les get_time() par des clock() et voila le résultat :

    Humm.... Pareil que sql*plus et ocilib...

    Donc, entre le temps de process pur serveur et le temps total coté application, les deux méthodes montrent une différence très signifiante !

    Mais au final, pour le client, la solution guid est toujours plus long de 40 %...
    Vicenzo,
    La plate-forme où je teste (Aix) affiche un beau 0 pour clock(). J'ai utilisé time() et difftime() et j'ai le même resultat. J'ai l'impression que tu teste sur une plate-forme windows, n'est pas vrai ?

  4. #44
    Rédacteur
    Avatar de Vincent Rogier
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    2 373
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 2 373
    Par défaut
    Clock() est une fonction ISO C ...

    J'ai fait le test sous windows mais j'ai toujours utilisé clock() sous linux sans soucis....

    T'es sur que ta demo s'est connecté à Oracle ?

    Si tu y tiens, je peux faire le test sur une opensuse....
    Vincent Rogier.

    Rubrique ORACLE : Accueil - Forum - Tutoriels - FAQ - Livres - Blog

    Vous voulez contribuer à la rubrique Oracle ? Contactez la rubrique !

    OCILIB (C Driver for Oracle)

    Librairie C Open Source multi-plateformes pour accéder et manipuler des bases de données Oracle

  5. #45
    Expert confirmé Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5 611
    Par défaut
    Citation Envoyé par vicenzo Voir le message
    Clock() est une fonction ISO C ...
    J'avais pas des doutes. Je te dit que sur ma plateforme de test le t1 et le t2 sont zéro ce qui donne t2-t1 égal à 0.

    Voila les résultats avec time
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    TEST_INSERT_1 : elasped time (t1)  23.000000 secs
    TEST_INSERT_2 : elasped time (t2) 30.000000 secs
     
    DIFF (t1-t2) = -7.000000
    extrait du code
    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
     
      time(&time1);
       EXEC SQL EXECUTE
         BEGIN
           TEST_INSERT_1;
         END;
       END-EXEC;
       time(&time2);
       dif1 = difftime (time2,time1);
       printf("TEST_INSERT_1 : elasped time (t1)  %f secs\n", dif1);
     
       time(&time3);
       EXEC SQL EXECUTE
         BEGIN
           TEST_INSERT_2;
         END;
       END-EXEC;
       time(&time4);
       dif2 = difftime (time4,time3);
       printf("TEST_INSERT_2 : elasped time (t2) %f secs\n", dif2);
     
       printf("\nDIFF (t1-t2) = %f secs", dif1-dif2);
    Peut tu faire en desc de ta table TEST_PK_1 ?

  6. #46
    Rédacteur
    Avatar de Vincent Rogier
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    2 373
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 2 373
    Par défaut
    Résultat avec ID dans test_pk_1 défini comme VARCHAR2(40) :


    TEST_INSERT_1 : elasped time (t1) 33.000000 secs
    TEST_INSERT_2 : elasped time (t2) 25.000000 secs

    DIFF (t1-t2) = 8.000000
    Résultat avec ID dans test_pk_1 défini comme RAW(40) :

    TEST_INSERT_1 : elasped time (t1) 29.000000 secs
    TEST_INSERT_2 : elasped time (t2) 24.000000 secs

    DIFF (t1-t2) = 4.000000
    C'est mieux en passant par des RAW que par des varchar2, mais ca reste toujours plus lent sur ma config....... Mais faut voir si l'API utilisée par Lucas Panny permet de mapper les raw sur des string...
    Vincent Rogier.

    Rubrique ORACLE : Accueil - Forum - Tutoriels - FAQ - Livres - Blog

    Vous voulez contribuer à la rubrique Oracle ? Contactez la rubrique !

    OCILIB (C Driver for Oracle)

    Librairie C Open Source multi-plateformes pour accéder et manipuler des bases de données Oracle

  7. #47
    Lucas Panny
    Invité(e)
    Par défaut
    Citation Envoyé par vicenzo Voir le message
    ....... Mais faut voir si l'API utilisée par Lucas Panny permet de mapper les raw sur des string...
    Tu demandes peut-être ma fonction pour générer un GUID, la voici (en 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
    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
    CREATE OR REPLACE  PACKAGE PANNY."PACK_UUID"  IS
     
      SUBTYPE guid_t IS RAW (16);
     
      SUBTYPE generated_guid_t IS varchar2 (38);
     
      c_mask CONSTANT generated_guid_t := '{________-____-____-____-____________}';
     
      FUNCTION is_generated_guid (string_in IN varchar2)
      RETURN BOOLEAN;
     
      FUNCTION generated_guid (guid_in IN varchar2)
      RETURN generated_guid_t;
     
      FUNCTION generated_guid
      RETURN generated_guid_t;
     
     
      SUBTYPE test IS generated_guid_t;
     
     
    END PACK_UUID;
    /
    CREATE OR REPLACE  PACKAGE BODY PANNY."PACK_UUID"  IS
     
    FUNCTION is_generated_guid (string_in IN varchar2)
     
    RETURN BOOLEAN
     
    IS
     
    BEGIN
     
    RETURN string_in LIKE c_mask;
     
    END is_generated_guid;
     
    FUNCTION generated_guid (guid_in IN varchar2)
     
    RETURN generated_guid_t
     
    IS
     
    BEGIN
     
     
     
    IF is_generated_guid (guid_in)
     
    THEN
     
    RETURN guid_in;
     
     
     
    ELSIF is_generated_guid ('{' || guid_in || '}')
     
    THEN
     
    RETURN generated_guid ('{' || guid_in || '}');
     
    ELSE
     
    RETURN '{'
     
    || SUBSTR (guid_in, 1, 8)
     
    || '-'
     
    || SUBSTR (guid_in, 9, 4)
     
    || '-'
     
    || SUBSTR (guid_in, 13, 4)
     
    || '-'
     
    || SUBSTR (guid_in, 17, 4)
     
    || '-'
     
    || SUBSTR (guid_in, 21)
     
    || '}';
     
    END IF;
     
    END generated_guid;
     
    FUNCTION generated_guid
     
    RETURN generated_guid_t
     
    IS
     
    BEGIN
     
    RETURN generated_guid (SYS_GUID);
     
    END generated_guid;
     
    END PACK_UUID;

  8. #48
    Membre extrêmement actif
    Avatar de randriano
    Homme Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 221
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Madagascar

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 221
    Par défaut
    Citation Envoyé par randriano Voir le message
    Donc, Oracle ne supporte l'utilisation de fonctions dans la création de table:
    - valeur par défaut d'une clé primaire
    - dans les contraintes CHECK
    Est-ce vrai ? C'est vrai pour la clé primaire apparemment
    N'est-ce pas vrai ? Et il faut toujours avoir recours au trigger BEFORE INSERT et BEFORE UPDATE pour y remédier, ce qui complique les choses par rapport à ce que peut faire Sql Server
    randriano.dvp.com
    Développeur. Product Owner [Agile]. Sites web, mobile apps, système d'information (SI).

  9. #49
    Expert confirmé Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5 611
    Par défaut
    Citation Envoyé par randriano Voir le message
    N'est-ce pas vrai ? Et il faut toujours avoir recours au trigger BEFORE INSERT et BEFORE UPDATE pour y remédier, ce qui complique les choses par rapport à ce que peut faire Sql Server
    Peux-tu nous dire d'où tires-tu ces conclusions ?

    Edit. Eh, oui c’est dur la grammaire

  10. #50
    Membre extrêmement actif
    Avatar de randriano
    Homme Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 221
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Madagascar

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 221
    Par défaut
    En fait c'est ma conclusion, j'utilise VARCHAR2 comme clé primaire, je ne peux pas mettre une fonction qui le génère automatiquement durant CREATE TABLE comme DEFAULT, j'ai envie d'utiliser une contrainte CHECK sur une colonne et ma condition utilise une fonction (ex: MaFonction(colonne1) > 3), ça ne passe pas d'où le fait de toujours mettre un test dans un trigger before insert, c'est la poisse si il y a plus de 100 tables à faire comme ça
    randriano.dvp.com
    Développeur. Product Owner [Agile]. Sites web, mobile apps, système d'information (SI).

  11. #51
    Expert confirmé Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5 611
    Par défaut
    En fait tu parle des functions PL/SQL pour lesquelles, c'est vrai, des restrictions existent
    DEFAULT

    The DEFAULT clause lets you specify a value to be assigned to the column if a subsequent INSERT statement omits a value for the column. The datatype of the expression must match the datatype of the column. The column must also be long enough to hold this expression.

    The DEFAULT expression can include any SQL function as long as the function does not return a literal argument, a column reference, or a nested function invocation.

    Restriction on Default Column Values
    A DEFAULT expression cannot contain references to PL/SQL functions or to other columns, the pseudocolumns CURRVAL, NEXTVAL, LEVEL, PRIOR, and ROWNUM, or date constants that are not fully specified.


  12. #52
    Lucas Panny
    Invité(e)
    Par défaut
    et pour la contrainte d'intégrité CHECK !!
    Est-ce qu'on peut utiliser une fonction que j'ai définie à l'intérieur si ça ne marche pas avec la contrainte DEFAULT ?

  13. #53
    Membre extrêmement actif
    Avatar de randriano
    Homme Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 221
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Madagascar

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 221
    Par défaut
    http://www.techonthenet.com/oracle/check.php
    Il est mentionné:
    Note:

    * A check constraint can NOT be defined on a VIEW.
    * The check constraint defined on a table must refer to only columns in that table. It can not refer to columns in other tables.
    * A check constraint can NOT include a SUBQUERY.
    Oracle autorise dans Check les fonctions buit-in (SYS_GUID, CURRENT_DATE, etc.) mais pas les UDF (User Defined Functions) c'est à dire les fonctions que j'ai créées

    Surtout http://oracle.developpez.com/faq/?page=3-1#check
    randriano.dvp.com
    Développeur. Product Owner [Agile]. Sites web, mobile apps, système d'information (SI).

Discussions similaires

  1. Type ado et format date général
    Par totoche dans le forum VB 6 et antérieur
    Réponses: 1
    Dernier message: 18/04/2007, 23h56
  2. [C#] Comment mettre un type Guid à null ?
    Par qwertz dans le forum C#
    Réponses: 3
    Dernier message: 23/06/2006, 12h25
  3. [VB.Net] cast du type 'DataRowview' en type 'Date' non valide
    Par badnane2 dans le forum Windows Forms
    Réponses: 4
    Dernier message: 14/06/2006, 16h50
  4. Convertion d'un type Nombre en type Date
    Par jam92400 dans le forum Access
    Réponses: 3
    Dernier message: 22/05/2006, 16h29
  5. [DATE][CONVERSION] du type numerique au type date
    Par hamed dans le forum MS SQL Server
    Réponses: 6
    Dernier message: 06/04/2005, 17h16

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