2009-04-16 3 views
1

Je travaille sur un paquet avec quelques procédures et je rencontre un peu de problèmes. Lorsque j'essaie de tester la procédure pour convertir des gallons en litres ou les autres procédures, il imprime simplement ce qui a été déclaré dans le bloc sans nom au lieu de convertir les nombres. Des idées?PL/SQL: La procédure ne fonctionne pas correctement dans un paquet

CREATE OR REPLACE PACKAGE eng_metric 
IS 
    PROCEDURE convert(degree_fahrenheit IN OUT NUMBER,degree_celsius IN OUT NUMBER,measure IN VARCHAR2); 

    PROCEDURE convert(liters IN OUT NUMBER,gallons IN OUT NUMBER); 
END eng_metric; 
/

CREATE OR REPLACE PACKAGE BODY eng_metric 
AS 
    PROCEDURE Convert 
     (degree_fahrenheit IN OUT NUMBER, 
     degree_celsius  IN OUT NUMBER, 
     measure   IN VARCHAR2) 
    IS 
    df   NUMBER; 
    dc   NUMBER; 
    convertf NUMBER; 
    measurecf VARCHAR2(4); 
    BEGIN 
    measurecf := measure; 

    df := degree_fahrenheit; 

    dc := degree_celsius; 

    IF measure = 'TEMP' THEN 
     IF dc = NULL THEN 
     convertf := ((df - 32) * .56); 

     degree_fahrenheit := convertf; 

     dbms_output.Put_line('The temperature in fahrenheit is ' 
          ||To_char(degree_fahrenheit)); 
     ELSIF df = NULL THEN 
     convertf := (dc + 17.98) * 1.8; 

     degree_celsius := convertf; 
     END IF; 
    ELSE 
     dbms_output.Put_line('Invalid measure'); 
    END IF; 
    END convert; 

    PROCEDURE Convert 
     (liters IN OUT NUMBER, 
     gallons IN OUT NUMBER) 
    IS 
    lit  NUMBER; 
    gal  NUMBER; 
    convertlg NUMBER; 
    BEGIN 
    lit := liters; 

    gal := gallons; 

    IF gal = NULL THEN 
     convertlg := (lit/3.785); 

     liters := convertlg; 
    ELSIF lit = NULL THEN 
     convertlg := (gal * 3.785); 

     gallons := convertlg; 
    END IF; 
    END convert; 
END eng_metric; 
/

DECLARE 
    liters NUMBER := 25; 
    gallons NUMBER := 41; 
    nully NUMBER := NULL; 
BEGIN 
    eng_metric.Convert(nully,gallons); 

    dbms_output.Put_line(To_char(gallons)); 
END; 
/

Répondre

5

Au lieu de

IF gal = NULL THEN 

vous avez besoin

IF gal IS NULL 
+0

Il existe un certain nombre de vérifications nuls qui souffrent de ce problème – ninesided

0

Ce que vous devez retenir est que NULL signifie "aucune valeur". Il n'est jamais égal ou n'égal à rien, y compris NULL. Vous devez donc utiliser IS NULL ou IS NOT NULL ou utiliser la fonction NVL pour remplacer le null par un objet ayant une valeur.

Questions connexes