Home > Software engineering >  PL/SQL Conditional Statement
PL/SQL Conditional Statement

Time:09-22

This is regarding PL/SQL conditional statements. Since I'm new to this language, can someone help me to find the error on this code? The error msg is given below.

DECLARE
    stock_rec stock%ROWTYPE;
    var_company stock.company%TYPE := 'IBM';
BEGIN
    SELECT * INTO stock_rec
    FROM stock s
    WHERE s.company = var_company;
        BEGIN
            IF (stock_rec.price < 45) THEN
                DBMS_PUTPUT.PUT_LINE('Current price is very low !');
            ELSIF (stock_rec.price >= 45 AND stock_rec.price < 55) THEN
                DBMS_PUTPUT.PUT_LINE('Current price is low !');
            ELSIF (stock_rec.price >= 55 AND stock_rec.price < 65) THEN
                DBMS_PUTPUT.PUT_LINE('Current price is medium !');
            ELSIF (stock_rec.price >= 65 AND stock_rec.price < 75) THEN
                DBMS_PUTPUT.PUT_LINE('Current price is medium high !');
            ELSE (stock_rec.price >= 75) 
                DBMS_PUTPUT.PUT_LINE('Current price is high !');
            END IF;
        END;
END;
/
    

-------error msg---------------------------------------------

ORA-06550: line 17, column 40: PLS-00103: Encountered the symbol ")" when expecting one of the following:

  • & - / at mod remainder rem <an exponent (**)> and or as || multiset The symbol "* was inserted before ")" to continue.

CodePudding user response:

The last ELSE should actually be ELSIF (and then you have THEN missing):

ELSIF (stock_rec.price >= 75) THEN 

Also, you most probably don't need inner BEGIN-END.

DECLARE
    stock_rec stock%ROWTYPE;
    var_company stock.company%TYPE := 'IBM';
BEGIN
    SELECT * INTO stock_rec
    FROM stock s
    WHERE s.company = var_company;
        
    IF (stock_rec.price < 45) THEN
        DBMS_PUTPUT.PUT_LINE('Current price is very low !');
    ELSIF (stock_rec.price >= 45 AND stock_rec.price < 55) THEN
        DBMS_PUTPUT.PUT_LINE('Current price is low !');
    ELSIF (stock_rec.price >= 55 AND stock_rec.price < 65) THEN
        DBMS_PUTPUT.PUT_LINE('Current price is medium !');
    ELSIF (stock_rec.price >= 65 AND stock_rec.price < 75) THEN
        DBMS_PUTPUT.PUT_LINE('Current price is medium high !');
    ELSIF (stock_rec.price >= 75) THEN 
        DBMS_PUTPUT.PUT_LINE('Current price is high !');
    END IF;
    
END;
/
   

CodePudding user response:

You can simplify the code to use a single DBMS_OUTPUT.PUT_LINE statement if you use a CASE expression:

DECLARE
  stock_rec stock%ROWTYPE;
  var_company stock.company%TYPE := 'IBM';
BEGIN
  SELECT *
  INTO   stock_rec
  FROM   stock
  WHERE  company = var_company;

  DBMS_PUTPUT.PUT_LINE(
    CASE
    WHEN stock_rec.price < 45
    THEN 'Current price is very low !'
    WHEN stock_rec.price < 55
    THEN 'Current price is low !'
    WHEN stock_rec.price < 65
    THEN 'Current price is medium !'
    WHEN stock_rec.price < 75
    THEN 'Current price is medium high !'
    WHEN stock_rec.price >= 75
    THEN 'Current price is high !'
    ELSE NULL
    END
  );
END;
/
  • Related