如何在过程中调用存储过程并在同一行中打印输出?

时间:2017-10-06 07:28:14

标签: oracle plsql

如何在过程中调用存储过程并在同一行中打印输出。 例如我的全名是'Alex Bob',我为firstname(p1)和lastname(p2)创建了2个程序,如下所示:

-- Procedure 1:

CREATE OR REPLACE PROCEDURE p1(fn in out varchar) 
IS
BEGIN
    dbms_output.put_line(fn);
END;

-- Procedure 2: 

CREATE OR REPLACE PROCEDURE p2(ln in out varchar) 
IS
BEGIN
    p1('Alex');
    dbms_output.put_line(ln);
END;

-- Calling procedure
exec p2('Bob');

现在这将给我这样的输出:

Alex
Bob

但是我想一起打印名称(在一行中)为此我尝试通过创建局部变量和调用程序&将返回值存储在该变量中。这是我修改后的代码:

CREATE OR REPLACE PROCEDURE p1(fn in varchar)
IS
BEGIN
declare 
cn varchar;
cn := exec p2('Bob');
dbms_output.put_line(fn || cn); 
END;

CREATE OR REPLACE PROCEDURE p2(ln in out varchar)
IS
BEGIN
ln := ln;
END;

exec p1('Alex');

但是这不能按预期工作。我怎样才能做到这一点?

2 个答案:

答案 0 :(得分:2)

您可以创建Private Procedure来实现此目的。见下文:

CREATE OR REPLACE PROCEDURE p1 (fn IN  VARCHAR)
AS
   v_nam varchar2(100):='Bob'; 
   --private Procedure
   PROCEDURE p2 (LN IN OUT VARCHAR)
   IS
   BEGIN
      null;
   END;

BEGIN
   p2(lN => v_nam);
   DBMS_OUTPUT.put_line (fn ||' '||v_nam);
END;

执行:

SQL>  exec p1('Alex');

Alex Bob

PL/SQL procedure successfully completed.

答案 1 :(得分:2)

首先,文字不能作为in OUT参数传递 - 仅IN,因为你不能将任何内容分配给文字,是吗?现在回到手头的问题。如果您需要这两个程序能够在同一行上打印,请在所有程序中使用dbms_output.put(),但在最后一个程序中使用dbms_output.put_line(),在最后一个程序中使用CREATE OR REPLACE PROCEDURE p1(fn in varchar2) IS BEGIN dbms_output.put(fn); END; / -- Procedure 2: CREATE OR REPLACE PROCEDURE p2(ln in varchar2) IS BEGIN p1('Alex '); dbms_output.put(ln); END; / create or replace procedure p3(ln in varchar2) is begin p2('Bob '); dbms_output.put_line(ln); end; exec p3('is a nice guy') 。这是一个例子:

Alex Bob is a nice guy

PL/SQL procedure successfully completed

结果:

var arr = ["1", "6", "4", "5", "9-11", "13-15"];

Find out more