【问题标题】:returning a value using dbms_output.put_line and out parameter in an Oracle procedure在 Oracle 过程中使用 dbms_output.put_line 和 out 参数返回一个值
【发布时间】:2019-10-19 06:46:31
【问题描述】:

在 oracle 过程中使用dbms_output.put_lineout 参数打印值有什么区别。 dbms_output.put_line 会将值返回给前端吗?

如果没有,如何使用存储过程将多行返回到前端?

【问题讨论】:

  • 要返回多行,您可以使用collectionCursor。取决于你需要什么。 dbms_output.put_line 通常用于打印结果,可用于显示信息。
  • 感谢您的全部回答。然后,如果我想显示在 Web 应用程序中显示的值,如何在 oracle 程序中返回它。在 sql server 和 mysql 中,选择用于显示。即使使用 ref光标作为输出参数,我们使用 dbms_output.put_line 显示,然后使用什么返回 Web 应用程序屏幕
  • 在下面的 SP 中使用 dbms_output.put_line 返回客户端(Web 应用屏幕)

标签: sql oracle plsql


【解决方案1】:

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>

如果要将其与应该返回多个值的过程进行比较,那么一种选择是使用数据类型为SYS_REFCURSOROUT 参数。就是这样;您会注意到它需要更多代码 - 过程本身和单独的 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>

【讨论】:

    【解决方案2】:

    您的函数使用 DBMS_OUTPUT.PUT_LINE 按列显示结果,后跟一个 new_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,
    

    【讨论】:

      【解决方案3】:

      取决于您所说的“前端”。如果您在 SQL*Plus 或 SQL Developer 中运行,则使用 dbms_output 会将内容发送到缓冲区,然后显示在特定窗口中 - 如果该会话的 serveroutput 已打开。

      经过适当检测的程序会使用诸如Logger 之类的实用程序对自定义表进行调试注释,以供日后阅读。

      过程中的 OUT 参数只是将这些信息接收到实际参数中,也许是一些局部变量。这可以进一步处理、显示在屏幕上或发送到另一个过程。

      【讨论】:

        【解决方案4】:

        DBMS_OUTPUT 不返回 I/O 流或函数返回值意义上的输出。这是一个相当基本的调试工具,它通过将指定的文本放入 PL/SQL 数组来工作,然后可以在调用结束时由调用 dbms_output.get_lines() 的客户端应用程序检索该数组。 SQL*Plus 和 PL/SQL Developer 等工具会根据偏好设置自动执行此操作,但 Web 前端不会。

        【讨论】:

          猜你喜欢
          • 2021-11-19
          • 2023-03-14
          • 2011-10-16
          • 2012-04-18
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-10-24
          • 2018-01-13
          相关资源
          最近更新 更多