封装
create or replace package PKG_PROJECT AS
type cur IS REF CURSOR;
procedure SP_PREPARESALARY(v_yr in number,v_mn in number);
END PKG_PROJECT;
PACKAGE BODY
第29行忽略了PL / SQL语句(就在相关的插入查询之前)
create or replace package body PKG_PROJECT AS
procedure SP_PREPARESALARY(v_yr in number,v_mn in number) AS
V_EMPNO INTEGER;
V_EMPNAME VARCHAR2(30);
V_BASICSALARY INTEGER;
V_DAYSPRESENT INTEGER;
V_YEAR INTEGER;
V_MONTH INTEGER;
V_PF INTEGER;
V_TAX INTEGER;
V_MON_SAL INTEGER;
V_NET_SAL INTEGER;
V_MAXDAYS INTEGER;
CURSOR EMP_VALUES IS
SELECT EMPNO, EMPNAME, BASICSALARY, YEAR, MONTH, DAYSPRESENT
FROM DELL_EMPLOYEE, DELL_ATTENDANCE
WHERE EMPNO=ENO AND YEAR = V_YR AND MONTH = V_MN;
BEGIN
OPEN EMP_VALUES;
LOOP
FETCH EMP_VALUES INTO V_EMPNO,V_EMPNAME,V_BASICSALARY,V_YEAR,V_MONTH,V_DAYSPRESENT;
EXIT WHEN EMP_VALUES%NOTFOUND;
V_YEAR := V_YR;
V_MONTH := V_MN;
V_MAXDAYS := FN_GETMAXDAYS(V_YEAR,V_MONTH);
V_MON_SAL:= FN_GETGROSSMONTHLYSALARY(V_BASICSALARY, V_DAYSPRESENT, V_MAXDAYS);
V_PF:= FN_GETPF(V_MON_SAL);
V_TAX:= FN_GETTAX(V_MON_SAL,V_PF);
V_NET_SAL:= FN_GETNETSALARY(V_MON_SAL, V_PF, V_TAX);
INSERT INTO DELL_SALARY (EMPNO, YEAR,MONTH,EMPNAME,DAYSPRESENT,BASICSALARY,MONTHSALARY,PF,TAX,NETSALARY)
VALUES (V_EMPNO,V_YEAR,V_MONTH,V_EMPNAME,V_DAYSPRESENT,V_BASICSALARY,V_MON_SAL,
V_PF,V_TAX, V_NET_SAL);
END LOOP;
EXCEPTION
WHEN DUP_VAL_ON_INDEX THEN
UPDATE DELL_SALARY
SET EMPNAME=V_EMPNAME,DAYSPRESENT=V_DAYSPRESENT,BASICSALARY=V_BASICSALARY,
MONTHSALARY=V_MON_SAL,PF=V_PF,TAX=V_TAX,NETSALARY=V_NET_SAL
WHERE EMPNO=V_EMPNO AND YEAR=V_YEAR AND MONTH=V_MONTH;
END SP_PREPARESALARY;
END PKG_PROJECT;
创建了DELL_EMPLOYEE,DELL_ATTENDANCE,DELL_SALARY表。但我不知道为什么kepp会收到不必要的错误。
答案 0 :(得分:1)
我没有您的功能,所以我评论或删除了该部分并创建了包而没有任何错误。
CREATE OR REPLACE PACKAGE BODY PKG_PROJECT
AS
PROCEDURE SP_PREPARESALARY (v_yr IN NUMBER, v_mn IN NUMBER)
AS
V_EMPNO VARCHAR2(30);
V_EMPNAME VARCHAR2(30);
V_BASICSALARY NUMBER;
V_DAYSPRESENT NUMBER;
V_YEAR NUMBER;
V_MONTH NUMBER;
V_PF NUMBER;
V_TAX NUMBER;
V_MON_SAL NUMBER;
V_NET_SAL NUMBER;
V_MAXDAYS NUMBER;
CURSOR EMP_VALUES
IS
SELECT E.EMPNO,
E.EMPNAME,
E.BASICSALARY,
E.YEAR,
E.MONTH,
E.DAYSPRESENT
FROM DELL_EMPLOYEE E, DELL_ATTENDANCE A
WHERE E.EMPNO = A.ENO AND E.YEAR = V_YR AND E.MONTH = V_MN;
BEGIN
OPEN EMP_VALUES;
LOOP
FETCH EMP_VALUES
INTO V_EMPNO,
V_EMPNAME,
V_BASICSALARY,
V_YEAR,
V_MONTH,
V_DAYSPRESENT;
EXIT WHEN EMP_VALUES%NOTFOUND;
V_YEAR := V_YR;
V_MONTH := V_MN;
V_MAXDAYS := 0;
-- V_MON_SAL :=
-- FN_GETGROSSMONTHLYSALARY (V_BASICSALARY,
-- V_DAYSPRESENT,
-- V_MAXDAYS);
V_PF := 0;
V_TAX := 0;
V_NET_SAL := 0;
-- INSERT INTO DELL_SALARY (EMPNO,
-- YEAR,
-- MONTH,
-- EMPNAME,
-- DAYSPRESENT,
-- BASICSALARY,
-- MONTHSALARY,
-- PF,
-- TAX,
-- NETSALARY)
-- VALUES (V_EMPNO,
-- V_YEAR,
-- V_MONTH,
-- V_EMPNAME,
-- V_DAYSPRESENT,
-- V_BASICSALARY,
-- V_MON_SAL,
-- V_PF,
-- V_TAX,
-- V_NET_SAL);
END LOOP;
EXCEPTION
WHEN DUP_VAL_ON_INDEX
THEN
null;
-- UPDATE DELL_SALARY
-- SET EMPNAME = V_EMPNAME,
-- DAYSPRESENT = V_DAYSPRESENT,
-- BASICSALARY = V_BASICSALARY,
-- MONTHSALARY = V_MON_SAL,
-- PF = V_PF,
-- TAX = V_TAX,
-- NETSALARY = V_NET_SAL
-- WHERE EMPNO = V_EMPNO AND YEAR = V_YEAR AND MONTH = V_MONTH;
END SP_PREPARESALARY;
END PKG_PROJECT;
尝试逐个评论以确定问题所在,以便您可以轻松找到问题。