Oracle 使用函数调用更新多个列
假设我有一个带列的表 a、 b,c,d,e 是否有一种方法/语法可以从接受列a、b和c的参数值的过程/函数的out参数更新列d和e。(程序(a、b、c、d、e)) (除了使用光标逐个遍历所有行之外)?您可以创建一个 处理记录的功能Oracle 使用函数调用更新多个列,oracle,plsql,Oracle,Plsql,假设我有一个带列的表 a、 b,c,d,e 是否有一种方法/语法可以从接受列a、b和c的参数值的过程/函数的out参数更新列d和e。(程序(a、b、c、d、e)) (除了使用光标逐个遍历所有行之外)?您可以创建一个 处理记录的功能 FUNCTION Get_updated_recs(p_emp_id emp.emp_id%TYPE, p_manager_id emp.manager_id%TYPE) RETURN EMP_REC_TYP
FUNCTION Get_updated_recs(p_emp_id emp.emp_id%TYPE,
p_manager_id emp.manager_id%TYPE)
RETURN EMP_REC_TYPE
IS
p_emp_rec EMP_REC_TYPE;
BEGIN
IF p_emp_id = 100 THEN
p_emp_rec.salary := 50000;
p_emp_rec.bonus := 10000;
END IF;
RETURN p_emp_rec;
END get_updated_recs;
主程序单元
DECLARE
TYPE emp_rec_type IS RECORD (
salary employees.salary%TYPE,
bonus employees.bonus );
emp_rec EMP_REC_TYPE;
BEGIN
FOR emp IN (SELECT *
FROM employees) LOOP
emp_rec := Get_updated_recs(emp.emp_id, emp.manager_id);
UPDATE employees
SET salary = emp_rec.salary,
bonus = emp_rec.bonus
WHERE emp_id = emp.emp_id;
END LOOP;
END;
我没有测试/编译它,只是用我的内存写了出来,但类似的东西应该可以工作在Oracle专家的帮助下,我找到了以下解决方案:
CREATE TABLE testtable
(
a number,
b number,
c number,
d number
);
CREATE TYPE testobj AS OBJECT
(
x number,
y number
);
CREATE OR REPLACE FUNCTION testfun(a number, b number)
RETURN testobj IS
begin
return new testobj(x=>a+b, y=> a*b);
end;
INSERT INTO testtable VALUES (1,2,null,null);
INSERT INTO testtable VALUES (5,6,null,null);
UPDATE
(SELECT tt.*,
testfun1(a,b) fun_ret FROM testtable tt) talias
SET talias.c=talias.fun_ret.x,
talias.d=talias.fun_ret.y
;
按以下步骤进行:
(1) 创建并填写示例表:
CREATE TABLE TEST1
(
a NUMBER(10), b number (10), s number (10)
);
INSERT INTO TEST1 (a, b, s) VALUES (2, 3, NULL);
INSERT INTO TEST1 (a, b, s) VALUES (3, 12, NULL);
INSERT INTO TEST1 (a, b, s) VALUES (-2, 8, NULL);
(2) 创建一个简单函数,用于在更新命令中使用:
CREATE OR REPLACE FUNCTION GET_SUM (x IN NUMBER, y IN NUMBER)
RETURN NUMBER
IS
x1 NUMBER(10) := x; y1 NUMBER (10):= y; s NUMBER(10) := NULL;
BEGIN
IF x1 IS NOT NULL AND y1 IS NOT NULL THEN s := x1 + y1; END IF;
RETURN s;
END;
UPDATE TEST1 SET s = GET_SUM (a, b);
(3) 在以下更新命令中使用此功能:
CREATE OR REPLACE FUNCTION GET_SUM (x IN NUMBER, y IN NUMBER)
RETURN NUMBER
IS
x1 NUMBER(10) := x; y1 NUMBER (10):= y; s NUMBER(10) := NULL;
BEGIN
IF x1 IS NOT NULL AND y1 IS NOT NULL THEN s := x1 + y1; END IF;
RETURN s;
END;
UPDATE TEST1 SET s = GET_SUM (a, b);
(4) 检查更新:
select * from TEST1;
为什么不使用函数而不是过程?同样的问题,函数只返回一个值,我需要根据同一行中的其他列更新该行中的多个列。