Передача записи курсора в функцию

#oracle #plsql #oracle10g #sqlplus

#Oracle #plsql #oracle10g #sqlplus

Вопрос:

У меня есть хранимая процедура. Я хочу вызвать функцию из нее. Хочу передать извлеченную запись курсора в функцию. как я могу передать извлеченную запись курсора в качестве аргумента функции и как я могу получить к ней доступ внутри функции? Как мне объявить функцию?

СОЗДАЙТЕ ИЛИ ЗАМЕНИТЕ службу ПРОЦЕДУР__update как

 cursor c_getData is
    select    *
    from  service_1
    where status=5    ;


begin
    dbms_output.enable(null);    

    for rec in c_getData loop

    function(rec)
  

Ответ №1:

Предполагая, что вам действительно нужна функция (что подразумевает, что вы хотите вернуть значение), а не процедура (которая не возвращает значение), и предполагая, что ваш курсор действительно выбирает каждый столбец из одной таблицы, вы можете объявить функцию, которая принимает привязанный %ROWTYPE

 SQL> create function get_empno( p_rec in emp%rowtype )
  2    return number
  3  is
  4  begin
  5    return p_rec.empno;
  6  end;
  7  /

Function created.
  

а затем вызовите эту функцию из вашей процедуры

 SQL> declare
  2    l_empno emp.empno%type;
  3  begin
  4    for i in (select * from emp)
  5    loop
  6      l_empno := get_empno( i );
  7      dbms_output.put_line( l_empno );
  8    end loop;
  9  end;
 10  /
7369
7499
7521
7566
7654
7698
7782
7788
7839
7844
7876
7900
7902
7934

PL/SQL procedure successfully completed.
  

Комментарии:

1. Большое спасибо за информацию. мы используем Oracle 10g. В Oracle есть способ изменить записи курсора. В моем вопросе, опубликованном ранее, я использую переменную rec для хранения записи, извлеченной из курсора. Смогу ли я изменить определенный столбец записи rec.service_active=sysdate и позже смогу ли я зафиксировать его в таблицах?

2. @Arav — Нет. ССЫЛОЧНЫЙ КУРСОР — это структура, доступная только для чтения в Oracle. Вы могли бы, конечно, прочитать данные из записи и использовать эти данные в последующей UPDATE инструкции для базовой таблицы.