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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre expérimenté
    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
    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 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
    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 expérimenté
    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
    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 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
    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 Expert 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 : 51
    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
    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 expérimenté
    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
    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

  7. #7
    Membre expérimenté
    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
    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

  8. #8
    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 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.

+ 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