Function PLSQL创建函数,将列中的所有值相加,并将总和插入新列

Function PLSQL创建函数,将列中的所有值相加,并将总和插入新列,function,plsql,Function,Plsql,我需要创建一个函数来获取工人在WorkOne表上完成的所有工资的总和。例如,workerno 1完成了WorkOne表中显示的3项工作。我需要根据他工作的地点,通过参考工资表,获得他所做的每项工作的工资。然后,我将把他所有的工资加在一起,并将该工人的总工资插入表work中,表work有totalsalary列 CREATE TABLE WORK( WorkerNo NUMBER(10) NOT NULL, TotalSalary NUMBER(10), CONSTRAINT WORK_

我需要创建一个函数来获取工人在WorkOne表上完成的所有工资的总和。例如,workerno 1完成了WorkOne表中显示的3项工作。我需要根据他工作的地点,通过参考工资表,获得他所做的每项工作的工资。然后,我将把他所有的工资加在一起,并将该工人的总工资插入表work中,表work有totalsalary列

CREATE TABLE WORK(
WorkerNo    NUMBER(10)  NOT NULL,
TotalSalary  NUMBER(10),
CONSTRAINT WORK_PKEY PRIMARY KEY (WorkerNo),

INSERT INTO WORK( 1, NULL );
INSERT INTO WORK( 2, NULL );

CREATE TABLE WorkSalary(
City VARCHAR2(30),
Postal VARCHAR2(30),
Salary NUMBER(9)    NOT NULL,
CONSTRAINT WorkSalary_PKEY PRIMARY KEY(City,Postal),

INSERT INTO WorkSalary('New York City', '123456', 5000);
INSERT INTO WorkSalary('Washington DC', '154876', 4500);
INSERT INTO WorkSalary('New Jersey', '458741', 3500);
INSERT INTO WorkSalary('Maryland', '487451', 2000);

CREATE TABLE WORKDONE(
WorkerNo NUMBER(10)     NOT NULL,
JobNo NUMBER(2)     NOT NULL,
City VARCHAR2(30)   NOT NULL,
Postal VARCHAR2(30) NOT NULL,
CONSTRAINT WORKDONE_PKEY PRIMARY KEY (WorkerNo, JobNo),
CONSTRAINT WORKDONE_FKEY1 FOREIGN KEY (WorkerNo) 
    REFERENCES WORK(WorkerNo),
CONSTRAINT WORKDONE_FKEY2 FOREIGN KEY (City)
    REFERENCES WorkSalary(City),
CONSTRAINT WORKDONE_FKEY3 FOREIGN KEY (Postal)
    REFERENCES WorkSalary(Postal) );

INSERT INTO WORKDONE VALUES( 1, 1, 'New York City', '123456');
INSERT INTO WORKDONE VALUES( 1, 2, 'Maryland', '487451');
INSERT INTO WORKDONE VALUES( 1, 3, 'New Jersey', '458741');
INSERT INTO WORKDONE VALUES( 2, 1, 'New Jersey', '458741');
INSERT INTO WORKDONE VALUES( 2, 2, 'New York City', '123456');
INSERT INTO WORKDONE VALUES( 2, 3, 'Washington DC', '154876');
创建或替换函数SALARYCOUNT(工人编号)返回编号为
wcity WORDONE。城市%类型;
wpostal WORKDONE.Postal%类型;
总数:
i整数:=1;
工资总额;
w平均数;
开始
选择计数(*)
总计
来自WorkOne
其中WorkerNo=worker\u no;
而我<总数
环
选择城市,邮政到wcity,wpostal FROM WorkOne,其中WorkerNo=工人号;
从WorkAlary中选择Salary to wsalary,其中wcity=城市,wpostal=邮政;
工资总额:=工资总额+工资总额;
更新工作集TotalSalary:=总工资
其中WorkerNo=worker\u no;
i:=i+1;
端环;
回报(总工资);
结束工资统计;
/

函数创建时出现编译错误。我知道,如果我能够创建一个没有错误的函数,那么我创建这个函数的逻辑可能也不正确。请帮助我了解错误和代码的逻辑。首先,正如我在评论中所说,不要使用函数来执行DML语句(更新/插入等)。使用程序。函数是在SQL语句中调用的,选择时不能执行DML语句

其次,您在
WORKDONE
上的外键不正确,您应该在同一外键中添加
CITY
POSTAL

CREATE OR REPLACE FUNCTION SALARYCOUNT ( worker_no IN NUMBER ) RETURN NUMBER IS
wcity WORKDONE.City%TYPE;
wpostal WORKDONE.Postal%TYPE;
total NUMBER:
i INTEGER: = 1;
total_salary NUMBER;
wsalary NUMBER;


BEGIN 

SELECT COUNT(*)
INTO total
FROM WORKDONE
WHERE WorkerNo = worker_no;

WHILE i < total
LOOP

SELECT City,Postal INTO wcity,wpostal FROM WORKDONE WHERE WorkerNo = worker_no;

SELECT Salary INTO wsalary FROM WorkSalary WHERE wcity = City AND wpostal = Postal;

total_salary: =total_salary+wsalary ;

UPDATE WORK SET TotalSalary: = total_salary
WHERE WorkerNo = worker_no;

i: = i+1;

END LOOP;

RETURN(total_salary);

END SALARYCOUNT ;
/
第三,更重要的是,你对环境的设置是不正确的;如果你在发帖前测试一下,这会很有帮助

最后,绝对不需要使用函数来实现这一点。这一切都可以在一个语句中完成。使用单个SQL语句几乎总是比使用PL/SQL更有效

CONSTRAINT WORKDONE_FKEY2 FOREIGN KEY (City, Postal)
    REFERENCES WorkSalary(City, Postal) 

这里有一个工作示例。

不要使用函数来执行DML语句(更新/插入等)。使用程序。函数是在SQL语句中调用的,您不能在选择时使用DML语句…我需要使用as function您不能将其用作函数,除非您直接在PL/SQL块中分配返回值。如果您正在这样做,您可以使用OUT参数,如.sry忘了提到的,我正在做PLSqlWhere设置您的家庭作业并没有很好地教您@user2351750。但是,您应该能够轻松地将其更改为在函数中工作。
 merge into work m
 using ( select wd.workerno, sum(ws.salary) as salary
           from workdone wd
           join worksalary ws
             on wd.city = ws.city
            and wd.postal = ws.postal
          group by wd.workerno ) u
    on (m.workerno = u.workerno)
  when matched then
update
   set m.totalsalary = u.salary;