Home > Software design >  Function compiled but no output in oracle
Function compiled but no output in oracle

Time:10-07

I'm trying to write a stored function that takes an integer N as input and returns the sum of all numbers divisible by 3 or by 5 and less than or equal to N.

SET SERVEROUTPUT ON;

CREATE OR REPLACE FUNCTION somme_mod(N in INTEGER) RETURN INTEGER
as
somme INTEGER:= 0;
i INTEGER:= 0;


BEGIN
    WHILE i <= N LOOP
        IF i MOD 3 = 0 OR i MOD 5 = 0 THEN
            somme := somme   i;
        END IF;
            i := i 1;

    END LOOP;
    RETURN (somme);
    
    DBMS_OUTPUT.PUT_LINE(somme_mod(5));

END;
/

I'm getting this:

Function SOMME_MOD compiled

This version has worked for me

SET SERVEROUTPUT ON;
DECLARE
FUNCTION somme_mod(N in INTEGER) 
RETURN INTEGER
as
somme INTEGER:= 0;
i INTEGER:= 0;

BEGIN
    WHILE i <= N LOOP
        IF i MOD 3 = 0 OR i MOD 5 = 0 THEN
            somme := somme   i;
        END IF;
        
        i := i 1;
    END LOOP;
    RETURN (somme);
END;
BEGIN
    DBMS_OUTPUT.PUT_LINE(somme_mod(19));
END;
/

CodePudding user response:

You only compiled the procedure, that's what the CREATE OR REPLACE does - hence that feedback from the database.

Now if you want to actually execute your function, you need to invoke it.

The easiest way to do that is with SQL.

select somme_mod(1) from dual;

No comment on your PL/SQL but be careful you don't get into a LOOP that NEVER ends...and then never makes it to the RETURN.

CodePudding user response:

Not the way to do it. Try this instead:

CREATE OR REPLACE FUNCTION somme_mod(N in INTEGER) RETURN INTEGER
as
somme INTEGER:= 0;
i INTEGER:= 0;
BEGIN
    WHILE i <= N LOOP
        IF i MOD 3 = 0 OR i MOD 5 = 0 THEN
            somme := somme   i;
            i := i 1;
        END IF;
    END LOOP;
    RETURN (somme);
END;
/

    
select somme_mod(5) from dual;
/

or

 declare 
   result integer;
 begin
   result := somme_mod(5) ;
   dbms_output.put_line(result);
end;
/
  • Related