Re: compilation error in plsql

From: <fitzjarrell_at_cox.net>
Date: Mon, 7 Apr 2008 13:28:52 -0700 (PDT)
Message-ID: <8a9ceb9a-2da8-4ee2-8056-0564de997132@59g2000hsb.googlegroups.com>


On Apr 7, 2:59 pm, chris <lazyboy..._at_yahoo.com> wrote:
> Hi,
>
> I'm a new learner of pl/sql programing & try to write a basic
> function; however, I can't figure out why my function is not compiling
> correctly.  Could someone pls let me know if you see where is the
> problem?  This is 10g & I'm writing it using iSQL*PLUS.
>
> CREATE OR REPLACE  FUNCTION check_sal (empno employees.employee_id
> %TYPE)
> RETURN boolean IS
>
>    dept_id   employees.department_id%TYPE;
>    sal         employees.salary%TYPE;
>    avg_sal   employees.salary%TYPE;
>
> BEGIN
>    SELECT salary, department_id, INTO sal, dept_id FROM employees
> WHERE employee_id = empno;
>    SELECT AVG(salary) INTO avg_sal FROM employees WHERE department_id
> = dept_id;
>
>    IF sal > avg_sal THEN
>       RETURN TRUE;
>    ELSE
>       RETURN FALSE;
>    END IF;
> END;
> /
> show errors
>
> Errors for FUNCTION CHECK_SAL:
>
> LINE/COL        ERROR
> 8/4     PL/SQL: SQL Statement ignored
> 8/34    PL/SQL: ORA-00936: missing expression
>
> TIA,
> -Chris

You have two errors: returning a boolean outside of a PL/SQL block and the extra comma after department_id in your select list. Fixing such issues gives you:

CREATE OR REPLACE FUNCTION check_sal (empno IN employees.employee_id %type)
RETURN number IS

   dept_id employees.department_id%TYPE;    sal employees.salary%TYPE;
   avg_sal employees.salary%TYPE;

BEGIN
   SELECT salary, department_id INTO sal, dept_id FROM employees    WHERE employee_id = empno;
   SELECT AVG(salary) INTO avg_sal FROM employees WHERE department_id

  • dept_id;

   IF sal > avg_sal THEN

      RETURN 1;
   ELSE
      RETURN 0;
   END IF;
END;
/

And will produce the following output to a SQL*Plus prompt:

SQL> select check_sal(7743) from employees;

CHECK_SAL(7743)


              1
              1
              1
              1

SQL> Of course if you're planning on using this only within a PL/SQL block you can return a BOOLEAN and not produce an error.

David Fitzjarrell Received on Mon Apr 07 2008 - 15:28:52 CDT

Original text of this message