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 :

Problème dans la déclaration d'un argument dans une procédure


Sujet :

PL/SQL Oracle

  1. #1
    Membre à l'essai
    Inscrit en
    Juin 2005
    Messages
    31
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 31
    Points : 22
    Points
    22
    Par défaut Problème dans la déclaration d'un argument dans une procédure
    Bonjour,

    Aujourd'hui, j'ai du créer une petite procédure (appelons la NEW) en me basant sur de l'existant (Procedue OLD).

    Facile: copier/coller/adapter et le tour est joué !

    Ah tiens non.

    Et pour cause, la procédure OLD fait appel à une autre procédure (qu'on appelera TIERS) qui permet de faire un traitement sur une chaine de caractère.

    En gros, si vous avez suivi

    Procedure OLD
    ...
    ...
    ...
    TIERS()
    ...
    END.


    Ma procédure à moi l'utilise aussi, mais plante dès qu'un appel dessus est fait.
    Procedure NEW
    ...
    ...
    ...
    TIERS()
    ...
    END.

    Pour cause: là où la procédure originale OLD utilisait TIERS en y balançant une chaine de petite taille (~100 caract.), la mienne utilise TIERS avec une chaine qui fait ~300 caractères.

    Et voila pourquoi ca plante.

    Dans la déclaration de la Procédure TIERS, j'ai

    CREATE OR REPLACE PROCEDURE TIERS (entree VARCHAR2, sortie OUT INTEGER) IS
    ...

    Et par défaut VARCHAR2 est limité à 200 (< ~300 donc).

    Bien évidemment, si je m'amuse à faire pour rigoler CREATE OR REPLACE PROCEDURE TIERS (entree VARCHAR2(200), sortie OUT INTEGER) IS
    ...

    Ben ça gueule

    Question: Comment je peux déclarer cette procédure TIERS pour qu'elle accepte des VARCHAR2 (ou d'autres chaine de caractères, je suis pas sectaire) qui fasse PLUS de 200 caractères ?

  2. #2
    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 KuBi4K Voir le message
    Et par défaut VARCHAR2 est limité à 200 (< ~300 donc).
    D'où sort cette affirmation fantaisiste ??

    Le code suivant fonctionne sans souci par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    set serveroutput on
     
    create or replace procedure test(a varchar2) is
    begin
    	dbms_output.put_line(a);
    end;
    /
     
    exec test(lpad('X', 350, 'X'));
    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

  3. #3
    Membre actif
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    178
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 178
    Points : 220
    Points
    220
    Par défaut
    Le problème vient d'ailleurs car une variable PLSQL de type VARCHAR2 est limitée à ~32500 octets et non 200, et un champ SQL de type VARCHAR2 à 4000 octets (dans une table par exemple).

  4. #4
    Membre à l'essai
    Inscrit en
    Juin 2005
    Messages
    31
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 31
    Points : 22
    Points
    22
    Par défaut
    Je bosse avec TOAD.

    Et en enquêtant sur le pourquoi du comment, je m'aperçois en testant ma procédure qu'il y a ceci

    http://imagik.fr/view-rl/58172

    C'est le menu pour tester les procédures independament. On spécifie à la main les paramètres d'entrées pour vérifier si cela fonctionne.

    Et comme vous pouvez constater, y a VARCHAR2(200).
    Et la chaine STR_ (entourée en vert) fait + 200 caractères, et donc fait planter le bazar.

    Si je réduis ma chaine <= 200 caractères. J'ai aucune problème.
    Si dans le bas de la boite de dialogue, je mets ceci:

    DECLARE
    STR_ VARCHAR2(1000);
    RET_ NUMBER;

    BEGIN
    ....

    J'ai de nouveau aucun problème.

    Par contre, le coup du STR_ VARCHAR2(1000); ne fonctionne qu'en local sur ma machine.
    Si j'éxécute ma procédure sur un autre ordi, cela ne fonctionne plus, il faut refaire la bidouille.

    J'aimerais donc inscrire "en dur" dans mon code VARCHAR2(500) ou ce que je veux.


    EDIT: et accessoirement, la procedure test de Pormalaix ne fonctionne pas.

    ORA-20000: ORU-10028: line length overflow, limit of 255 chars per line

  5. #5
    McM
    McM est déconnecté
    Expert éminent

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Juillet 2003
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4 580
    Points : 7 740
    Points
    7 740
    Billets dans le blog
    4
    Par défaut
    Donne le code des 2 procédures (NEW et TIERS), ce sera plus simple.
    More Code : More Bugs. Less Code : Less Bugs
    Mon Blog PL/Sql : Fichier Zip / Image BMP / Lire sqliteDB / QRCode et Images PNG ou BMP

  6. #6
    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
    L'exemple que j'ai donné fonctionne parfaitement en 10g.

    Si vous aviez commencé par appliquer les règles de bon sens, c'est à dire indiquer dès le début votre version d'Oracle, l'outil que vous utilisez et le message d'erreur reçu, on perdrait moins de temps.

    Par ailleurs, l'outil qui fait référence en cas de problème, c'est SQL*Plus.
    Si ça marche sous SQL*Plus, ce n'est pas un problème Oracle, mais de TOAD.
    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

Discussions similaires

  1. Réponses: 5
    Dernier message: 16/04/2015, 22h18
  2. Réponses: 0
    Dernier message: 17/04/2014, 11h24
  3. Argument d'une procédure pas pris en compte
    Par loisif dans le forum SQL Procédural
    Réponses: 1
    Dernier message: 20/03/2009, 09h06
  4. Réponses: 7
    Dernier message: 05/06/2008, 14h37
  5. Réponses: 1
    Dernier message: 24/04/2008, 15h23

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