Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 在Oracle过程中使用dbms_output.put_line和out参数返回值_Sql_Oracle_Plsql - Fatal编程技术网

Sql 在Oracle过程中使用dbms_output.put_line和out参数返回值

Sql 在Oracle过程中使用dbms_output.put_line和out参数返回值,sql,oracle,plsql,Sql,Oracle,Plsql,在oracle过程中,使用dbms_output.put_行和out参数打印值有什么区别。dbms_output.put_行是否将返回值发送到前端 如果不是,如何使用存储过程将多行返回到前端?取决于前端的含义。如果您在SQL*Plus或SQL Developer中运行,则使用dbms_输出将内容发送到缓冲区,然后在特定窗口中显示该内容-如果该会话处于打开状态 一个正确插入指令的程序将使用一个实用程序,例如为自定义表做调试注释,以供以后阅读 程序中的OUT参数只是将该信息接收到实际参数中,可能是一

在oracle过程中,使用dbms_output.put_行和out参数打印值有什么区别。dbms_output.put_行是否将返回值发送到前端


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

取决于前端的含义。如果您在SQL*Plus或SQL Developer中运行,则使用dbms_输出将内容发送到缓冲区,然后在特定窗口中显示该内容-如果该会话处于打开状态

一个正确插入指令的程序将使用一个实用程序,例如为自定义表做调试注释,以供以后阅读


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

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

一个正确插入指令的程序将使用一个实用程序,例如为自定义表做调试注释,以供以后阅读

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

DBMS\u OUTPUT.PUT\u行在无法显示它的存储过程或前端应用程序中没有多大意义。例如,尽管它在Oracle Forms或Application Express中进行了有效调用,但在屏幕上看不到任何内容

你真的不希望用户在SQL*Plus、TOAD或SQL Developer中运行你的过程,是吗?因此,使用DBMS_OUTPUT.PUT_行进行调试

我猜这就是您可能正在使用的:

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_REFCURSOR的OUT参数。这里是如何;您会注意到,它需要更多的代码—过程本身和单独的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>
DBMS_OUTPUT.PUT_行在无法显示它的存储过程或前端应用程序中没有多大意义,例如,尽管它在Oracle Forms或Application Express中进行了有效调用,但在屏幕上看不到任何内容

你真的不希望用户在SQL*Plus、TOAD或SQL Developer中运行你的过程,是吗?因此,使用DBMS_OUTPUT.PUT_行进行调试

我猜这就是您可能正在使用的:

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_REFCURSOR的OUT参数。这里是如何;您会注意到,它需要更多的代码—过程本身和单独的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>

函数使用DBMS_OUTPUT.PUT_行按列显示结果,后跟一个新的_行字符。例如,请参考下面的查询

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,

函数使用DBMS_OUTPUT.PUT_行按列显示结果,后跟一个新的_行字符。例如,请参考下面的查询

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,

不返回I/O流或函数返回值意义上的输出。它是一个相当基本的调试工具,其工作原理是将指定的文本放入PL/SQL数组中,然后调用dbms_output.get_行的客户端应用程序可以在调用结束时检索该数组。SQL*Plus和PL/SQL Developer等工具会根据首选项设置自动执行此操作,但web前端不会。

不会返回I/O流或函数返回值意义上的输出。它是一个相当基本的调试工具,其工作原理是将指定的文本放入PL/SQL数组中,然后调用dbms_output.get_行的客户端应用程序可以在调用结束时检索该数组。SQL*Plus和PL/SQL Developer等工具会根据首选项设置自动执行此操作,但web前端不会。

若要返回多行,可以使用或。这取决于你需要什么。dbms_output.put_line通常用于打印结果,并且可能对显示信息有用。感谢您的回答。如果我想显示web应用程序中显示的值,那么如何在oracle过程中返回它。在sql server和mysql中,使用select来显示。即使使用ref cursor作为输出参数,我们也可以使用dbms_output.put_line显示然后使用什么返回到下面SP中的web应用程序屏幕使用dbms_output.put_line返回到客户端web应用程序屏幕返回多行y
你可以使用或。这取决于你需要什么。dbms_output.put_line通常用于打印结果,并且可能对显示信息有用。感谢您的回答。如果我想显示web应用程序中显示的值,那么如何在oracle过程中返回它。在sql server和mysql中,使用select来显示。即使使用ref cursor作为输出参数,我们也可以使用dbms_output.put_行显示,然后使用dbms_output.put_行返回clientweb app屏幕,在下面的SP中使用什么返回web应用程序屏幕