2012-03-15 63 views
0

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

+5

什么是错误? – 2012-03-15 13:11:59

+0

为什么你不应该? 我建议你读了一点点: 1.怎么问:http://www.catb.org/~esr/faqs/smart-questions.html#before 2. HTTP:// download.oracle.com/docs/cd/E11882_01/appdev.112/e17126/toc.htm – zep 2012-03-15 13:33:25

+0

http://stackoverflow.com/questions/how-to-ask – 2012-03-15 14:09:32

回答

0

我的猜测是,你正在使用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块只使用)。

9

“我试过,但我不能调用函数中的过程。”

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

因为它被允许调用的函数内的程序。所以如果它不适合你,那么你的代码中的原因是错误的。如果没有您提供比目前更多的信息,我们无法诊断。

两个最可能的原因是:

  1. 你在你的代码中的语法错误这是防止它编译,或者是投掷运行时异常一些其它的错误。

  2. 的功能可能是在程序的范围,但反之则不行。

  3. 你的程序在做一些事情的时候,我们在查询中调用一个函数(如发行DML),并且您在SELECT语句中调用你的函数这是不允许的。

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的“原型”声明,如下所示:

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 

分享和享受。

+0

我通常会尽量避免前向声明,因为这意味着两组签名必须保持同步才能获得明显的好处。按照正确的顺序组织子程序通常更容易。除非它是一个非常大的包,但即使如此,分解也许是更好的主意。 – APC 2012-03-15 16:56:18

+0

@APC - 我同意前向声明可能会产生一些问题,但在这种情况下,我建议使用一个作为可能的解决方案来解决所提出的问题,因为它似乎可能适合OP遇到的问题。因人而异。 – 2012-03-15 17:37:51

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; 
+0

这里是函数调用程序的下注例子 – Harish 2016-11-21 13:23:34

+0

欢迎来到Stack Overflow!尽管这段代码可以解决这个问题,但[包括一个解释](// meta.stackexchange.com/questions/114762/explaining-entirely-code-based-answers)确实有助于提高您的帖子的质量。请记住,您将来会为读者回答问题,而这些人可能不知道您的代码建议的原因。也请尽量不要用解释性注释来挤占代码,这会降低代码和解释的可读性! – kayess 2016-11-21 16:02:05

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; 

---------------------------------- execution -------------- -------------------

exec dbms_output.put_line(f_2); 
相关问题