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

Oracle Discussion :

Row Type Long


Sujet :

Oracle

  1. #1
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2006
    Messages : 20
    Par défaut Row Type Long
    Bonjour,

    Je travaille actuellement sur une solution d'export des ancienne base oracle 7 au format XML .

    j'ai développé des procédure PLSQL sous oracle 10g et j'utilise base 8i comme un pont pour accéder au table des base cible 7 . la solution consiste a importer table par table avec "create as select " et je traite la table importer sur ma base local et je continue avec la table suivante.

    mon problème est lorsqye il ya une table avec une colonne de type Long
    le systeme m'affiche "ora-00997 illegal use of long datatype "

    le probleme que je connais pas ni le nombre des tables avec le type long ni la structure des tables cibles donc je peux pas utilisé la fonction TO_LOB pour transformer la colone de type long en Clob.

    avec Copy aussi sa marche pas

    (j’espère que j'ai bien expliqué mon problème)

    Merci pour vos lumieres.

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

    Informations forums :
    Inscription : Août 2008
    Messages : 2 954
    Par défaut
    Citation Envoyé par evilnet Voir le message
    le probleme que je connais pas ni le nombre des tables avec le type long ni la structure des tables cibles donc je peux pas utilisé la fonction TO_LOB pour transformer la colone de type long en Clob.
    ALL_TAB_COLUMNS

  3. #3
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2006
    Messages : 20
    Par défaut
    merci pour ta repense .

    J'aimerais bien si tu as une idée comment je peux re crée une table dans ma base local copie de la table cible sans utilisé create as select sa fonctionne pas avec les type long.

    merci encore

  4. #4
    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
    Ca fonctionne mais il faut utiliser to_lob.

  5. #5
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2006
    Messages : 20
    Par défaut
    merci mnitu pour ta repense .

    par exepmle

    CREATE TABLE TableNameTarget AS SELECT * FROM TableNameSource;



    je connais pas la structure de la table TableNameSource

    skuatamad dans sa repense il précise ALL_TAB_COLUMNS oui je veux récuperer les colonnes de la table TableNameSource.

    comment crée une table avec ces données ?? pour utiliser la fonction TO_LOB

    est ce que je doit crée une procédure avec 2 curseur pour crée une requete de cette forme


    CREATE TABLE TableNameTarget AS SELECT col1,col2,col3,TO_LOB(col4) FROM TableNameSource;

    avec col1,col2,col3,col4 sont les résultats de la requête

    select COLUMN_NAME from all_tab_columns where owner ='owner' and TABLE_NAME='TableNameSource' ;

    merci

  6. #6
    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
    Oui c’est ça dans les grandes lignes.

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

    Informations forums :
    Inscription : Août 2008
    Messages : 2 954
    Par défaut
    Cette requête peut t'aider à mettre en place le script pl/sql, avec curseur et execute immediate :
    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
    SQL> desc t;
     Name                                      Null?    Type
     ----------------------------------------- -------- ----------------------------
     C1                                                 NUMBER
     C2                                                 VARCHAR2(10)
     C3                                                 VARCHAR2(50)
     C4                                                 DATE
     C5                                                 LONG
     
    SQL> WITH universe AS
    (
    SELECT column_id, table_name,
           case when data_type = 'LONG' then 'to_lob('||column_name||')' else column_name end as column_name
      FROM user_tab_columns
     WHERE table_name = 'T'
    )
    SELECT 'create table '|| table_name || ' as select ' || substr(sys_connect_by_path(column_name,','),2) ||' from '||table_name
      FROM universe
     WHERE CONNECT_BY_ISLEAF = 1
     START WITH column_id    = 1
    CONNECT BY column_id     = 1 + PRIOR column_id ;
     
    'CREATETABLE'||TABLE_NAME||'ASSELECT'||SUBSTR(SYS_CONNECT_BY_PATH(COLUMN_NAME,',
    --------------------------------------------------------------------------------
    create table T as select C1,C2,C3,C4,to_lob(C5) from T
     
    SQL>
    A voir avant si le CTAS avec to_lob fonctionne via dblink (j'ai un doute) si c'est ce qui est utilisé.

    [EDIT] En fait CONNECT_BY_ISLEAF c'est du 10G+, donc ça marchera pas en 7, retire le et regarde comment ça fonctionne sans, à priori il suffit de rajouter MAX autour du substr(sys_connect...) dans le SELECT.

  8. #8
    Membre Expert

    Homme Profil pro
    Inscrit en
    Mars 2010
    Messages
    536
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 536
    Par défaut
    Citation Envoyé par skuatamad Voir le message
    A voir avant si le CTAS avec to_lob fonctionne via dblink (j'ai un doute) si c'est ce qui est utilisé.
    Bien vu.

    En utilisant un bloc PL/SQL, ca passe
    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
     
    SQL> 
    describe t_long_2
               Name                            Null?    Type
               ------------------------------- -------- ----------------------------
        1      ID                                       NUMBER
        2      V                                        LONG
     
     
    SQL> 
    describe t_long1@xxx_yyy.world
               Name                            Null?    Type
               ------------------------------- -------- ----------------------------
        1      ID                                       NUMBER
        2      V                                        LONG
     
     
    SQL> insert into t_long_2 select * from t_long_1@xxx_yyy.WORLD;
    insert into t_long_2 select * from t_long_1@xxx_yyy.WORLD
                                *
    ERROR at line 1:
    ORA-00997: illegal use of LONG datatype
     
     
    SQL> INSERT INTO t_long_2 SELECT id, to_lob(v) FROM t_long_1@xxx_yyy.WORLD;
    INSERT INTO t_long_2 SELECT id, to_lob(v) FROM t_long_1@xxx_yyy.WORLD
                                                   *
    ERROR at line 1:
    ORA-00997: illegal use of LONG datatype
     
    SQL> declare
      2   ll long;
      3  begin
      4   for x in (select * from t_long_1@xxx_yyy.world)
      5  loop
      6     insert into t_long_2
      7  values (x.id, x.v);
      8  end loop;
      9  commit;
     10  end;
     11  /
     
    PL/SQL procedure successfully completed.

  9. #9
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2006
    Messages : 20
    Par défaut
    bonjour merci pour vos repense j'ai bien avancé
    en faite j'ai crée 2 synonym dans ma base 8 qui pointe vers all_tab_columns et la table cible avec un colonne de type long

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    create synonym alltabcolumns7 for all_tab_columns@dblink7;
     
      create synonym Table_rowlong7 for Table_T1@dblink7;
    aprés j'ai utilisé la requete de skuatamad dans une base 10 en utilisant une base 8 comme un pont


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    WITH universe AS (SELECT column_id, table_name,column_name,case when data_type = 'LONG' then 'CLOB'  when data_type = 'VARCHAR2' then 'VARCHAR2('||DATA_LENGTH||')' else data_type end AS data_type
      FROM alltabcolumns7@DBlibink8 WHERE  table_name ='Table_T1')
    SELECT MAX('create table '|| table_name || '10 ( ' || substr(sys_connect_by_path(column_name||' '|| data_type ,','),2) ||' ) ')
      FROM universe
     START WITH column_id    = 1
    CONNECT BY column_id     = 1 + PRIOR column_id ;
    le resultat c'est uen requete pour crée une table dans la base 10


    apres j'ai utilisé la meme requete pour crée les "Values"

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
     WITH universe AS
    (SELECT column_id, table_name, column_name
      FROM alltabcolumns7@DBlibink8 WHERE table_name ='Table_T1')
    SELECT MAX('values ( ' || substr(sys_connect_by_path('x.'||column_name,','),2) ||' ); ')
      FROM universe
     START WITH column_id    = 1
    CONNECT BY column_id     = 1 + PRIOR column_id ;
    le resultat est Values (x.col1,x.col2.....);

    apres j'ai utilisé la solution de Mohamed.Houri

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    begin
       FOR x IN (SELECT * FROM Table_rowlong7@DBlibink8 )
      loop
         INSERT INTO OBJINDX10
     -- ici j'ai mis le resutat de la requete précédente
          Values (x.col1,x.col2.....);
      end loop;
      commit;
      end;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    mais j'ai reçu un message erreur :
    ORA-06550 line2 , column 13:
    pl/sql : ora-00980 synonym translation is no longer valid
    ORA-06550 line2 , column 13:
    pl/sql : SqL Statement ignored
    ORA-06550 line5 , column 167:
    PLS-00364 loop index variable 'x' use is invalid
    ORA-06550 line5 , column 169:
    pl/sql : ora-00980 : column not allowed here
    ORA-06550 line4 , column 6:
    pl/sql : SqL Statement ignored
    alors si je fais un

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    select count(*) from Table_rowlong7@DBlibink8
    elle retourne les nombre de ligne exacte .


    merci

  10. #10
    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 skuatamad Voir le message
    ...A voir avant si le CTAS avec to_lob fonctionne via dblink (j'ai un doute) si c'est ce qui est utilisé.
    ...
    Il ne fonctionne pas c'est indiqué dans la documentation: Copying a LONG to a LOB Column Using the TO_LOB Operator. En lisant à travers j'ai complètement loupé c'est aspect.
    Merci.

  11. #11
    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 evilnet Voir le message
    ...
    apres j'ai utilisé la solution de Mohamed.Houri
    ...
    Je pense qu’il y a un piège dans cette solution le type long étant limité à 32760 caractères en PL/SQL.

  12. #12
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2006
    Messages : 20
    Par défaut


    alors d’après vous est ce que je dis qu'il n'il ya de solution pour récupérer les tables distant dans une base oracle 7 avec de type long ou il ya une solution parsque j'ai suivi tous vos remarque etj'ai pas réussi

    aidé moi plz

    merci

  13. #13
    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
    Il y a toujours une solution. Qu’est-ce que n’a pas fonctionné ?

  14. #14
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2006
    Messages : 20
    Par défaut
    cette parti

    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
     
    begin
    FOR x IN (SELECT * FROM Table_rowlong7@DBlibink8 )
    loop
    INSERT INTO 'Table_T1
    -- ici j'ai mis le resutat de la requete précédente
    Values (x.col1,x.col2.....);
    end loop;
    commit;
    end;
     
     
    mais j'ai reçu un message erreur :
    ORA-06550 line2 , column 13:
    pl/sql : ora-00980 synonym translation is no longer valid
    ORA-06550 line2 , column 13:
    pl/sql : SqL Statement ignored
    ORA-06550 line5 , column 167:
    PLS-00364 loop index variable 'x' use is invalid
    ORA-06550 line5 , column 169:
    pl/sql : ora-00980 : column not allowed here
    ORA-06550 line4 , column 6:
    pl/sql : SqL Statement ignored

  15. #15
    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
    Vérifiez vos synonymes
    ORA-00980 synonym translation is no longer valid

    Cause: The synonym used is based on a table, view, or synonym that no longer exists.

    Action: Replace the synonym with the name of the object it references or re-create the synonym so that it refers to a valid table, view, or synonym

  16. #16
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2006
    Messages : 20
    Par défaut
    alors si je fais un

    select count(*) from Table_rowlong7@DBlibink8

    elle retourne les nombre de ligne exacte .

    j'ai déja verifié le synonym

    merci

  17. #17
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2006
    Messages : 20
    Par défaut
    je pense que j'ai trouvé le probleme

    enfaite je pense que les tables de type Long dans les base 7 contient des données du type image ou fichier je sais pas exacetement .

Discussions similaires

  1. probleme avec le type LONG ROW
    Par amigauss dans le forum SQL
    Réponses: 10
    Dernier message: 21/09/2006, 10h29
  2. Oracle 9i : PLSQL - Variable de type LONG
    Par vortex dans le forum PL/SQL
    Réponses: 8
    Dernier message: 16/11/2004, 13h23
  3. select sur un champ de type LONG
    Par ppd dans le forum Langage SQL
    Réponses: 2
    Dernier message: 03/09/2004, 18h19
  4. DBLink et types LONG/LONG RAW
    Par bchristo dans le forum Administration
    Réponses: 7
    Dernier message: 28/04/2004, 12h46
  5. DATABASE LINK + type Long et long raw ...
    Par bchristo dans le forum Administration
    Réponses: 21
    Dernier message: 26/04/2004, 15h27

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