У меня нет ваших таблиц, поэтому я использовал схему Скотта.
Это то, что у вас сейчас есть:
SQL> create or replace procedure p_test (par_deptno in number)
2 is
3 type ed_type is table of emp%rowtype;
4 p_emp_demo_rec ed_type;
5 begin
6 select * bulk collect into p_emp_demo_rec
7 from emp
8 where deptno = par_deptno;
9
10 for i in p_emp_demo_rec.first .. p_emp_demo_rec.last loop
11 dbms_output.put_line('Empno: ' || p_emp_demo_rec(i).empno ||
12 'Ename: ' || p_emp_demo_rec(i).ename
13 );
14 end loop;
15
16 if sql%notfound then
17 raise_application_Error(-20201, 'This does not exist');
18 end if;
19 end;
20 /
Procedure created.
Давайте проверим это: во-первых, существует DEPTNO:
SQL> exec p_test(10);
Empno: 7782Ename: CLARK
Empno: 7839Ename: KING
Empno: 7934Ename: MILLER
PL/SQL procedure successfully completed.
SQL>
Теперь, DEPTNO, которого нетсуществовать:
SQL> exec p_test(-2);
BEGIN p_test(-2); END;
*
ERROR at line 1:
ORA-06502: PL/SQL: numeric or value error
ORA-06512: at "SCOTT.P_TEST", line 10
ORA-06512: at line 1
SQL>
Wooops!Ошибка!Какая строка является строкой 10?
10 for i in p_emp_demo_rec.first .. p_emp_demo_rec.last loop
Если ничего не было выбрано, то существует ни первое, ни последнее, и FOR вызывает ошибку.Это означает, что вы должны перемещать IF перед циклом FOR, то есть
SQL> create or replace procedure p_test (par_deptno in number)
2 is
3 type ed_type is table of emp%rowtype;
4 p_emp_demo_rec ed_type;
5 begin
6 select * bulk collect into p_emp_demo_rec
7 from emp
8 where deptno = par_deptno;
9
10 if sql%notfound then --> this was moved up
11 raise_application_Error(-20201, 'This does not exist');
12 end if;
13
14 for i in p_emp_demo_rec.first .. p_emp_demo_rec.last loop
15 dbms_output.put_line('Empno: ' || p_emp_demo_rec(i).empno ||
16 'Ename: ' || p_emp_demo_rec(i).ename
17 );
18 end loop;
19 end;
20 /
Procedure created.
Тестирование:
SQL> exec p_test(-2);
BEGIN p_test(-2); END;
*
ERROR at line 1:
ORA-20201: This does not exist
ORA-06512: at "SCOTT.P_TEST", line 11
ORA-06512: at line 1
Ну, да - это ваш RAISE_APPLICATION_ERROR
, а не NUMERIC OR VALUE ERROR
.
Итак, небольшая копия / вставка должна исправить это.