курсор pl sql с помощью выбора - PullRequest
0 голосов
/ 01 февраля 2020

Я хочу получить одно значение из table1 (etudiant), чтобы использовать это значение в table2 (employee), используя slect, я использую курсор, но я не получил результат; Можете ли вы помочь мне спасибо

    declare
           cle employee.id%type;
           cursor cur_test is select id from etudiant where name ='Hichem';
           no_data_found exception;
    begin

      open cur_test;

      loop
           fetch cur_test into cle;
           exit when cur_test%notfound;
      end loop;

      --dbms_output.put_line('ID IS ' ||cle);
      select * from employee where id=cle;

      if cur_test%rowcount=0 then
        close cur_test;
        raise no_data_found;      
      end if;
      close cur_test;

exception 
      when no_data_found then
        dbms_output.put_line('no data found');

end;
/

1 Ответ

2 голосов
/ 01 февраля 2020

Похоже, вы это слишком усложнили. Почему бы вам не присоединиться непосредственно к etudiant и employee таблицам? Примерно так:

begin
  for cur_r in (select e.name
                from employee e join etudiant t on t.id = e.id
                where t.name = 'Hichem'
               )
  loop
    dbms_output.put_line(cur_r.name);
  end loop;
end;
/

Возможно, вам даже не нужен цикл; или, если у вас есть несколько человек с именем, которое вы ищете (Hichem в данном случае).


На ваш код:

  • Вообще говоря, использовать курсор FOR l oop проще, чем делать все вручную (объявление переменной курсора, открытие курсора, выборка, выход из l oop, закрытие курсора) - если вы используете курсор FOR l oop , Oracle делает все это за вас
  • нет необходимости явно объявлять no_data_found; это предопределенное исключение
  • select * from employees неправильно, так как - в PL / SQL - вы должны выбрать результат INTO что-то. Если вы ожидаете более одной строки, рассмотрите возможность использования коллекции с bulk collect
...