2013-04-05 2 views
1

Предположив У меня есть таблица со столбцами а, б, в, д, еОбновление нескольких столбцов с вызовом функции

Есть ли способ/синтаксис, чтобы обновить столбцы d и е из выходных параметров процедуры/функции, которая принимает в значениях параметров столбцов a, b и c. (процедура (a, b, c, out d, out e))

(кроме использования курсора для перебора по всем строкам один за другим)?

+0

почему не использовать функцию вместо процедуры? –

+0

Такая же проблема, функция возвращает только одно значение, мне нужно обновить несколько столбцов в строке на основе других столбцов в той же строке. –

ответ

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 но что-то, как это должно работать

Смежные вопросы