DBMS_OUTPUT.PUT_LINE
не имеет особого смысла в хранимых процедурах или интерфейсных приложениях , которые не могут его отобразить (например, хотя он делает правильный вызов в Oracle Forms или Application Express, вы выигралиничего не вижу на экране).
Вы не ожидаете, что пользователи будут запускать ваши процедуры в SQL * Plus, TOAD или SQL Developer, не так ли? Поэтому используйте DBMS_OUTPUT.PUT_LINE
для целей отладки.
Полагаю, вы можете использовать это:
SQL> create or replace procedure p_test_2
2 (par_deptno in number)
3 is
4 begin
5 for cur_r in (select ename from emp where deptno = par_deptno) loop
6 dbms_output.put_line(cur_r.ename);
7 end loop;
8 end;
9 /
Procedure created.
SQL> exec p_test_2(10);
CLARK
KING
MILLER
PL/SQL procedure successfully completed.
SQL>
Если вы хотите сравнить его с процедурой, котораядолжен возвращать несколько значений, тогда один вариант - использовать параметр OUT
, тип данных которого SYS_REFCURSOR
. Вот как;вы заметите, что для этого требуется еще немного кода - сама процедура и отдельный блок PL / SQL, который сделает что-то со своим результатом.
SQL> create or replace procedure p_test3
2 (par_deptno in number, par_emp out sys_refcursor)
3 is
4 begin
5 open par_emp for select * from emp where deptno = par_deptno;
6 end;
7 /
Procedure created.
SQL>
SQL> declare
2 l_emp sys_refcursor;
3 l_rec emp%rowtype;
4 begin
5 p_test3(10, l_emp);
6
7 loop
8 fetch l_emp into l_rec;
9 exit when l_emp%notfound;
10 -- You'd do something with those values here; I'm just displaying ENAME
11 dbms_output.put_line(l_rec.ename);
12 end loop;
13 end;
14 /
CLARK
KING
MILLER
PL/SQL procedure successfully completed.
SQL>
В качестве альтернативы, для целей отображения, вSQL * Plus вы можете использовать это:
SQL> var l_rec refcursor
SQL> exec p_test3(10, :l_rec);
PL/SQL procedure successfully completed.
SQL> print l_rec
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- ---------- --------- ---------- ------------------- ---------- ---------- ----------
7782 CLARK MANAGER 7839 09.06.1981 00:00:00 2450 10
7839 KING PRESIDENT 17.11.1981 00:00:00 5000 10
7934 MILLER CLERK 7782 23.01.1982 00:00:00 1300 10
SQL>