2010-05-18 66 views
2

當我嘗試寫入函數的只讀參數(IN)時,Oracle抱怨出錯。但從函數的只寫(OUT)參數讀取時情況並非如此。 Oracle默默地允許這個沒有任何錯誤。這種行爲的原因是什麼? 下面的代碼執行沒有任何轉讓發生的事情「因此」變量:從pl/sql中的只寫參數(OUT)讀取

create or replace function foo(a OUT number) return number 
    is 
    so number; 
    begin 
    so := a; --no assignment happens here 
    a := 42; 
    dbms_output.put_line('HiYA there'); 
    dbms_output.put_line('VAlue:' || so); 
    return 5; 
    end; 
/

declare 
    somevar number; 
    a number := 6; 
begin 
    dbms_output.put_line('Before a:'|| a); 
    somevar := foo(a); 
    dbms_output.put_line('After a:' || a); 
end; 
/

這是我得到的輸出:

Before a:6 
HiYA there 
VAlue: 
After a:42 

回答

6

從OUT參數讀數是正確的:你可以在已經寫的東西你OUT參數在過程的開始,你可能想在返回之前讀取它包含的值,這不是一個錯誤。

這裏會發生什麼事是,因爲它是一個OUT參數,而不是一個IN OUT參數的a值不傳遞給函數foo,所以在程序開始時OUT參數a包含NULL值。您可以通過註釋掉線a := 42;檢查:

SQL> create or replace function foo(a OUT number) return number 
    2 is 
    3  so number; 
    4 begin 
    5  so := a; --no assignment happens here 
    6  /*a := 42;*/ 
    7  dbms_output.put_line('HiYA there'); 
    8  dbms_output.put_line('VAlue:' || so); 
    9  return 5; 
10 end; 
11/

Function created 
SQL> declare 
    2 somevar number; 
    3 a number := 6; 
    4 begin 
    5 dbms_output.put_line('Before a:'|| a); 
    6 somevar := foo(a); 
    7 dbms_output.put_line('After a:' || a); 
    8 end; 
    9/

Before a:6 
HiYA there 
VAlue: 
After a: 
     ^^ as you can see an OUT parameter is effectively "NULLed" at the 
      beginning of a call 
+0

感謝澄清。 – sqlgrasshopper5 2010-05-19 05:44:59