[英]Function : PLS-00306: wrong number or types of arguments in call to 'WORK_DAYS'
I am trying to create a package that includes both a function and procedure, with the function being called in the procedure. 我正在尝试创建一个包含函数和过程的包,并在过程中调用该函数。 I feel like my code below should work but I keep getting the error PLS-00306: wrong number or types of arguments in call to 'WORK_DAYS'.
我觉得下面的代码应该可以工作,但我一直收到错误PLS-00306:调用'WORK_DAYS'时参数的数量或类型错误。 Any advice on what the issue is?
关于这个问题的任何建议?
I also think that when this will run it will return more than one row, anyway around throwing an error? 我还认为,当它运行时,它将返回多行,无论如何都会抛出错误? I have used a For loop in the procedure but will I also need one in the function?
我在程序中使用了For循环但是我还需要函数中的一个吗?
create or replace PACKAGE BODY WORK_ALLOCATION_OVERDUE IS
FUNCTION WORK_DAYS
(P_EMP_ID IN NUMBER)
RETURN NUMBER
IS
TOTAL NUMBER;
BEGIN
SELECT ROUND(WORK_END_DATE - SYSDATE)
INTO TOTAL
FROM PL_WORK_ALLOCATION
WHERE P_EMP_ID = D_EMP_ID;
RETURN TOTAL;
END WORK_DAYS;
PROCEDURE WORK_DAYS_INFO
(P_EMP_ID IN NUMBER)
IS
CURSOR CUR_CRIME IS
SELECT S_REPORTED_CRIME_ID, WORK_DESC, WORK_END_DATE
FROM PL_WORK_ALLOCATION
WHERE P_EMP_ID = D_EMP_ID
GROUP BY D_EMP_ID, S_REPORTED_CRIME_ID, WORK_DESC, WORK_END_DATE;
WORK_FLAG VARCHAR2(10);
BEGIN
FOR REC_CRIME IN CUR_CRIME LOOP
IF WORK_DAYS < 1 THEN
WORK_FLAG := 'OVERDUE';
ELSIF WORK_DAYS > 1 THEN
WORK_FLAG := 'DUE';
END IF;
IF WORK_FLAG = 'OVERDUE' THEN
DBMS_OUTPUT.PUT_LINE('Reported Crime: ' || REC_CRIME.S_REPORTED_CRIME_ID || ' Work Desc: ' || REC_CRIME.WORK_DESC || ' is ' || WORK_FLAG);
END IF;
END LOOP;
END WORK_DAYS_INFO;
END; END;
You created WORK_DAYS
as a function with 1 input parameter, but aren't supplying it that parameter anywhere in your procedure. 您创建了
WORK_DAYS
作为具有1个输入参数的函数,但未在过程中的任何位置提供该参数。 You need to pass it the input parameter P_EMP_ID
like so - WORK_DAYS (P_EMP_ID)
before you can use it. 您需要将输入参数
P_EMP_ID
传递给它 - WORK_DAYS (P_EMP_ID)
才能使用它。
As has been said already, there is unecessary work being carried out in your package. 如前所述,您的包裹中正在进行不必要的工作。 You could refactor to this:
你可以重构一下:
CREATE OR REPLACE PACKAGE BODY WORK_ALLOCATION_OVERDUE IS
FUNCTION WORK_DAYS
(P_WORK_END_DATE IN DATE)
RETURN NUMBER
IS
RETURN ROUND(P_WORK_END_DATE - SYSDATE);
END WORK_DAYS;
PROCEDURE WORK_DAYS_INFO
(P_EMP_ID IN NUMBER)
IS
CURSOR CUR_CRIME IS
SELECT S_REPORTED_CRIME_ID, WORK_DESC, WORK_END_DATE
FROM PL_WORK_ALLOCATION
WHERE P_EMP_ID = D_EMP_ID
GROUP BY D_EMP_ID, S_REPORTED_CRIME_ID, WORK_DESC, WORK_END_DATE;
WORK_FLAG VARCHAR2(10);
BEGIN
FOR REC_CRIME IN CUR_CRIME LOOP
IF WORK_DAYS(REC_CRIME.WORK_END_DATE) < 1 THEN
WORK_FLAG := 'OVERDUE';
ELSIF WORK_DAYS(REC_CRIME.WORK_END_DATE) > 1 THEN
WORK_FLAG := 'DUE';
END IF;
IF WORK_FLAG = 'OVERDUE' THEN
DBMS_OUTPUT.PUT_LINE('Reported Crime: ' || REC_CRIME.S_REPORTED_CRIME_ID || ' Work Desc: ' || REC_CRIME.WORK_DESC || ' is ' || WORK_FLAG);
END IF;
END LOOP;
END WORK_DAYS_INFO;
or, just take out the function completely: 或者,完全取出功能:
CREATE OR REPLACE PACKAGE BODY WORK_ALLOCATION_OVERDUE IS
PROCEDURE WORK_DAYS_INFO
(P_EMP_ID IN NUMBER)
IS
CURSOR CUR_CRIME IS
SELECT S_REPORTED_CRIME_ID,
WORK_DESC,
WORK_END_DATE,
ROUND(SUM(WORK_END_DATE - SYSDATE)) WORK_DAYS
FROM PL_WORK_ALLOCATION
WHERE P_EMP_ID = D_EMP_ID
GROUP BY D_EMP_ID, S_REPORTED_CRIME_ID, WORK_DESC, WORK_END_DATE;
WORK_FLAG VARCHAR2(10);
BEGIN
FOR REC_CRIME IN CUR_CRIME LOOP
IF REC_CRIME.WORK_DAYS < 1 THEN
WORK_FLAG := 'OVERDUE';
ELSIF REC_CRIME.WORK_DAYS > 1 THEN
WORK_FLAG := 'DUE';
END IF;
IF WORK_FLAG = 'OVERDUE' THEN
DBMS_OUTPUT.PUT_LINE('Reported Crime: ' || REC_CRIME.S_REPORTED_CRIME_ID || ' Work Desc: ' || REC_CRIME.WORK_DESC || ' is ' || WORK_FLAG);
END IF;
END LOOP;
END WORK_DAYS_INFO;
However, you do have a problem in that P_EMP_ID appears to be returning more than one row (hence your ORA-01422 exception). 但是,您确实遇到一个问题,即P_EMP_ID似乎返回多行(因此您的ORA-01422异常)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.