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