我们可以在PL/SQL中的函数内调用过程吗?

use*_*398 2 oracle plsql stored-procedures function oracle10g

我们可以在程序里面调用函数,但是可以在函数内部调用程序吗?我试过但我不能在函数内部调用程序.你能告诉我为什么我们不能调用函数内的程序吗?

APC*_*APC 9

"我试过但我不能在函数内调用程序."

你是怎么试的?你尝试了什么?你以什么方式失败了?

因为允许在函数内部调用过程.因此,如果它不适合您,那么您的代码中的原因是错误的.如果没有提供比现在更多的信息,我们无法诊断出来.

最可能的两个原因是:

  1. 您的代码中存在语法错误,导致其无法编译,或者其他一些错误导致运行时异常.

  2. 该函数可能在过程的范围内,但反之亦然.

  3. 当我们在查询中调用函数(例如发出DML)并且您在SELECT语句中调用函数时,您的过程正在执行一些不允许的操作.


Bob*_*ica 6

我将在这里进行猜测,您首先声明了函数,其过程如下:

DECLARE
  FUNCTION my_func RETURN NUMBER IS
  BEGIN
    RETURN 2;
  END my_func;

  PROCEDURE my_proc IS
  BEGIN
    DBMS_OUTPUT.PUT_LINE(my_func + 1);
  END my_proc;

BEGIN  -- main
  my_proc;
END;    -- main
Run Code Online (Sandbox Code Playgroud)

如上所示,在首先声明函数的情况下,您可以从过程中调用该函数。但是,如果尝试以下操作(在过程之前声明的函数,然后函数调用过程):

DECLARE
  FUNCTION my_func RETURN NUMBER IS
  BEGIN
    my_proc;
    RETURN 2;
  END my_func;

  PROCEDURE my_proc IS
  BEGIN
    DBMS_OUTPUT.PUT_LINE('22');
  END my_proc;

BEGIN  -- main
  DBMS_OUTPUT.PUT_LINE(my_func);
END;    -- main
Run Code Online (Sandbox Code Playgroud)

编译将失败,因为my_func无法“查看” my_proc。为了使其正常工作,您需要输入my_proc的“原型”声明,如下所示:

DECLARE
  PROCEDURE my_proc;

  FUNCTION my_func RETURN NUMBER IS
  BEGIN
    my_proc;
    RETURN 2;
  END my_func;

  PROCEDURE my_proc IS
  BEGIN
    DBMS_OUTPUT.PUT_LINE('22');
  END my_proc;

BEGIN  -- main
  DBMS_OUTPUT.PUT_LINE(my_func);
END;    -- main
Run Code Online (Sandbox Code Playgroud)

分享并享受。