2009-04-16 6 views
1

Ich arbeite an einem Paket mit einigen Prozeduren in ihnen und ich bin in ein bisschen Ärger geraten. Wenn ich versuche, das Verfahren zum Umwandeln von Gallonen in Liter oder die anderen Verfahren zu testen, druckt es nur aus, was im unbenannten Block deklariert wurde, anstatt die Zahlen zu konvertieren. Irgendwelche Ideen?PL/SQL: Prozedur funktioniert nicht korrekt in einem Paket

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; 
/

Antwort

5

Statt

IF gal = NULL THEN 

Sie benötigen

IF gal IS NULL 
+0

Es gibt eine Reihe von Null-Checks, die unter diesem Problem leiden – ninesided

0

Was haben Sie sich zu erinnern ist, dass NULL bedeutet "keinen Wert". Es ist NIE gleich oder nicht gleichwertig, einschließlich NULL. Sie müssen also IS NULL oder IS NOT NULL verwenden oder die NVL-Funktion verwenden, um die Null in einen Wert mit einem Wert zu ändern.