1

包裹

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;

包体

PL/SQL 语句在第 29 行被忽略(就在相关插入查询之前)

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 会收到不需要的错误。

4

1 回答 1

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;

尝试逐段注释,找出问题出在哪里,这样你就可以很容易地找出问题所在。

于 2012-11-24T05:29:30.550 回答