我們可以調用程序裏面的函數,但是可以調用函數裏面的程序嗎? 我試過但我不能調用函數內的過程。 你能告訴我爲什麼我們不能調用函數內的過程嗎?我們可以在PL/SQL中的一個函數裏面調用程序嗎?
回答
我的猜測是,你正在使用call proc
或exec 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塊只使用)。
「我試過,但我不能調用函數中的過程。」
你怎麼試?你嘗試了什麼?你以什麼方式失敗?
因爲它被允許調用的函數內的程序。所以如果它不適合你,那麼你的代碼中的原因是錯誤的。如果沒有您提供比目前更多的信息,我們無法診斷。
兩個最可能的原因是:
你在你的代碼中的語法錯誤這是防止它編譯,或者是投擲運行時異常一些其它的錯誤。
的功能可能是在程序的範圍,但反之則不行。
你的程序在做一些事情的時候,我們在查詢中調用一個函數(如發行DML),並且您在SELECT語句中調用你的函數這是不允許的。
我要在這裏採取猜測你已經函數聲明首先,規定的程序之後,類似於:
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
分享和享受。
我通常會盡量避免前向聲明,因爲這意味着兩組簽名必須保持同步才能獲得明顯的好處。按照正確的順序組織子程序通常更容易。除非它是一個非常大的包,但即使如此,分解也許是更好的主意。 – APC 2012-03-15 16:56:18
@APC - 我同意前向聲明可能會產生一些問題,但在這種情況下,我建議使用一個作爲可能的解決方案來解決所提出的問題,因爲它似乎可能適合OP遇到的問題。因人而異。 – 2012-03-15 17:37:51
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;
--------------------------程序裏面的函數-------------- ---------------
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);
- 1. 我們可以在dll裏面放回調函數嗎?
- 2. 我們可以在Java中的函數中調用函數嗎?
- 3. 我們可以調用一個類的構造函數嗎?
- 4. 我可以在$ scope函數裏面寫一個這個函數嗎?angularjs
- 5. 我們可以在#if語句中調用函數嗎?
- 6. 我們可以在javascript函數中調用類屬性嗎?
- 7. 我們可以在viewController類中明確調用dealloc函數嗎?
- 8. 我使用AudioServicesPlaySystemSound函數裏面,我可以通過SystemSoundID變回調用程序
- 9. 我們可以從函數調用存儲過程嗎?
- 10. 我們可以使用jquery裏面的angularjs函數
- 11. 我們可以在一個頁面中調用多個ko.applyBindings方法嗎?
- 12. 我們可以從html文本框中調用java函數嗎?
- 13. 我們可以用selenium webdriver建立一個應用程序嗎?
- 14. 我們可以從我們的android appllication安裝另一個應用程序嗎?
- 15. 我們可以從另一個函數調用OnCreate()方法
- 16. Arduino中斷函數調用另一個函數可以嗎?
- 17. 我可以只在應用程序中調用Realm.getInstance()一次嗎?
- 18. 我們可以改變一個函數的實現嗎?
- 19. 我們可以從另一個iphone應用程序調用一個iphone應用程序嗎?
- 20. 我們可以在onchange函數中調用Django Form中的Ajax嗎?
- 21. 我們可以找出哪個函數在Python中調用我的目標函數嗎?
- 22. 我們可以稱這個函數爲快速排序嗎
- 23. 我在哪裏可以在Swing程序中實現main()函數?
- 24. php5:我們可以開發桌面應用程序嗎
- 25. 我們可以在函數返回數據類型爲void的例程中調用函數嗎?
- 26. 我可以在一個腳本中使用多個函數嗎?
- 27. 我們可以用主要方法調試Java程序嗎?
- 28. 我們可以在Asp.net MVC視圖的c#代碼中調用javascript函數嗎?
- 29. 我們可以在android應用程序中使用UIAutomator嗎?
- 30. 我們可以在angularjs應用程序中使用event.preventDefault()嗎?
什麼是錯誤? – 2012-03-15 13:11:59
爲什麼你不應該? 我建議你讀了一點點: 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
http://stackoverflow.com/questions/how-to-ask – 2012-03-15 14:09:32