возврат значения с использованием параметра dbms_output.put_line и out в процедуре Oracle - PullRequest
1 голос
/ 18 октября 2019

В чем разница между печатью значения с использованием параметров dbms_output.put_line и out в процедуре оракула. Будет ли dbms_output.put_line возвращать значение в интерфейс?

Если нет, как вернуть более одной строки во внешний интерфейс с помощью хранимой процедуры?

Ответы [ 4 ]

3 голосов
/ 18 октября 2019

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>
1 голос
/ 18 октября 2019

Ваша функция использует DBMS_OUTPUT.PUT_LINE для отображения результатов в столбцах, после чего следует символ новой строки. например, см. запрос ниже.

create or replace procedure TEMP_ARRAy_RECORD
is
--type emp_det_tbl IS TABLE OF temp_employee_det%ROWTYPE index by pls_integer;
  type lemp_det IS RECORD 
   ( 
     --l_emp_id int, 
     l_emp_id temp_employee_det.emp_id%type,
     l_city temp_employee_det.city%type,
     l_amount temp_employee_det.amount%type
     );
     TYPE emp_det IS VARRAY(15) OF lemp_det;
  f_emp_det emp_det;
BEGIN 

for i in (select emp_id,city,amount BULK COLLECT into  f_emp_det from temp_employee_det)
loop
dbms_output.put(i.city||',');--fetch all data in single row
dbms_output.put_line(i.city||',');--fetch all data in column wise
exit when SQL%NOTFOUND;
end loop;
dbms_output.new_line;--
end;
execute TEMP_ARRAy_RECORD

см. ниже будет показан вывод.

SQL*Plus statement executed
PL/SQL block executed
CHALISGAON,BHADGAON,PACHORA,JALGAON,NASHIK,
0 голосов
/ 19 октября 2019

DBMS_OUTPUT не возвращает вывод в смысле потока ввода-вывода или возвращаемого значения функции. Это довольно простой инструмент отладки, который работает, помещая указанный текст в массив PL / SQL, который затем может быть получен в конце вызова клиентским приложением, вызывающим dbms_output.get_lines(). Такие инструменты, как SQL * Plus и PL / SQL Developer, делают это автоматически в зависимости от настроек, но веб-интерфейс не будет.

0 голосов
/ 18 октября 2019

Зависит от того, что вы подразумеваете под "передним концом". Если вы работаете в SQL * Plus или SQL Developer, то с помощью dbms_output отправляет содержимое в буфер, который затем отображается в определенном окне - если для этого сеанса включено serveroutput .

Правильно оснащенная программа будет использовать утилиту, такую ​​как Logger , чтобы делать заметки отладки для пользовательской таблицы, для последующего просмотра.

Параметры OUT в процедурах просто получают эту информацию в фактический параметр, возможнонекоторая локальная переменная. Это может быть дополнительно обработано, отображено на экране или отправлено в другую процедуру.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...