将 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"
更好的参数名称
我正在尝试编写一个 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"
更好的参数名称