2

I created a procedure for calculating salary of employees by considering shift table data my shift table is ,

CREATE TABLE SHIFT
        (SHIFT_ID NUMBER(4),
        SHIFT_DATE DATE,
        CUSTOMER_ID NUMBER(4),
        SERVICE_ID NUMBER(4),
        EMPLOYEE_ID  NUMBER(4),
        SHIFT_CHARGE FLOAT(10), 
        PRIMARY KEY(SHIFT_ID)
        );

my procedure is,

CREATE OR REPLACE PROCEDURE CAL_SALLARY
AS
CURSOR SHIFT_CURSOR IS SELECT EMPLOYEE_ID,SUM(SHIFT_CHARGE) AS SALARY FROM SHIFT GROUP BY EMPLOYEE_ID;
BEGIN
    OPEN SHIFT_CURSOR;
    LOOP
        FETCH SHIFT_CURSOR INTO SHIFT_REC;
        EXIT WHEN SHIFT_CURSOR%NOTFOUND;
        DBMS_OUTPUT.PUT_LINE('EMPLOYYE ID : '||SHIFT_REC.EMPLOYEE_ID||' SALARY : '||SHIFT_REC.SALARY);
    END LOOP;
    CLOSE SHIFT_CURSOR; 
END;
/

But when I try to run this procedure in SQL plus, it says compilation fails. I count found what's the issue. please anyone help me.

1
  • As a minor side note: salary is spelled with a single "L". Commented May 30, 2020 at 14:30

1 Answer 1

2

You forgot to declare cursor variable (see line #7):

SQL> CREATE OR REPLACE PROCEDURE CAL_SALLARY
  2  AS
  3  CURSOR SHIFT_CURSOR IS
  4    SELECT EMPLOYEE_ID, SUM(SHIFT_CHARGE) AS SALARY
  5    FROM SHIFT GROUP BY EMPLOYEE_ID;
  6
  7    shift_Rec shift_cursor%rowtype;
  8  BEGIN
  9      OPEN SHIFT_CURSOR;
 10      LOOP
 11          FETCH SHIFT_CURSOR INTO SHIFT_REC;
 12          EXIT WHEN SHIFT_CURSOR%NOTFOUND;
 13          DBMS_OUTPUT.PUT_LINE('EMPLOYYE ID : '||SHIFT_REC.EMPLOYEE_ID
 14                                ||' SALARY : '||SHIFT_REC.SALARY);
 15      END LOOP;
 16      CLOSE SHIFT_CURSOR;
 17  END;
 18  /

Procedure created.

SQL>

A simpler option is cursor FOR loop; Oracle does most of dirty job for you (e.g. declaring cursor variable, opening and closing cursor, exiting the loop):

SQL> create or replace procedure cal_sallary as
  2  begin
  3    for shift_rec in (select employee_id, sum(shift_charge) as salary
  4                      from shift
  5                      group by employee_id
  6                     )
  7    loop
  8      dbms_output.put_line('EMPLOYYE ID : '||shift_rec.employee_id
  9                           ||' SALARY : '||shift_rec.salary);
 10    end loop;
 11  end;
 12  /

Procedure created.

SQL>
Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.