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 :

pls-00049 bad bind variable


Sujet :

PL/SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Juillet 2010
    Messages
    39
    Détails du profil
    Informations forums :
    Inscription : Juillet 2010
    Messages : 39
    Par défaut
    Pourquoi l'utilisation de :new dans une procédure appelée par un trigger provoque l'erreur :
    PLS-00049 : bad bind variable new.chbez
    Quand je marque cette ligne comme commentaire ou que je la mets dans le trigger appelant, alors il n'y a plus d'erreur.

    Pourquoi je ne trouve pas dans les livres ce genre d'information ?

    Le livre de Christian Soutou : "SQL POUR ORACLE" :

    Citation Envoyé par Christian Soutou
    Il est conseillé de limiter la taille (partie instructions) d’un déclencheur à soixante lignes de
    code PL/SQL (la taille d’un déclencheur ne peut excéder 32 ko). Pour contourner cette limitation,
    appeler des sous-programmes dans le code du déclencheur.
    Un déclencheur ne peut valider aucune transaction, ainsi les instructions suivantes sont
    interdites : COMMIT, ROLLBACK, SAVEPOINT, et SET CONSTRAINT.
    Attention à ne pas créer de déclencheurs récursifs (exemple d’un déclencheur qui exécute une
    instruction lançant elle-même le déclencheur ou deux déclencheurs s’appelant en cascade
    jusqu’à l’occupation de toute la mémoire réservée).
    C'est tout pour les déclencheurs, tandis qu'il y a d'autres cas...

  2. #2
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 454
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 454
    Par défaut
    Et si vous nous montriez votre code qui provoque l'erreur ?

  3. #3
    Membre averti
    Inscrit en
    Juillet 2010
    Messages
    39
    Détails du profil
    Informations forums :
    Inscription : Juillet 2010
    Messages : 39
    Par défaut
    Citation Envoyé par Waldar Voir le message
    Et si vous nous montriez votre code qui provoque l'erreur ?
    J´ai annuler la procedure et j ´ai tous refait dans le trigger. et maintenant tous ca marche

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    PL/SQL code successfully compiled (11:48:25)
    voila la derniere copie de mon declencheur et qui fonctionne, mais la question qui se pose est : pourquoi l´utilisation de CONCAT et LPAD cause des erreurs.


    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
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    create or replace trigger "T_CHW_K"
    BEFORE
    insert OR UPDATE on "C_HW"
    for each row
     
     DECLARE 
        CHT  C_HW.CH_TYP%TYPE;
        N INTEGER;
        CH CHAR;
        CH2 CHAR;
        V1 C_HW.CH_HERST%TYPE;
        V2 C_HW.CH_TYP%TYPE;
     BEGIN 
         CHT :=:NEW.CH_TYP;
         --P_K_CHW(CHT);
     
     IF UPPER(CHT)= 'LAPTOP' THEN
        begin
          SELECT S_CHW_NB.NEXTVAL 
           INTO N
           FROM DUAL;
          IF N<10 THEN 
             BEGIN
               CH:=TO_CHAR(N);
               --lpad(CH,2,'0');
               CH:='00'+CH;
             END;
           ELSIF (N<100) THEN
             begin 
              CH:=TO_CHAR(N);
              --lpad(CH,1,'0');
              CH:='0'+CH;
             end;
          END IF;
          CH2:='NB';
          --CONCAT(CH2,CH);
          CH2:=CH2+CH;  
          -- :NEW.CH_ART:=CH2;
          --INSERT INTO C_HW(CH_ART) VALUES CH2;
     
            update C_HW SET CH_ART = CH2
            WHERE  CHBEZ = :NEW.CHBEZ ;
        end;
     
      ELSIF UPPER(CHT)= 'DESKTOP' THEN
        begin  
           SELECT S_CHW_PC.NEXTVAL 
           INTO N
           FROM DUAL;
          IF N<10 THEN 
            begin
             CH:=TO_CHAR(N);
             --lpad(CH,2,'0');
             CH:='00'+CH;
            end;
           ELSIF (N<100) THEN
             begin
              CH:=TO_CHAR(N);
              --lpad(CH,1,'0');
              CH:='0'+CH;
             end;
          END IF;
          CH2:='PC';
          --CONCAT(CH2,CH);
          CH2:=CH2+CH;
          --:NEW.CH_ART:=CH2;
          --INSERT INTO C_HW(CH_ART) VALUES CH2;
          update C_HW SET CH_ART = CH2
            WHERE  CHBEZ = :NEW.CHBEZ ;
     
        end;
     
      ELSIF UPPER(CHT)= 'SERVER' THEN
        begin  
           SELECT S_CHW_SV.NEXTVAL 
           INTO N
           FROM DUAL;
          IF N<10 THEN 
            begin
             CH:=TO_CHAR(N);
             --lpad(CH,2,'0');
             CH:='00'+CH;
            end;
           ELSIF N<100 THEN
             begin
              CH:=TO_CHAR(N);
              --lpad(CH,1,'0');
              CH:='0'+CH;
             end;
          END IF;
          CH2:='SV';
          --CONCAT(CH2,CH);
          CH2:=CH2+CH;
          --:NEW.CH_ART:=CH2;
          --INSERT INTO C_HW(CH_ART) VALUES CH2;
          update C_HW SET CH_ART = CH2
            WHERE  CHBEZ = :NEW.CHBEZ ;
     
        end; 
     
      ELSIF UPPER (CHT)= 'CAD' THEN
        begin  
          SELECT S_CHW_WS.NEXTVAL 
           INTO N
           FROM DUAL;
          IF N<10 THEN 
            begin
              CH:=TO_CHAR(N);
              --lpad(CH,2,'0');
              CH:='00'+CH;
            end;
           ELSIF N<100 THEN
             begin
              CH:=TO_CHAR(N);
              --lpad(CH,1,'0');
              CH:='0'+CH;
             end;
           END IF;
           CH2:='WS';
           --CONCAT(CH2,CH);
           CH2:=CH2+CH;
           --:NEW.CH_ART:=CH2;
           --INSERT INTO C_HW(CH_ART) VALUES CH2;
           update C_HW SET CH_ART = CH2
            WHERE  CHBEZ = :NEW.CHBEZ ;
     
         end;
     
         ELSE RAISE_APPLICATION_ERROR(-20010, 'the type of computer is not existing, existings type : laptop, cad, desktop, server');
      END IF;
    end;

  4. #4
    Rédacteur
    Avatar de Vincent Rogier
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    2 373
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 2 373
    Par défaut
    parce que <new> et <old> sont des variables implicites et locales à un trigger et ne peuvent être utilisées en déhors d'un trigger.
    Vincent Rogier.

    Rubrique ORACLE : Accueil - Forum - Tutoriels - FAQ - Livres - Blog

    Vous voulez contribuer à la rubrique Oracle ? Contactez la rubrique !

    OCILIB (C Driver for Oracle)

    Librairie C Open Source multi-plateformes pour accéder et manipuler des bases de données Oracle

  5. #5
    Membre averti
    Inscrit en
    Juillet 2010
    Messages
    39
    Détails du profil
    Informations forums :
    Inscription : Juillet 2010
    Messages : 39
    Par défaut
    Citation Envoyé par Vincent Rogier Voir le message
    parce que <new> et <old> sont des variables implicites et locales à un trigger et ne peuvent être utilisées en déhors d'un trigger.
    Oui, vous avez raison car quand j´ai annuler l´appel de procedure, le probleme est resolu: mais le probleme est que les triggers ne peuvent pas depasser 60 lignes de code, selon Mr Christian Soutou l´editeur de SQL pour Oracle.


    Comment faire !!!!

  6. #6
    Rédacteur
    Avatar de Vincent Rogier
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    2 373
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 2 373
    Par défaut
    ce qu'il dit est différent, il dit que la taille du code d'un trigger ne peut dépasser 32ko soit 32000 octets donc 32000 caractères

    La doc Oracle 10gR2 (Coding the Trigger Body) le spécifie :
    Note:
    The size of the trigger cannot be more than 32K.
    Donc un code de 32Ko, c'est déja beaucoup ! allez mettons 50 caractères par ligne en moyenne en prenant compte le formatage (c'est déja pas mal), cela te fait 600 lignes.

    Tu ne peux fournir new.xxx comme paramètre d'un fonction ou procédure.

    Mais tu peux avoir une variable locale du même type à laquelle tu affectes la valeur de new.xxx et que ensuite tu passes à ta procédure/fonction...
    Vincent Rogier.

    Rubrique ORACLE : Accueil - Forum - Tutoriels - FAQ - Livres - Blog

    Vous voulez contribuer à la rubrique Oracle ? Contactez la rubrique !

    OCILIB (C Driver for Oracle)

    Librairie C Open Source multi-plateformes pour accéder et manipuler des bases de données Oracle

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

Discussions similaires

  1. [PHP / Oracle 9] Bind variables
    Par didier_s dans le forum Oracle
    Réponses: 3
    Dernier message: 23/06/2006, 17h00
  2. [Oracle 9i] Bind variables et sql dynamique
    Par jld_33 dans le forum Oracle
    Réponses: 17
    Dernier message: 09/06/2006, 11h49
  3. probleme de bind variable
    Par elbrujo2323 dans le forum Oracle
    Réponses: 7
    Dernier message: 22/02/2006, 13h49
  4. [9i] Bind variable dans fichier trace
    Par learn dans le forum Oracle
    Réponses: 6
    Dernier message: 27/01/2006, 15h24
  5. [Help] bind variable et parsing
    Par slefevre01 dans le forum Oracle
    Réponses: 1
    Dernier message: 04/08/2005, 14h56

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