Sql 在Oracle过程中使用dbms_output.put_line和out参数返回值
在oracle过程中,使用dbms_output.put_行和out参数打印值有什么区别。dbms_output.put_行是否将返回值发送到前端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参数只是将该信息接收到实际参数中,可能是一
如果不是,如何使用存储过程将多行返回到前端?取决于前端的含义。如果您在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应用程序屏幕