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

Oracle 如何在过程中调用存储过程并在同一行中打印输出?,oracle,plsql,Oracle,Plsql,如何在过程中调用存储过程并在同一行中打印输出。 例如,我的全名是“Alex Bob”,我为firstname(p1)和lastname(p2)创建了两个过程,如下所示: -- 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

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

-- 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');

但这并不像预期的那样有效。如何实现这一点?

您可以创建一个
私有过程来实现这一点。见下文:

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.

您可以创建一个
专用过程来实现这一点。见下文:

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.

首先,文字不能作为
in-OUT
参数传递,只能作为
in
传递,这仅仅是因为您不能为文字分配任何内容,对吗?现在回到手头的问题。如果您需要这两个过程能够在同一行上打印,请在所有过程中使用
dbms\u output.put()
,但最后一个过程和最后一个调用
dbms\u output.put\u 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

首先,文字不能作为
输入输出
参数传递-仅
输入
,这仅仅是因为您不能为文字分配任何内容,对吗?现在回到手头的问题。如果您需要这两个过程能够在同一行上打印,请在所有过程中使用
dbms\u output.put()
,但最后一个过程和最后一个调用
dbms\u output.put\u 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