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 :

[Debutant]Debugguer une procédure


Sujet :

Oracle

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    171
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mars 2003
    Messages : 171
    Points : 97
    Points
    97
    Par défaut [Debutant]Debugguer une procédure
    Bonjour

    Je suis novice dans le développement avec oracle je débarque sur un projet ou je suis amener a modifier une procédure existante sur la base oracle l'outil utilisé pour simplifier est TOAD en version 7.3.
    Je me connecte a la base pour une application sous vc++ les params que j'envoi sont bons mais je pense que je me suis trompé dans la procédure pour cela j'aurai besoin de la suivre pas a pas ce qui se passe dans ma procédure j'ai trouvé un mode debug mais je n'arrive pas a m'en servir je pensais que dbms.output me permettrait de visualiser mais ca marche pas. bref je suis perdu surtout que je ne maitrise pas le PL\SQL pour faire tout ca donc si un tutorial explique bien la syntaxe les options ... je suis preneur (ps dans la faq je n'ai pas trouvé exactement ce que je cherchais)
    merci d'avance

  2. #2
    Membre expert

    Profil pro
    Inscrit en
    Février 2006
    Messages
    3 437
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 3 437
    Points : 3 597
    Points
    3 597
    Par défaut
    Dans un premier temps, je conseillerais de tester la procédure sans le client C++ mais depuis SQLPLUS: dans ce cas là, DBMS_OUTPUT doit fonctionner si on n'oublie pas:
    1. d'exécuter avant l'appel de la procédure
    2. que sqlplus n'affiche la sortie DBMS_OUTPUT qu'à la fin de l'instruction démarrée par SQLPLUS: càd on a tout en un seule fois.

    Une procédure peut s'appeler depuis SQLPLUS avec:


  3. #3
    Membre éprouvé
    Inscrit en
    Avril 2006
    Messages
    1 024
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 1 024
    Points : 1 294
    Points
    1 294
    Par défaut
    ... ou dans toad, tu peux voir les sorties l'onglet "DBMS Output" en n'oubliant pas de cliquer sur la petite pastille rouge à gauche (qui deviendra verte) pour activer la sortie serveroutput.

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    171
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mars 2003
    Messages : 171
    Points : 97
    Points
    97
    Par défaut
    voila mon cas plus précisement j'appelle une procédure dans un package paqrepair que voici:
    procedure InsertRepairBySerial
    (pIdSerial IN REPAIR.SERIALID%TYPE,
    pIdUser IN REPAIR.USERID%TYPE,
    pQSTATDateSTAMP IN varchar2,
    pIdFailure IN FAILURE.ID%TYPE,
    pIDCause IN CAUSE.ID%TYPE,
    pIDACTION IN ACTION.ID%TYPE,
    pIDOWNREP IN OWNREP.ID%TYPE,
    pRepMsgName IN REPMSG.name%TYPE,
    pBatchName IN BATCH.name%TYPE,
    pFailName IN FAILREF.name%TYPE, -- Repere topo
    pBatchRef IN BATCH.REFERENCE%TYPE,
    pPasdetest IN OWNREP.DESCRIPT%TYPE DEFAULT NULL) IS

    pIDRepairToReturn REPAIR.ID%TYPE := NULL ;

    BEGIN

    -- Appel Procedure stocke hors package
    insertRepair (
    pIdSerial, pIdUser
    , fQStatToDate(pQSTATDateSTAMP)
    , pIdFailure
    , pIDCause, pIDACTION, pIDOWNREP
    , pRepMsgName , pBatchName,pFailName,pBatchRef,pPasdetest
    , pIDRepairToReturn ) ;


    END ;
    elle appelle une autre procédure que voici :

    CREATE OR REPLACE PROCEDURE InsertRepair
    (pIdSerial IN REPAIR.SERIALID%TYPE,
    pIdUser IN REPAIR.USERID%TYPE,
    pDateSTAMP IN REPAIR.STAMP%TYPE,
    pIdFailure IN FAILURE.ID%TYPE,
    pIDCause IN CAUSE.ID%TYPE,
    pIDACTION IN ACTION.ID%TYPE,
    pIDOWNREP IN OWNREP.ID%TYPE,
    pRepMsgName IN REPMSG.name%TYPE,
    pBatchName IN BATCH.name%TYPE, -- Repere topo
    pFailName IN FAILREF.name%TYPE,
    pBatchRef IN BATCH.REFERENCE%TYPE,
    pPasdetest IN OWNREP.DESCRIPT%TYPE,
    pIDRepairToReturn OUT REPAIR.ID%TYPE
    ) IS

    IdRepair REPAIR.ID%TYPE := to_number(NULL) ;
    IDFailRef failref.ID%TYPE := to_number(NULL) ;
    IdRepMsg REPMSG.ID%TYPE := to_number(NULL) ;
    IdBatch BATCH.ID%TYPE := to_number(NULL) ;

    sFailtype FAILTYPE.NAME%TYPE ;
    IdCauseCat REPAIR.CAUSECATID%TYPE;


    BEGIN


    -- Retrouver le type de la FAILURE pour inserer le meme
    -- Sinon on prend 'PART'
    begin
    select FAILTYPE.NAME into sFAilTYPE
    FROM FAILURE, FAILTYPE, FAILREF
    WHERE FAILREF.FAILTYPEID = FAILTYPE.ID
    AND FAILURE.FAILREFID = FAILREF.ID
    AND FAILURE.ID = pIdFAILURE ;

    Exception WHEN no_data_found THEN
    sFailtype := 'PART' ;
    end ;



    -- Creation ou retrouve la defaillance si pas de defaut -none-
    InsertFailRef( nvl(pFailName,'-none-'), sFailtype, IDFailRef ) ;


    -- Insertion ou retrouve BATCH
    IF pBatchName IS NOT NULL OR pBatchRef IS NOT NULL THEN
    InsertBatch (pBatchName,pBatchRef, IdBatch) ;

    END IF ;
    DBMS_OUTPUT.PUT( ' ' || 'Pas de test =' || pPasdetest ) ;
    DBMS_OUTPUT.NEW_LINE ;

    -- Insertion ou rtrouve PASDETEST
    -- IF pPasdetest IS NOT NULL THEN
    INSERT INTO OWNREP (ID,DESCRIPT)
    VALUES (pIDOWNREP,pPasdetest);
    -- END IF ;

    -- Insertion ou rtrouve REPMSG
    IF pRepMsgName IS NOT NULL THEN
    InsertRepMsg (pRepMsgName, IdREPMSG ) ;
    END IF ;

    begin
    SELECT CAUSE.CAUSECATID into IdCauseCat
    FROM CAUSE
    WHERE CAUSE.ID = pIdCause;
    Exception WHEN no_data_found THEN
    IdCauseCat := 1 ;
    end ;


    -- Creation de la reparation.
    IdRepair := bd_ident ;

    INSERT INTO REPAIR
    (ID , FAILREFID ,FAILUREID
    , STAMP ,STATUS ,USERID
    , CAUSEID ,ACTIONID ,REPMSGID
    , OWNREPID ,PARTDATAID
    ,SERIALID, CAUSECATID )

    SELECT IdRepair, IDFailRef, pIdFailure
    ,pDateStamp, 0 , pIDUSER
    ,pIDCAUSE, pIDACTION, IdREPMSG
    ,pIDOWNREP , IdBatch
    ,pIdSerial, IdCauseCat
    FROM DUAL;


    pIDRePairToReturn := IdRepair ;

    END;
    /
    voici un exemple des paramètre que je lui passe :
    paq_repair.insertRepairBySerial(327665858.000000,1.000000,'060829100741',327666055.000000,304535904.000000,10.000000,7.000000,'','','C1','A2C00001919A','90001 LECTURE ET CONTROLE TEST PROOF')

    le package et les porcédure étaient existante mon but etait de renseigner des pas de test en plus

    Merci d'avance

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    171
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mars 2003
    Messages : 171
    Points : 97
    Points
    97
    Par défaut
    j'ai essayé de lancer la procédure du package via toad dans procedure editor avec ou sans "exec" puis "paq_repair.insert....." la réponse est la même no create [or replace]statement is found to execute
    et je ne vois rien dans le dbms output

  6. #6
    Membre éprouvé
    Inscrit en
    Avril 2006
    Messages
    1 024
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 1 024
    Points : 1 294
    Points
    1 294
    Par défaut


    T'es sur que tu as appelé la procédure j'ai l'impression que tu a tenté de la recompiler d'après le message, ce qui n'est pas du tout la meme chose...

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    171
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mars 2003
    Messages : 171
    Points : 97
    Points
    97
    Par défaut
    tu as raison je me suis trompé je compile au lieu de le lancer mais par contre
    je ne sais pas si je dois dans procedure editor
    mettre
    exec paq_repair.InsertRepairBySerial(327665858.000000,1.000000,'060829100741',327666055.000000,304535904.000000,10.000000,7.000000,'','','C1','A2C00001919A','90001 LECTURE ET CONTROLE TEST PROOF')
    car quand je fais ca je ne vois pas l'éclaire qi est le run

    ou si je dois mettre la procédure et à ce moment la ou je mets les params

  8. #8
    Membre éprouvé
    Inscrit en
    Avril 2006
    Messages
    1 024
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 1 024
    Points : 1 294
    Points
    1 294
    Par défaut
    en fait l'éclair te génère la séquence d'instructions à mettre dans un sql. Personellement, je copie ça dans mon clipboard (il faut utiliser le bouton prévu à cet effet) et je colle dans le SQL-Editor, comme ça j'adapte et j'active les dbms_output...

  9. #9
    Membre régulier
    Inscrit en
    Novembre 2006
    Messages
    236
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 236
    Points : 78
    Points
    78
    Par défaut
    Bonjour,

    Je debute avec le PL/SQL. J'ai une procedure à generer mais oracle me met "Avertissement : Procédure créée avec erreurs de compilation". Cette procedure génére un calendrier pour une année.
    Si vous avez des corrections, je suis prenante.

    Voici mon code :

    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
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
     
     
    CREATE OR REPLACE PROCEDURE SP_CREATE_ONE_YEAR (AN INTEGER)
    IS 
     
    DECLARE JOUR DATE
    DECLARE JOUR_DE_LAN DATE
    DECLARE JOUR_DEBUT DATE
    DECLARE JOUR_FIN DATE
    DECLARE i integer
    DECLARE JOUR_FIN_SEMAINE DATE
    DECLARE leapYear bit
    DECLARE ALEA INTEGER
     
    SET NOCOUNT ON
     
     
    SET DATEFIRST 1 
     
     
    --SET DATEFORMAT YMD
     
    SET TRANSACTION ISOLATION LEVEL SERIALIZABLE
    BEGIN TRANSACTION TRAN_INS_DATES
     
    SET JOUR_DE_LAN = to_date(to_char(AN) + '-01-01')
     
    SET JOUR_DEBUT = JOUR_DE_LAN - 6 DAY
    SET JOUR_FIN = to_date(to_char(AN + 1) + '-01-01')
     
    SET JOUR_FIN = adddate(JOUR_FIN, INTERVAL 5 DAY)
    SET JOUR = JOUR_DEBUT
     
    SET i = to_char(JOUR_DEBUT, "yyyy")
    IF NOT EXISTS(SELECT * FROM TR_BISSEXTILE WHERE  PAN_ID = i)
    BEGIN
    IF i % 4 = 0
    SET leapYear = 1
    ELSE
    SET leapYear = 0
    INSERT INTO TR_BISSEXTILE 
    VALUES (i, leapYear)
    --IF @@ERROR <> 0 BEGIN GOTO LBL_ERROR RETURN END
    END
     
    SET i = to_char( JOUR_FIN, "yyyy")
    IF NOT EXISTS(SELECT * FROM   TR_BISSEXTILE WHERE  PAN_ID = i)
    BEGIN
    IF i % 4 = 0 
    SET leapYear = 1
    ELSE
    SET leapYear = 0
    INSERT INTO TR_BISSEXTILE VALUES (i, leapYear)
    IF @@ERROR <> 0 BEGIN GOTO LBL_ERROR RETURN END
    END
     
     
    IF NOT EXISTS(SELECT * FROM TR_BISSEXTILE WHERE  PAN_ID = AN)
    BEGIN
    IF AN % 4 = 0 
    SET leapYear = 1
    ELSE SET leapYear = 0
    INSERT INTO TR_BISSEXTILE 
    VALUES (AN, leapYear)
    --IF @@ERROR <> 0 BEGIN GOTO LBL_ERROR RETURN END
    END
     
     
    WHILE JOUR < JOUR_FIN
    BEGIN
    SET ALEA = RAND() * 100000
    IF NOT EXISTS (SELECT * FROM DIM_TEMPS WHERE PJR_DATE = JOUR)
    BEGIN 
    INSERT INTO DIM_TEMPS (PJR_DATE, PAN_ID, PMS_ID, PJM_ID, PJS_ID, PJA_ID, PJR_ALEA) 
    VALUES (JOUR,to_char( JOUR, "yyyy"),to_char( JOUR, "mm"),to_char( JOUR, "dd"), TO_NUMBER(TO_CHAR(JOUR, 'D'), TO_NUMBER ( TO_CHAR ( JOUR , 'DDD' ) ) ALEA)
    --IF @@ERROR <> 0 BEGIN GOTO LBL_ERROR RETURN END
    END
     
    SET JOUR = adddate(JOUR, INTERVAL 1 DAY)
    END
     
     
     
    UPDATE DIM_TEMPS
    SET    PTR_ID = 1, PST_ID = 1
    WHERE  to_char(PJR_DATE, "mm") BETWEEN 1 AND 3
    AND  PAN_ID = AN AND PTR_ID IS NULL
    --IF @@ERROR <> 0 BEGIN GOTO LBL_ERROR RETURN END
     
    UPDATE DIM_TEMPS
    SET    PTR_ID = 2, PST_ID = 1
    WHERE  to_char(PJR_DATE, "mm") BETWEEN 4 AND 6
    AND  PAN_ID = AN AND PTR_ID IS NULL
    --IF @@ERROR <> 0 BEGIN GOTO LBL_ERROR RETURN END
     
    UPDATE DIM_TEMPS
    SET    PTR_ID = 3, PST_ID = 2
    WHERE  to_char(PJR_DATE, "mm") BETWEEN 7 AND 9
    AND  PAN_ID = AN AND PTR_ID IS NULL
    --IF @@ERROR <> 0 BEGIN GOTO LBL_ERROR RETURN END
     
    UPDATE DIM_TEMPS
    SET    PTR_ID = 4, PST_ID = 2
    WHERE to_char(PJR_DATE, "mm") BETWEEN 10 AND 12
    AND  PAN_ID = AN AND PTR_ID IS NULL 
    --IF @@ERROR <> 0 BEGIN GOTO LBL_ERROR RETURN END
     
    SET JOUR = JOUR_DE_LAN
    IF TO_NUMBER(TO_CHAR(JOUR, 'D') > 4
    BEGIN
    WHILE TO_NUMBER(TO_CHAR(JOUR, 'D') <> 1
     
    SET JOUR = adddate(JOUR, INTERVAL 1 DAY)
    END
    ELSE
    BEGIN
    WHILE TO_NUMBER(TO_CHAR(JOUR, 'D') <> 1
    SET JOUR = DATEADD(DAY, -1, JOUR)
    SET JOUR =  JOUR - 1 DAY
     
    END
    SET i = 1
    WHILE adddate(JOUR, INTERVAL 7 DAY) < JOUR_FIN
    BEGIN
    UPDATE DIM_TEMPS
    SET PSM_ID = i
    WHERE PJR_DATE BETWEEN JOUR AND adddate(JOUR, INTERVAL 6 DAY)
    --IF @@ERROR <> 0 BEGIN GOTO LBL_ERROR RETURN END
    SET JOUR = (JOUR, INTERVAL 7 DAY)
    SET i = i + 1
    END
     
    SET NOCOUNT OFF
    COMMIT TRANSACTION TRAN_INS_DATES
     
    RETURN
     
    LBL_ERROR:
    ROLLBACK TRANSACTION TRAN_INS_DATES
     
    /
    Merci bcp!

  10. #10
    Membre chevronné Avatar de Garuda
    Homme Profil pro
    Chef de projet / Urbaniste SI
    Inscrit en
    Juin 2007
    Messages
    1 285
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Chef de projet / Urbaniste SI
    Secteur : Bâtiment

    Informations forums :
    Inscription : Juin 2007
    Messages : 1 285
    Points : 2 071
    Points
    2 071
    Par défaut
    Steinia,

    Il me semble que ton post en pollue un autre !

    Merci de faire un nouveau post
    et de lire les rêgles du forum
    http://club.developpez.com/regles

  11. #11
    Membre chevronné Avatar de Garuda
    Homme Profil pro
    Chef de projet / Urbaniste SI
    Inscrit en
    Juin 2007
    Messages
    1 285
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Chef de projet / Urbaniste SI
    Secteur : Bâtiment

    Informations forums :
    Inscription : Juin 2007
    Messages : 1 285
    Points : 2 071
    Points
    2 071
    Par défaut
    Pour debugger

    1) creer un procedure test
    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
     
    /* Formatted on 2007/08/01 17:45 (Formatter Plus v4.8.8) */
    CREATE OR REPLACE PROCEDURE TEST
    AS
    BEGIN
       paq_repair.insertrepairbyserial (327665858.000000,
                                        1.000000,
                                        '060829100741',
                                        327666055.000000,
                                        304535904.000000,
                                        10.000000,
                                        7.000000,
                                        '',
                                        '',
                                        'C1',
                                        'A2C00001919A',
                                        '90001 LECTURE ET CONTROLE TEST PROOF'
                                       );
    END;
    2) Se mettre en mode debug (Menu Debug>Dbms debugger)
    3) Charger la procedure test dans l'editeur
    4) Mettre un point d'arret sur une ligne (SHIFT+F5)
    5) Faire 'Execute' (F11)
    6) A la question "Do you want to compile", répondre Oui
    Utiliser les icones de debug (ou le menu du meme nom)
    ATTENTION : le 6) compile en mode debug toutes les procedures, packages et fonctions appelés par la procédure TEST . Il faudra peut-etre les recompiler plus tard (sans le mode debug)

    NB : Si tu as une version officielle de Toad, je te conseille de charger la dernière version (9.1 gratuit pour les utilisateurs enregistrés)

    TOUT CA EST DANS L'AIDE DE TOAD


Discussions similaires

  1. Réponses: 4
    Dernier message: 26/05/2011, 17h39
  2. passage d'un nom de table dans une procédure stockée
    Par thierry V dans le forum MS SQL Server
    Réponses: 7
    Dernier message: 26/07/2010, 17h48
  3. [DEBUTANT]faire une boucle dans une procédure stockée
    Par tripper.dim dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 21/06/2007, 14h49
  4. [DEBUTANT]Récupérer plusieurs champs dans une procédure stockée
    Par tripper.dim dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 20/06/2007, 18h58
  5. Fin de programme dans une procédure
    Par Sinclair dans le forum Langage
    Réponses: 13
    Dernier message: 29/11/2002, 23h30

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