【发布时间】:2019-01-22 02:08:54
【问题描述】:
您好,我正在尝试使用 Oracle 中的存储过程更新表中的特定记录, 但它更新所有记录而不是特定记录。 这是我在执行存储过程之前的 EMP 表
ID, NAME, DEPT, SAL
1 pc New 100000000
2 pc1 qwe 1
3 pc2 New 2
4 pc4 asf 3
5 pc5 New 4
6 pc6 qwe 5
7 pc7 New 6
8 pc8 COMP 8
9 pc9 New 9
10 pc10 New 7
11 pc11 qwe 11
12 pc12 New 12
13 pc13 New 13
14 pc14 qwe 14
检查是EMP的功能属于COMP部门
create or replace FUNCTION ISCOMPGUY
(
EMPID IN NUMBER
) RETURN NUMBER AS
dept varchar(20);
cursor getDept IS select dept from emp where id=EMPID;
BEGIN
open getDept; FETCH getDept INTO dept;
IF DEPT = 'COMP' THEN
return 1;
ELSE
return 0;
END IF;
END ISCOMPGUY;
根据ISCOMPGUY函数更新记录的过程
CREATE OR REPLACE PROCEDURE UPATEEMP AS
isValid number :=0;
cursor getCompGuys IS select id from emp;-- where dept='COMP';
BEGIN
for emp in getCompGuys loop
isValid := iscompguy(emp.id);
dbms_output.put_line ('isValid '|| emp.id || ' : ' || isValid );
if isValid = 1 then
dbms_output.put_line ('updating ' ||emp.id);
UPDATE EMP set dept='IT' where id = emp.id;
end if;
end loop;
END UPATEEMP;
但是当我运行程序时,它会更新所有记录 程序执行后程序和EMP表的输出
Connecting to the database testDB.
isValid 1 : 0
isValid 2 : 0
isValid 3 : 0
isValid 4 : 0
isValid 5 : 0
isValid 6 : 0
isValid 7 : 0
isValid 8 : 1
updating 8
isValid 9 : 0
isValid 10 : 0
isValid 11 : 0
isValid 12 : 0
isValid 13 : 0
isValid 14 : 0
Process exited.
Disconnecting from the database testDB.
ID, NAME, DEPT, SAL
1 pc IT 100000000
2 pc1 IT 1
3 pc2 IT 2
4 pc4 IT 3
5 pc5 IT 4
6 pc6 IT 5
7 pc7 IT 6
8 pc8 IT 8
9 pc9 IT 9
10 pc10 IT 7
11 pc11 IT 11
12 pc12 IT 12
13 pc13 IT 13
14 pc14 IT 14
尽管输出表明它仅针对 emp.id=8 进行更新,但所有记录都在更新。
提前致谢。
【问题讨论】:
-
不要留下打开的游标,就像在你的函数“ISCOMPGUY”中一样。关闭它。
标签: oracle function stored-procedures oracle11g