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 :

SET LONG 100000 - dbms_metadata.get_ddl [11gR2]


Sujet :

PL/SQL Oracle

  1. #1
    Membre averti
    Avatar de sweetasnz
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mars 2012
    Messages
    212
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Nouvelle-Zélande

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mars 2012
    Messages : 212
    Points : 375
    Points
    375
    Par défaut SET LONG 100000 - dbms_metadata.get_ddl
    Salut,
    oracle 11.2.0.2 sous windows XP.
    PHP 5.3
    driver ODBC instantclient_11_2

    Voici mon problème :
    je souhaite valoriser une variable php avec le résultat d'une requête oracle qui appelle une fonction oracle.
    JE veux remonter la structure de mes tables à l'aide de la fonction interne "dbms_metadata.get_ddl"

    ma fonction oracle appelée:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    CREATE OR REPLACE FUNCTION TABLE_STRUCT(nom_table IN varchar2)
    RETURN varchar2
    IS 
    temp varchar2(2000);
    BEGIN
    select dbms_metadata.get_ddl('TABLE', nom_table) into temp from dual;
    RETURN(temp);
    END;
    ma requête appelante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT TABLE_STRUCT('$table') AS TS FROM DUAL
    Résultat :
    Ma chaine est tronquée à un certains nombre de caractères...

    Mes recherches :
    En enquêtant sur la toile, il apparait que cela provienne des settings d'ORACLE.
    J'ai donc réussi à résoudre mon problème sous SQLPLUS pour afficher la totalité de ma chaine de caractères en paramétrant mes settings Oracle:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sqlplus> set long 100000
    Hors, je veux intégrer ça dans mon script PHP qui utilise les fonctions PDO pour dialioguer avec la base Oracle.
    Lorsque j'exécute ma requête précédente, la base me renvoie "(string)", car à priori le "SET LONG" est trop court.
    Mon problème : comment récupérer cette chaine de caractères, certes un peu longuette (400 caractères) mais faut pas pousser non plus !

    Mes tests :
    1. cela fonctionne si je change ma requête de ma fonction par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    CREATE OR REPLACE FUNCTION TABLE_STRUCT(nom_table IN varchar2)
    RETURN varchar2
    IS 
    temp varchar2(2000);
    BEGIN
    select 'test' into temp from dual;
    RETURN(temp);
    END;
    ma requête appelante me renvoie bien "test"

    2. J'ai également testé avec 'CLOB' au lieu de VARCHAR2 sans succès.

    Questions :
    0. Y a-t'il quelque chose que j'ai mal fait ou un truc que j'ai pas bien saisi ?
    1. Comment modifier mes settings en PL/SQL?

    ps : Mon objectif est de récupérer la structure de mes tables pour les copier ailleurs à l'aide de mon code PHP...

    je suis épuisé
    Merci d'avance à l'ORACLique

  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
    SET LONG c’est une commande sqlplus, qui n’est qu’une application client qui se connecte à une base des données Oracle et vous permet d'exécuter des requêtes SQL ad-hoc. Cette commande n’a rien à voir dans le cas d’une autre application client se connectant à la base Oracle.
    Si votre procédure renvoie moins de 400 caractères vous ne devez pas avoir trop de problèmes quand à son utilisation. Donc commencez par debugger du coté de votre code PHP.

  3. #3
    Membre averti
    Avatar de sweetasnz
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mars 2012
    Messages
    212
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Nouvelle-Zélande

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mars 2012
    Messages : 212
    Points : 375
    Points
    375
    Par défaut
    merci
    Tout d'abord, je suis conscient que le "SET" est une commande sqlplus

    Etant donné que cela fonctionne avec les tests que j'ai décrits en commentaires 1 :
    - aucun problème dans mon code PHP (pas d'erreurs), mais peut-être un attribut, ou une option à tuner dans mon objet PDO

    Par ailleurs,
    - je viens juste d'ajouter que je travailler avec un driver ODBC.

    J'aimerais savoir comment configurer mes paramètres ORACLE via mon client ODBC à travers PHP et la couche objet PDO.
    si cela est possible bien sur.

  4. #4
    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
    Ecrivez une pauvre fonction en PL/SQL que ne fait que renvoyer une chaine des moins de 4000 caractères. Tester cette fonction sous sqlplus et ensuite en PHP, via ODBC et la couche PDO.
    Quand vos testes seront OK revenez vers la fonction DBMS_METADA.Get_DDL.

  5. #5
    Membre expérimenté Avatar de ojo77
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Décembre 2010
    Messages
    680
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Décembre 2010
    Messages : 680
    Points : 1 597
    Points
    1 597
    Par défaut
    Il pourrait aussi être intéressant d'utiliser PDO::PARAM_LOB en tant que type dans un PDOStatement::bindColumn ...

  6. #6
    Membre averti
    Avatar de sweetasnz
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mars 2012
    Messages
    212
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Nouvelle-Zélande

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mars 2012
    Messages : 212
    Points : 375
    Points
    375
    Par défaut
    Citation Envoyé par mnitu Voir le message
    Ecrivez une pauvre fonction en PL/SQL que ne fait que renvoyer une chaine des moins de 4000 caractères. Tester cette fonction sous sqlplus et ensuite en PHP, via ODBC et la couche PDO.
    Quand vos testes seront OK revenez vers la fonction DBMS_METADA.Get_DDL.
    j'ai l'impression que vous ne lisez pas les post car les tests que vous décrivez, je les ai déjà réalisé et décris dans mon 1er post.

    peut-être n'ai-je pas été assez clair...

    ps : je souhaite récupérer une chaine d'environ 400, mon problème vient plutôt des settings ORACLE via la couche PDO

  7. #7
    Membre averti
    Avatar de sweetasnz
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mars 2012
    Messages
    212
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Nouvelle-Zélande

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mars 2012
    Messages : 212
    Points : 375
    Points
    375
    Par défaut
    Citation Envoyé par ojo77 Voir le message
    Il pourrait aussi être intéressant d'utiliser PDO::PARAM_LOB en tant que type dans un PDOStatement::bindColumn ...
    Bonjour,
    en effet, j'étais en train de voir la doc sur PDO.
    je viens de tester avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    $db = new PDO($dsn);
    $stmt = $db->prepare("SELECT TABLE_STRUCT('$table') FROM DUAL");
    $stmt->execute();
    $stmt->bindColumn(1, $monlob, PDO::PARAM_LOB);
    $stmt->fetch(PDO::FETCH_BOUND);
    $monprint = $monlob;
    1. sans succès sur la structure de ma table (longue chaine string), cela me renvoie une chaine vide.
    2. cela fonctionne si je récupère un "petit string" comme 'test123456' dans mon select.
    Merci pour l'info mais c'est toujours pareil

  8. #8
    Membre expérimenté Avatar de ojo77
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Décembre 2010
    Messages
    680
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Décembre 2010
    Messages : 680
    Points : 1 597
    Points
    1 597
    Par défaut
    $stmt->bindColumn(1, $monlob, PDO::PARAM_LOB, 100000); ?

  9. #9
    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 sweetasnz Voir le message
    j'ai l'impression que vous ne lisez pas les post car les tests que vous décrivez, je les ai déjà réalisé et décris dans mon 1er post.
    ...
    J'ai la même impression en lisant vos réponses.

  10. #10
    Membre averti
    Avatar de sweetasnz
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mars 2012
    Messages
    212
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Nouvelle-Zélande

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mars 2012
    Messages : 212
    Points : 375
    Points
    375
    Par défaut
    Citation Envoyé par ojo77 Voir le message
    $stmt->bindColumn(1, $monlob, PDO::PARAM_LOB, 100000); ?
    idem que précédemment, cela fonctionne pour une chaine de longueur ('test')
    mais cela me renvoie 'vide' pour la structure de ma table...
    je vais voir du côté de mon PHP.INI si je ne peux pas tuner le PDO

  11. #11
    Membre averti
    Avatar de sweetasnz
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mars 2012
    Messages
    212
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Nouvelle-Zélande

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mars 2012
    Messages : 212
    Points : 375
    Points
    375
    Par défaut
    une autre info intéressante :
    dans ma fonction décrite plus haut :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    CREATE OR REPLACE FUNCTION TABLE_STRUCT(nom_table IN varchar2)
    RETURN varchar2
    IS 
    temp varchar2(2000);
    BEGIN
    SELECT 'test' INTO temp FROM dual;
    RETURN(temp);
    END;
    j'augmente petit à petit mon string (dans l'encadrer monString = 'test') :
    - monString = 1025 caractères (que des 'a' par exemple) :
    la fonction me renvoie ma chaine (1025 caractères)
    - monString = 1026 caractères
    la fonction me renvoie 'vide'

    limitation à 1Ko (1024) ?? où ? registre, php.ini, apache ?
    des idées?

  12. #12
    Membre expérimenté Avatar de ojo77
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Décembre 2010
    Messages
    680
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Décembre 2010
    Messages : 680
    Points : 1 597
    Points
    1 597
    Par défaut
    En testant chez moi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    <pre>
    <?php
    $dbh = new PDO('oci:host=localhost;dbname=orcl', 'system', 'manager11');
     
    $stmt = $dbh->prepare("select sys.dbms_metadata.get_ddl('TABLE','LOGMNRGGC_GTLO',USER) from sys.dual");
    $stmt->execute();
    $stmt->bindColumn(1, $monlob, PDO::PARAM_LOB, 100000);
    $stmt->fetch(PDO::FETCH_BOUND);
    echo fpassthru($monlob) ;
     
    $dbh = null;
    ?>
    </pre>

    J'obtient le résultat suivant (de 2005 caractères)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
      CREATE TABLE "SYSTEM"."LOGMNRGGC_GTLO" 
       (	"LOGMNR_UID" NUMBER NOT NULL ENABLE, 
     
    [...]
     
      BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)
      TABLESPACE "SYSTEM" 2005
    Sur un wamp classique, sans modif de conf particulière

    [EDIT:] La doc semble indiquer qu'i faut utiliser PDO::PARAM_STR pour les CLOB en indiquant systématiquement la taille maxi (paramètre 4)

    Ce qui donne la ligne suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $stmt->bindColumn(1, $monlob, PDO::PARAM_STR, 100000);

  13. #13
    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 sweetasnz Voir le message
    ...

    limitation à 1Ko (1024) ?? où ? registre, php.ini, apache ?
    des idées?
    Une fonction que renvoie du varchar2 est limité à 32676 octests en PL/SQL et 4000 en SQL. En dessous de ça c'est votre environnement de programmation qu'il faut regarder en cas de problème.

  14. #14
    Membre averti
    Avatar de sweetasnz
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mars 2012
    Messages
    212
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Nouvelle-Zélande

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mars 2012
    Messages : 212
    Points : 375
    Points
    375
    Par défaut
    @ojo
    Merci pour tes tests :
    j'ai également testé avec le PARAM_STR + CLOB mais toujours pareil.
    je ne récupère que 1025 caractères maximum...

    la seule chose que je vois qui est différente entre nos config,
    c'est que j'utilise un driver ODBC dans ma chaine de connexion à ORACLE via PDO et non pas l'interface OCI (comme toi)

    odbc:DRIVER={Oracle in instantclient_11_2}

    conclusion : mauvais choix d'interface ...
    je vais tenter de voir si je peux intégrer OCI dans la config logicielle.

  15. #15
    Membre averti
    Avatar de sweetasnz
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mars 2012
    Messages
    212
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Nouvelle-Zélande

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mars 2012
    Messages : 212
    Points : 375
    Points
    375
    Par défaut
    @mnitu
    effectivement on tombe d'accord sur l'environnement logiciel et pour le coup, l'interface avec la base...

  16. #16
    Membre averti
    Avatar de sweetasnz
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mars 2012
    Messages
    212
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Nouvelle-Zélande

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mars 2012
    Messages : 212
    Points : 375
    Points
    375
    Par défaut
    merci à tous les 2

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

Discussions similaires

  1. Script long set Foreign_key_checks
    Par Annsen dans le forum Administration
    Réponses: 2
    Dernier message: 11/08/2011, 12h38
  2. Réponses: 2
    Dernier message: 07/06/2010, 15h08
  3. SET @variable1 (SELECT WERE). Traitement trop long, Help!
    Par Tomchaz84 dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 16/06/2009, 14h48
  4. Réponses: 2
    Dernier message: 05/06/2002, 12h29
  5. character set // Nls_lang
    Par fopicht dans le forum Oracle
    Réponses: 2
    Dernier message: 23/05/2002, 12h04

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