PL / SQL: я получаю сообщение об ошибке «Столкнулся с символом «ОТКРЫТЬ» при ожидании одного из следующих: . ( * @ %

#plsql

#plsql

Вопрос:

Мой код:

 create table dep_emp_ast(
cod_dep number(3),
cod_ang number(3));

declare
  type cref is ref cursor;
  c cref;
  type tab_imb is table of dept_ast.department_id%type;
  t tab_imb:=tab_imb();
  v_ang emp_ast.employee_id%type;
begin
  select distinct department_id
  bulk collect into t
  from dept_ast;
  
  forall i in 1..t.count
    open c for select employee_id
    from emp_ast
    where department_id=t(i);
    loop
      fetch c into v_ang
      insert into dep_emp_ast
      values(t(i),v_ang);
      exit when c%notfound;
    end loop;
    close c;
end;
/
  

Моя ошибка говорит, что я не могу открыть курсор там. Но почему? Я хочу повторно открыть курсор и повторно использовать его для каждого значения t (i).

Ответ №1:

forall за ним должен следовать оператор DML:

forall

например:

 forall i in depts.first..depts.last
    delete employees_temp
    where  department_id = depts(i);
  

Я думаю, что вы хотели что-то вроде:

 declare
    c sys_refcursor;
    type tab_imb is table of dept_ast.department_id%type;
    t tab_imb:=tab_imb();
    v_ang emp_ast.employee_id%type;
begin
    select distinct department_id
    bulk collect into t
    from dept_ast;
      
    for i in 1..t.count loop
        open c for
            select employee_id
            from emp_ast
            where department_id=t(i);

        loop
            fetch c into v_ang;
            insert into dep_emp_ast
            values(t(i),v_ang);
            exit when c%notfound;
        end loop;

        close c;
    end loop;
end;
  

который можно упростить до

 begin      
    for d in (
        select distinct department_id
        from dept_ast
    )
    loop
        for e in (
            select employee_id
            from   emp_ast
            where  department_id = d.department_id
        )
        loop
            insert into dep_emp_ast
            values (d.department_id, e.employee_id);
        end loop;

    end loop;
end;
  

что сводится к

 insert into dep_emp_ast (cod_dep, cod_ang)
select e.department_id, e.employee_id
from   emp_ast e
where  e.department_id in
       ( select department_id
         from   dept_ast );