2013-04-05 63 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但這樣的事情應該工作