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 :

Procédure stockée - Package - Curseur


Sujet :

PL/SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Développeur Décisionnel Junior
    Inscrit en
    Décembre 2018
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Décisionnel Junior

    Informations forums :
    Inscription : Décembre 2018
    Messages : 7
    Par défaut Procédure stockée - Package - Curseur
    Bonjour à tous,

    Je viens vous demander de l'aide en raison d'un problème que je rencontre en SQL.

    Je dois créer une procédure qui permet de lire dans une table de paramétrage et qui appellera différentes fonctions par la suite. Actuellement j'ai créé le Package dans lequel la procédure est stockée et je tente d'exécuter la procédure avant de rajouter les fonctions à l'intérieur.

    Le but étant à termes de :
    1) Je reçois un nom de partition
    2) Je le donne en paramètre à une procédure pour une table de paramétrage elle aussi en paramètre.
    3) J'appelle une fonction au sein de cette procédure qui récupère ses paramètres depuis la table de paramétrage.
    4) Le tout étant parallélisable par grâce à la procédure afin de pouvoir traiter plusieurs partitions simultanément.


    Actuellement mon code se constitue de cette manière :
    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
     
    create or replace PACKAGE BODY                                                 Mon_PACKAGE AS 
     
     
    PROCEDURE Lecture_Table_Param (
        P_E_C_Table_Param       VARCHAR2,
        P_E_C_Nom_Partition        VARCHAR2
        )    
    AS 
        Requete                  VARCHAR2(2000);
        Schema                  VARCHAR2(50); -- Nom de la colonne contenant le nom du schema a analyser
        Appli                      VARCHAR2(50); -- Nom de la colonne contenant le nom de l appli a analyser
        Table                      VARCHAR2(50); -- Nom de la colonne contenant le nom de la table a analyser
        Partition                 VARCHAR2(50); -- Nom de la colonne contenant le nom de la partition a analyser
        Champ                   VARCHAR2(50); -- Nom de la colonne contenant le nom de la colonne a analyser
        ID                          VARCHAR2(50); -- ID du couple Partion/Colonne
        C_cursor                 SYS_REFCURSOR ;
        Curseur                  VARCHAR2(1000);
     
     
    BEGIN
     
    Curseur := 'SELECT Champ_ID,Champ_Appli, Champ_Table, Champ_Partition, Champ_Champs
                      FROM '||P_E_C_Table_Param||'
                     WHERE Champ_Partition= '''||P_E_C_Part_table||''')';
     
           OPEN C_cursor for Curseur ;
                  LOOP
                  FETCH C_cursor INTO ID, Appli, Table, Partition, Champ;
                  EXIT WHEN C_cursor%NOTFOUND;
     
                  Requete         := 'dbms_output.put_line(Champ_Appli:      '|| V_C_Appli||'
                                                                            Champ_Table:      '|| V_C_Table||'
                                                                            Champ_Partition:  '|| V_C_Partition||'
                                                                            Champ_Champs:  '|| V_C_Champ||'
                                                                            Champ_ID:           '|| ID||')'
                                                                               ;
                                  EXECUTE IMMEDIATE Requete;
                  END LOOP;
        CLOSE C_cursor;
    EXCEPTION 
        WHEN NO_DATE_FOUND THEN 
        RAISE;
    END;
     
    END Mon_PACKAGE ;

    ça c'est pour la procédure stockée dans le package.

    Maintenant je tente de faire un script pour utiliser cette procédure en faisant un test simple :
    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
     
    SET SERVEROUTPUT ON;
    SET SERVEROUT ON;
    DBMS_OUTPUT.ENABLE ( taille_tampon IN NUMBER (20000));
     
    DECLARE
    P_E_C_Table_Param    VARCHAR2(100);
    P_E_C_Part_table        VARCHAR2(100);
        Requete                  VARCHAR2(2000);
        Schema                  VARCHAR2(50); -- Nom de la colonne contenant le nom du schema a analyser
        Appli                      VARCHAR2(50); -- Nom de la colonne contenant le nom de l appli a analyser
        Table                      VARCHAR2(50); -- Nom de la colonne contenant le nom de la table a analyser
        Partition                 VARCHAR2(50); -- Nom de la colonne contenant le nom de la partition a analyser
        Champ                   VARCHAR2(50); -- Nom de la colonne contenant le nom de la colonne a analyser
        ID                          VARCHAR2(50); -- ID du couple Partion/Colonne
        C_cursor                 SYS_REFCURSOR ;
        Curseur                  VARCHAR2(1000);
     
    BEGIN
     
    USER_ORACLE.Mon_PACKAGE.Lecture_Table_Param ('USER_ORACLE.Nom_Table','Nom_Partition');
     
    dbms_output.put_line('V_C_Schema:      '|| V_C_Schema);
    dbms_output.put_line('V_C_Appli:          '|| V_C_Appli);
    dbms_output.put_line('V_C_Table:         '|| V_C_Table);
    dbms_output.put_line('V_C_Partition:     '|| V_C_Partition);
    dbms_output.put_line('V_C_Champ:       '|| V_C_Champ);
    dbms_output.put_line('V_C_ID:              '|| V_C_ID);
    END;

    Au niveau de ma base de données, j'ai volontairement mis pour tester une seule ligne dans USER_ORACLE.Nom_Table mais la commande SQL ne fonctionne pas...

    J'obtiens en retour :
    Rapport d'erreur -
    ORA-00933: la commande SQL ne se termine pas correctement
    ORA-06512: à "USER_ORACLE.Mon_PACKAGE", ligne 27
    ORA-06512: à ligne 15
    00933. 00000 - "SQL command not properly ended"
    *Cause:
    *Action:
    Je n'arrive pas à trouver la solution ni d'où vient l'erreur malgré de nombreuses recherches...

  2. #2
    Membre éprouvé
    Avatar de Sunchaser
    Homme Profil pro
    OPNI (Objet Programmant Non Identifié)
    Inscrit en
    Décembre 2004
    Messages
    2 059
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : OPNI (Objet Programmant Non Identifié)
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Décembre 2004
    Messages : 2 059
    Par défaut
    Bonjour,

    Pas sûr que ce que je vais dire soit la cause de tes problèmes, mais dans ton package, ligne 25 - la ou tu termine la création de ton SQL dynamique, je vois une parenthèse ')' alors que je n'en vois aucune autre avant (on devrait trouver un '(' qq part avant, donc).
    Autre point, es-tu sûr que tu peux utiliser le nom de variable "Table" dans ton code? De mon côté, Toad for Oracle me jette en me disant que c'est un mot réservé / a "usage interne" uniquement donc).
    Ton package compile?

    Tu pourrais faire un DBMS_OUTPUT afin de sortir ce que donne "Curseur", et executer le code, afin de voir si ça tourne, dans un premier temps.

    @+

  3. #3
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 954
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 954
    Par défaut
    Par ailleurs pas besoin de EXECUTE IMMEDIATE pour utiliser DBMS_OUTPUT

Discussions similaires

  1. Problème compilation procédure stockée avec curseur
    Par guillaumerivière7 dans le forum SQL Procédural
    Réponses: 1
    Dernier message: 23/08/2015, 11h11
  2. [11g] Procédure stockée et curseur
    Par fetano dans le forum PL/SQL
    Réponses: 1
    Dernier message: 30/06/2014, 11h08
  3. Procédure stockée et curseur
    Par sandrim dans le forum ASP
    Réponses: 2
    Dernier message: 02/10/2006, 16h09
  4. Procédure stockée avec retour de curseur
    Par Oufti dans le forum MS SQL Server
    Réponses: 7
    Dernier message: 07/11/2005, 22h40
  5. Réponses: 2
    Dernier message: 24/08/2005, 11h54

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