2012-03-15 62 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); 
相關問題