函数中的调用过程

时间:2019-05-24 15:39:03

标签: oracle plsql

您可以从函数内部调用PL / SQL过程吗?

我还没有遇到实际的例子。因此,如果有人遇到这个例子,请分享。

2 个答案:

答案 0 :(得分:1)

是的。您可以从任何其他pl / sql程序内部调用任何pl / sql程序。一个函数可以调用一个函数,一个过程可以调用一个调用函数的过程,一个函数可以调用TYPE BODY ...执行INSERT ..这会导致TRIGGER触发。

一个简单(不是很实际)的例子。

使用HR模式,其中有一个EMPLOYEES表,其中包含EMPLOYEE_ID,FIRST_NAME和LAST_NAME列。

我有一个接收INTEGER的函数,我们用它来查找EMPLOYEE记录。我们将它们的名字和姓氏合并在一起,然后以大写字母返回值。

但是,在执行此操作之前,我们将调用一个过程,该过程仅使用DBMS_LOCK包小睡了5秒钟。

代码:

create or replace procedure do_nothing_comments (x in integer, y in integer)
is
begin
 null;
 -- yeah, this is a dumb demo
 dbms_lock.sleep(5);
end;
/

create or replace FUNCTION upper_name (
    x IN INTEGER
) RETURN VARCHAR2 IS
    upper_first_and_last VARCHAR2 (256);
BEGIN
    SELECT upper (first_name)
           || ' '
           || upper (last_name)
      INTO upper_first_and_last
      FROM employees
     WHERE employee_id = x;

    do_nothing_comments (1, 2); -- here we are calling the procedure
    RETURN upper_first_and_last;
END;

/

现在让我们调用该函数。

DECLARE
  X NUMBER;
  v_Return VARCHAR2(200);
BEGIN
  X := 101;

  v_Return := UPPER_NAME(
    X => X
  );
  :v_Return := v_Return;
END;

/

我将在SQL Developer中使用Execute功能在打开功能的情况下执行此操作:

enter image description here

我得到了答案……只比实际需要的时间长5秒。

答案 1 :(得分:0)

您在这里:

create or replace function demo
    return varchar2
as
begin
    dbms_output.put_line('Hello');
    return 1;
end demo;