2012-10-31 6 views
0
CREATE OR REPLACE PROCEDURE ABC (REG_NO IN CO_ENROLMENT.S_REGNO%TYPE, 
            TERM  IN COURSEOFFERING.CO_TERMNUMBER%TYPE, 
            YEAR  IN COURSEOFFERING.CO_YEAR%TYPE, 
            CO_TITLE IN COURSE.C_TITLE%TYPE, 
            EN_DATE OUT CO_ENROLMENT.COE_ENROLDATE%TYPE, 
            COM_ST OUT CO_ENROLMENT.COE_COMPLETIONSTATUS%TYPE) 

AS 
BEGIN 
    SELECT M.COE_COMPLETIONSTATUS, M.COE_ENROLDATE 
    INTO COM_ST, EN_DATE 
    FROM COURSEOFFERING O 
    INNER JOIN COURSE C 
      ON C.C_ID = O.C_ID 
    INNER JOIN CO_ENROLMENT M 
      ON M.CO_ID = O.CO_ID 
    WHERE M.S_REGNO LIKE REG_NO AND 
      O.CO_TERMNUMBER LIKE TERM AND 
      O.CO_YEAR LIKE YEAR AND 
      C.C_TITLE LIKE CO_TITLE; 
END ABC; 

J'ai écrit ci-dessus procédure. est Ci-dessous bloc PL/SQL pour appeler procédure ci-dessus,Procédures dans PLSQL utilisant ORACLE DB

DECLARE 
    COMPL_STATUS CO_ENROLMENT.COE_COMPLETIONSTATUS%TYPE; 
    ENROL_DATE  CO_ENROLMENT.COE_ENROLDATE%TYPE; 
BEGIN 
    ABC (44444444, 2009, 2, 'PLSQL Programming', 
     EN_DATE => enrol_date, COM_ST =>compl_status); 
    DBMS_OUTPUT.PUT_LINE ('STUDENT COMPLETION STATUS AND ENROLMENT DATE IS ' 
         || ENROL_DATE 
         || ' ' 
         || compl_status); 
END; 

Il me renvoie une erreur car aucune donnée trouvée, mais quand je lance une requête, séparément je reçois la sortie. Je ne pouvais pas comprendre ce qui ne va pas. Ai-je écrit correctement le bloc de procédure et les paramètres passés dans le bloc PL/SQL sont-ils corrects?

+0

Si votre procédure n'effectue aucune insertion/mise à jour/suppression, pourquoi ne pas utiliser une fonction à la place? – user75ponic

+0

Tout fonctionne correctement, sauf que les valeurs de sortie ne sont pas imprimées ...... la ligne de sortie est imprimée, c'est-à-dire STATUT DE L'EXÉCUTION DE L'ÉLÉMENT ET DATE D'INSCRIPTION EST mais aucune valeur pour ENROL_DATE et COMPL_STATUS. J'ai également vérifié avec juste la requête et il m'a renvoyé des valeurs de sortie avec les mêmes paramètres d'entrée. Je pense que le problème est quelque part en passant ou en récupérant des paramètres de sortie bien que je ne sois pas sûr. – Pravin

+0

Pourquoi passez-vous la valeur 2009 à terme et 2 à l'année? Sûrement ces paramètres devraient être inversés. Il semble que vous auriez avantage à toujours utiliser la notation des paramètres nommés (comme pour les deux derniers paramètres). –

Répondre

0

Vous appelez votre procédure stockée de manière incorrecte. Vous devez spécifier des paramètres dans l'ordre correct, ou utiliser la notation de paramètre nommé, à savoir

ABC (44444444, 2, 2009, 'PLSQL Programming', enrol_date, compl_status); 

ou

ABC (REG_NO => 44444444, YEAR => 2009, TERM => 2, 
    CO_TITLE => 'PLSQL Programming', 
    EN_DATE => enrol_date, COM_ST =>compl_status); 

Vous pouvez voir que si vous utilisez nommé la notation des paramètres que vous pouvez spécifier des paramètres dans un ordre différent (ou pas du tout si les paramètres ont des valeurs DEFAULT).

1

En proc vous avez l'année à la troisième place mais vous l'appelez à la deuxième place. Et comment sont déclarés les types (COURSEOFFERING.CO_TERMNUMBER% TYPE, COURSEOFFERING.CO_TERMNUMBER% TYPE)?

+0

J'ai déclaré tout le champ avec le même type que celui de la colonne d'une table spécifiée. – Pravin

+0

Ind quoi sur le changement de paramètre – elrado

+0

ne fonctionne toujours pas !!! :-( – Pravin

1

Lorsque l'instruction select dans votre procédure ABC ne renvoie aucune ligne, l'exception NO_DATA_FOUND sera déclenchée et l'exécution de votre procédure stockée sera interrompue. Pour éviter un tel comportement, vous devez ajouter la section EXCEPTION dans la procédure stockée pour intercepter l'exception et réagir de manière appropriée. À cette fin, la section d'exécution de votre procédure stockée pourrait ressembler:

BEGIN 
    SELECT M.COE_COMPLETIONSTATUS, M.COE_ENROLDATE 
    INTO COM_ST, EN_DATE 
    FROM COURSEOFFERING O 
    INNER JOIN COURSE C 
      ON C.C_ID = O.C_ID 
    INNER JOIN CO_ENROLMENT M 
      ON M.CO_ID = O.CO_ID 
    WHERE M.S_REGNO LIKE REG_NO AND 
      O.CO_TERMNUMBER LIKE TERM AND 
      O.CO_YEAR LIKE YEAR AND 
      C.C_TITLE LIKE CO_TITLE; 
EXCEPTION 
    WHEN NO_DATA_FOUND 
    THEN DBMS_OUTPUT.PUT_LINE('No data found') -- for example 
END ABC 

Ou si vous voulez poursuivre, même si select déclaration soulève exception vous pourriez joindre votre déclaration select avec bloc imbriqué BEGIN .. END.

BEGIN 
    -- some code before 
    BEGIN  
    SELECT M.COE_COMPLETIONSTATUS, M.COE_ENROLDATE 
     INTO COM_ST, EN_DATE 
     FROM COURSEOFFERING O 
     INNER JOIN COURSE C 
       ON C.C_ID = O.C_ID 
     INNER JOIN CO_ENROLMENT M 
       ON M.CO_ID = O.CO_ID 
     WHERE M.S_REGNO LIKE REG_NO AND 
      O.CO_TERMNUMBER LIKE TERM AND 
      O.CO_YEAR LIKE YEAR AND 
      C.C_TITLE LIKE CO_TITLE; 
    EXCEPTION 
    WHEN NO_DATA_FOUND 
    THEN DBMS_OUTPUT.PUT_LINE('No data found') -- for example 
    END; 
    -- some code after 
END ABC 
1

Vous n'avez probablement pas de caractères génériques dans votre requête de procédure.

16:02:06 [email protected]> select * from dual where 'abc' like 'ab'; 

no rows selected              


16:02:18 [email protected]> select * from dual where 'abc' like 'ab%'; 

D                 
-                 
X                 

Sans eux, C.C_TITLE LIKE CO_TITLE est égal à C.C_TITLE = CO_TITLE, qui n'est pas neccessarily ce que vous voulez.

Essayez C.C_TITLE LIKE '%'||CO_TITLE||'%' etc.

+0

Cool mec .......... yippe ... ohh l'homme après tant de lutte a finalement eu la sortie !!! Merci beaucoup le joker était le coupable ..... mais j'avais utilisé la fonction TRIM, ça aurait dû me donner le résultat? – Pravin

+0

peut-être. peut être pas. Cela dépend de quoi et comment vous étiez. Je ne peux pas dire sans voir le code réel avec les données. –