2013-04-05 35 views
1

假设我有列 A,B,C,d表,电子更新多个列与函数调用

有一种方法/语法来更新列d和e从过程的OUT参数/函数,它在列a,b和c的参数值中。 (程序(a,b,c,out d,out e))

(不同于使用游标逐个遍历所有行)?

+0

为什么不使用功能,而不是一个程序? – 2013-04-05 18:13:14

+0

同样的问题,函数只返回一个值,我需要根据同一行中的其他列更新行中的几个列。 – 2013-04-06 11:07:31

回答

0

与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 
; 
2

您可以创建一个PL/SQL tables or user defined records,像这样

函数来处理记录

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; 

我没有测试/编译它,只是写出我的内存ORY但这样的事情应该工作