简体   繁体   English

功能:PLS-00306:调用'WORK_DAYS'时参数的数量或类型错误

[英]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.

相关问题 如何更正 '' PLS-00306:在调用 '' 时 arguments 的错误编号或类型 - How to correct '' PLS-00306: wrong number or types of arguments in call to '' PLS-00306:错误的参数数量或类型提示具有“可变”参数数量的函数的提示 - PLS-00306: wrong number or types of arguments tips on function with “variable” number of arguments Oracle过程调用导致“ PLS-00306:调用中参数的数量或类型错误” - Oracle procedure call results in “PLS-00306: wrong number or types of arguments in call” 错误 PLS-00306:在调用“P_CHECKAVGRATE”PL/SQL 时 arguments 的数量或类型错误:语句被忽略 - Error PLS-00306: wrong number or types of arguments in call to 'P_CHECKAVGRATE' PL/SQL: Statement ignored PLS-00306:调用现有存储过程时参数的数量或类型错误 - PLS-00306: wrong number or types of arguments in call to existing stored procedure PL / SQL-连接时始终收到此错误:PLS-00306:调用&#39;||&#39;时参数或参数类型错误 - PL/SQL - I keep getting this error when concatenating: PLS-00306: wrong number or types of arguments in call to '||' 将PHP数组传递给Oracle存储过程(PLS-00306:错误数量或参数类型) - passing PHP array to Oracle Stored Proc (PLS-00306: wrong number or types of arguments) 对过程的调用中参数的数量或类型错误(PLS00306) - wrong number or types of arguments in call to procedure (PLS00306) 使用UDT的Oracle函数上的PLS-00306 - PLS-00306 on Oracle function using a UDT PLS-00306:从PL / SQL块调用函数时 - PLS-00306: when calling a function from a PL/SQL block
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM