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