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 :

Syntaxe varchar(20) et varchar2(20 char)


Sujet :

SQL Oracle

  1. #1
    Expert éminent
    Avatar de sekaijin
    Homme Profil pro
    Urbaniste
    Inscrit en
    Juillet 2004
    Messages
    4 205
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Urbaniste
    Secteur : Santé

    Informations forums :
    Inscription : Juillet 2004
    Messages : 4 205
    Points : 9 127
    Points
    9 127
    Par défaut Syntaxe varchar(20) et varchar2(20 char)
    Bonjour.

    je suis confronté à un petit pb de compatibilité entre les bases de données.

    les développeurs utilisent sur leur poste la base Derby (ce qui permet d'avoir des tests unitaire indépendant de toute infrascruture)

    et les plateforme de d'intégration recette et production utilisent Oracle
    nous avons de très nombreux petits projets qui ont tous au moins 1 script sql associé.
    nous aimerions éviter d'avoir à écrire plusieurs fois ces scripts (1pour derby 1 pour oracle)

    le problème vient de varchar

    derby supporte SQL92T soit donc les syntaxe
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    CHARACTER VARYING(14),
    CHAR VARYING(14),
    VARCHAR(14)
    oracle lui utilise
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    CHARACTER VARYING(14 CHAR),
    CHAR VARYING(14 CHAR),
    VARCHAR2(14 CHAR)
    juste pour ce détail il m'est pour le moment impossible d'avoir un script unique pour la création des tables. il me faut systématiquement une version oracle et une version derby.

    si j'utilise la syntaxe de derby sur oracle j'obtiens
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    CHARACTER VARYING(14 BYTE),
    CHAR VARYING(14 BYTE),
    VARCHAR2(14 BYTE)
    Or étant en utf-8 cela ne corresponds pas à mon besoin. en effet "éosine aqueuse" par exemple fait 14 chars mais 15 bytes.

    existe-t-il un moyen de paramétrer mon schémas oracle pour que
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    CHARACTER VARYING(14),
    CHAR VARYING(14),
    VARCHAR(14)
    crée par défaut des chars et non des bytes ?

    Merci
    A+JYT

  2. #2
    Expert éminent sénior 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
    Points : 11 252
    Points
    11 252
    Par défaut
    Non.

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

    Informations forums :
    Inscription : Août 2008
    Messages : 2 947
    Points : 5 846
    Points
    5 846
    Par défaut
    Citation Envoyé par sekaijin Voir le message
    les développeurs utilisent sur leur poste la base Derby (ce qui permet d'avoir des tests unitaire indépendant de toute infrascruture)
    Pourquoi ne pas utiliser Oracle Express Edition qui est gratuit et facilement installable sur les postes des développeurs.

  4. #4
    Rédacteur

    Homme Profil pro
    Consultant / formateur Oracle et SQL Server
    Inscrit en
    Décembre 2002
    Messages
    3 460
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Consultant / formateur Oracle et SQL Server

    Informations forums :
    Inscription : Décembre 2002
    Messages : 3 460
    Points : 8 074
    Points
    8 074
    Par défaut
    Citation Envoyé par sekaijin Voir le message
    ...les développeurs utilisent sur leur poste la base Derby (ce qui permet d'avoir des tests unitaire indépendant de toute infrascruture)

    et les plateforme de d'intégration recette et production utilisent Oracle...
    Une telle organisation n'a aucune chance de fonctionner !

    Les différents SGBD diffèrent notamment par les types de données qu'ils supportent (par exemple CURRENCY chez l'un, pas chez l'autre), par leurs fonctions natives, par leurs mécanismes transactionnels, par leur degré de respect des normes SQL...

    Si la prod fonctionne avec le SGBD X, le développement doit se faire sur ce même SGBD.
    Comme le suggère skuatamad, vous pouvez utiliser Oracle Express qui est 100% gratuit, ou Oracle Personal Edition, qui est très accessible (de l'ordre de 150 € par poste).

    Croire que les SGBD sont interchangeables (et qu'on peut bricoler sans un minimum de formation) est un leurre aux conséquences très graves.
    Consultant / formateur Oracle indépendant
    Certifié OCP 12c, 11g, 10g ; sécurité 11g

    Ma dernière formation Oracle 19c publiée sur Linkedin : https://fr.linkedin.com/learning/oracle-19c-l-administration

  5. #5
    Expert éminent
    Avatar de sekaijin
    Homme Profil pro
    Urbaniste
    Inscrit en
    Juillet 2004
    Messages
    4 205
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Urbaniste
    Secteur : Santé

    Informations forums :
    Inscription : Juillet 2004
    Messages : 4 205
    Points : 9 127
    Points
    9 127
    Par défaut
    mes besoins dans chaque projet sont particulièrement léger

    integer et varchar éventuellement char.

    j'imagine assez mal un serveur d'intégration continue qui sur des centaine de petits projets vas à la volé installer un serveur oracle créer des user et des schémas passer des script pour enfin pouvoir lancer des test junits qui font un pauvre sélect sur une table à trois colonne.

    croire que mettre l'artillerie lourde partout est une solution est pour moi tout aussi fou que de penser que les SGBD peuvent être 100% interchangeable.

    ma question ne porte que sur un point très précis car c'est le seul et unique point de blocage pour avoir un script qui s’exécute sur Derby et sur Oracle.

    Au pire on fera un utilitaire qui remet en Ansi SQL92 les scripts avant de les exécuter. Mais s'il y a une solution avec du paramétrage ce sera tout de même mieux.

    A+JYT

  6. #6
    Expert éminent sénior 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
    Points : 11 252
    Points
    11 252
    Par défaut
    Citation Envoyé par sekaijin Voir le message
    ...Mais s'il y a une solution avec du paramétrage ce sera tout de même mieux.

    A+JYT
    Il n'y en a pas.

  7. #7
    Membre chevronné
    Inscrit en
    Août 2009
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 1 073
    Points : 1 806
    Points
    1 806
    Par défaut
    Il faut positionner le paramètre NLS_LENGTH_SEMANTICS à CHAR et non BYTE.

  8. #8
    Expert éminent sénior 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
    Points : 11 252
    Points
    11 252
    Par défaut
    Il n'y en a pas

    Citation Envoyé par Rei Ichido Voir le message
    Il faut positionner le paramètre NLS_LENGTH_SEMANTICS à CHAR et non BYTE.

  9. #9
    Expert éminent
    Avatar de sekaijin
    Homme Profil pro
    Urbaniste
    Inscrit en
    Juillet 2004
    Messages
    4 205
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Urbaniste
    Secteur : Santé

    Informations forums :
    Inscription : Juillet 2004
    Messages : 4 205
    Points : 9 127
    Points
    9 127
    Par défaut
    merci je vais voir comment avoir ce paramètre par défaut à char pour mes users

    A+JYT

  10. #10
    Rédacteur

    Homme Profil pro
    Consultant / formateur Oracle et SQL Server
    Inscrit en
    Décembre 2002
    Messages
    3 460
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Consultant / formateur Oracle et SQL Server

    Informations forums :
    Inscription : Décembre 2002
    Messages : 3 460
    Points : 8 074
    Points
    8 074
    Par défaut
    Citation Envoyé par Rei Ichido Voir le message
    Il faut positionner le paramètre NLS_LENGTH_SEMANTICS à CHAR et non BYTE.
    J'avais immédiatement pensé à cette solution ce matin en lisant la question, et je me suis dit que j'allais l'accompagner d'une petite démonstration.
    Le souci, c'est que cette modification n'avait pas l'effet attendu.

    La doc vient de m'apprendre que les sessions SYS ne prennent pas en compte le paramètre NLS_LENGTH_SEMANTICS, et fonctionnent en mode BYTE sauf si on indique explicitement CHAR à la création de la colonne.

    Ca m'apprendra à tester sous SYS !
    Sous un compte lambda, ça fonctionne effectivement sans souci...
    Consultant / formateur Oracle indépendant
    Certifié OCP 12c, 11g, 10g ; sécurité 11g

    Ma dernière formation Oracle 19c publiée sur Linkedin : https://fr.linkedin.com/learning/oracle-19c-l-administration

  11. #11
    Expert éminent
    Avatar de sekaijin
    Homme Profil pro
    Urbaniste
    Inscrit en
    Juillet 2004
    Messages
    4 205
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Urbaniste
    Secteur : Santé

    Informations forums :
    Inscription : Juillet 2004
    Messages : 4 205
    Points : 9 127
    Points
    9 127
    Par défaut
    merci pour l'info
    A+JYT

  12. #12
    Expert éminent sénior 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
    Points : 11 252
    Points
    11 252
    Par défaut
    Citation Envoyé par Pomalaix Voir le message
    ...
    ...
    Ca m'apprendra à tester sous SYS !
    ...
    - Never ever use SYS (or SYSDBA) but for maintenance purpose (startup, shutdown, backup, recover)
    - SYS/SYSDBA is special
    - SYS/SYSDBA is Oracle proprietary (try to open a SR/TAR starting with "i did that with SYS/SYSDBA" and you'll see the immediate answer)
    - SYS/SYSDBA does not act like any other user
    - When you use SYS/SYSDBA Oracle deactivates some code path and activates others
    - Whatever you do with SYS/SYSDBA will neither validate nor invalidate the same thing with any other user.

    NEVER EVER use SYS/SYSDBA for anything that can be done by another user.
    Use SYS/SYSDBA ONLY for something that can't be done by someone else.

    --------------------------------------------------------------------------------
    SYS/SYSDBA is special

  13. #13
    Expert éminent
    Avatar de sekaijin
    Homme Profil pro
    Urbaniste
    Inscrit en
    Juillet 2004
    Messages
    4 205
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Urbaniste
    Secteur : Santé

    Informations forums :
    Inscription : Juillet 2004
    Messages : 4 205
    Points : 9 127
    Points
    9 127
    Par défaut
    finalement je suis passé par le build du projet.

    le source contient deux fichier
    session-oracle.sql (qui contient alter session pour fixer le NLS_LENGTH_SEMANTICS)
    et create.sql

    au build je produit deux fichiers
    create-oracle.sql (concaténation de session-oracle.sql et create.sql)
    et create-ansi.sql (create.sql seul)

    Ainsi j'ai un seul source à maintenir et je produit le script create pour oracle ou derby.

    Merci à vous.
    A+JYT

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

Discussions similaires

  1. a varchar2(2 char):= '&3';
    Par snake13 dans le forum PL/SQL
    Réponses: 1
    Dernier message: 14/06/2010, 09h57
  2. Convertir VARCHAR2 en CHAR
    Par iiban dans le forum PL/SQL
    Réponses: 2
    Dernier message: 19/08/2009, 11h29
  3. varchar varchar2 char
    Par fantomas261 dans le forum Langage SQL
    Réponses: 1
    Dernier message: 15/05/2007, 12h25
  4. Erreur de syntaxe VARCHAR NOT NULL
    Par goofiot dans le forum Requêtes
    Réponses: 4
    Dernier message: 03/03/2006, 22h59
  5. varchar devient char
    Par airwolf dans le forum Outils
    Réponses: 2
    Dernier message: 08/02/2004, 01h35

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