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

时间:2012-03-15 13:09:14

标签: oracle function stored-procedures plsql oracle10g

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

5 个答案:

答案 0 :(得分:9)

  

“我试过,但我不能在函数内部调用过程。”

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

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

两个最可能的原因是:

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

  2. 该功能可能在程序的范围内,但反之亦然。

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

答案 1 :(得分:4)

我将在这里猜测你首先声明了函数,程序如下:类似于:

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

如上所示,首先声明函数,您可以从过程中调用该函数。但是,如果您尝试类似以下内容(在过程之前声明的函数和函数调用过程):

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

编译将失败,因为my_func无法“看到”my_proc。为了使它工作,你需要输入my_proc的'prototype'声明,如下所示:

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

分享并享受。

答案 2 :(得分:1)

我的猜测是您使用的是call procexec proc。请参阅下面的示例如何调用该过程。

CREATE OR REPLACE function f() return number as
BEGIN
  your_proc;
  another_proc_with_param(2, 'John');
  return 0;
EXCEPTION when others then return -1;
END f;

但是,如果您的函数(或函数调用的函数)执行DML,则您的函数不能在sql语句中使用。(只能在PLSQL块中使用)。

答案 3 :(得分:0)

create or replace function test_fun(id in number) return number 
as 
val number;
begin 
get_data(id,val);
return val;
end;

create or replace procedure get_data(a in number ,b out number)
as
id number; 
begin
b:=a*a;
end;

答案 4 :(得分:0)

--------------------------程序内部函数------------------ -----------

create or replace function f_2  return date as

begin

declare

today_date date;

x number; 

-------程序声明-----------------

procedure pro_3(d_date out date )

is

begin

d_date:=sysdate;

end pro_3;

BEGIN 

---------程序叫--------------------

pro_3(today_date);

for x in 1..7 LOOP 

IF TO_CHAR(today_date,'FMDAY')='SUNDAY' THEN 

GOTO label_name; 

END IF; 

today_date:=today_date+1; 

END LOOP; 

<<label_name>> 

DBMS_OUTPUT.PUT_LINE(TO_CHAR(today_date,'DAY')||today_date);

end;

DBMS_OUTPUT.PUT_LINE('today is  ' ||TO_CHAR(sysdate,'DAY'));

return sysdate;

end;

----------------------------------执行------------ ---------------------

exec dbms_output.put_line(f_2);