将 PL/SQL 中的函数写入同一个 table 中的 Sum

write function in PL/SQL to Sum within the same table

我正在尝试编写一个 PL/SQL 函数名称 hoursWorked,它接受 workerId 和 prjId 以及 returns 工人在项目上工作的总时数。

Table 名为 PROJECTHOURS

WORKERPRJID | WORKERID |     PRJID |  TOTHOURS |    CDATE
---------- ---------- ---------- ---------- ---------
         1          1          1         10 1-JAN-14
         2          1          1          7 2-JAN-14
         3          1          1          6 4-JAN-14
         4          2          1          5 11-JAN-14
         5          2          1          9 15-JAN-14
         6          2          1          7 13-JAN-14
         7          1          2          5 11-JAN-14
         8          2          2          9 15-JAN-14
         9          2          2          7 13-JAN-14

我试过以下方法:

CREATE OR replace PROCEDURE Hoursworked (j IN NUMBER,
                                         n IN NUMBER)
IS
  hours_worked projecthours.tothours%TYPE := 0;
BEGIN
    SELECT workerid,
           prjid,
           SUM(tothours)
    INTO   hours_worked
    FROM   projecthours
    WHERE  workerid = j
           AND prjid = n
    GROUP  BY j,
              n;

    RETURN hours_worked;
END; 

SQL> show errors;
Errors for PROCEDURE HOURSWORKED:

LINE/COL ERROR
-------- -----------------------------------------------------------------
6/1      PL/SQL: SQL Statement ignored
6/52     PL/SQL: ORA-00947: not enough values
12/1     PL/SQL: Statement ignored
12/1     PLS-00372: In a procedure, RETURN statement cannot contain an
         expression

诚然,我对 SQL 总体上非常缺乏经验,所以非常欢迎任何见解,关于我做错了什么。

select 是错误的,你 select 3 个值,但只取入一个。按引用分组不正确。

您不需要 select workerid 或项目 id,也不需要 group by。

应该如下所示

CREATE OR replace PROCEDURE Hoursworked (j IN NUMBER,
                                         n IN NUMBER,
                                         hours_worked OUT NUMBER)
IS

BEGIN
    SELECT SUM(tothours)
    INTO   hours_worked
    FROM   projecthours
    WHERE  workerid = j
           AND prjid = n;

END;

在过程中 Return 立即结束程序执行,并且不需要任何参数。要么将程序单元类型更改为函数,要么像上面那样使用 OUT 变量。

并且请提供比 "j" & "n"

更好的参数名称