PL/SQL中對out,in out參數使用的?默認形參會復制一份實參的副本,然后在內部傳遞,修改等,發生異常,不會賦值給實參,控制權交還調用環境,而實參值不變,還是調用前的值。而使用了NOCOPY后,形參將獲得一個指向實參的指針,然后在內部傳遞,賦值都直接修改實參了,此時如果異常發生,控制權交還調用環境,但是實參已經被修改了。無法還原成調用前的值。
對參數I N使用NOCOPY將會產生編譯錯誤,這是因為參數I N總是按引用傳遞.
NOCOPY的主要優點是可以提高程序的效率。當我們傳遞大型PL/SQL表時,其優越性特別顯著.使用NOCOPY的限制在某些情況下,NOCOPY將被編譯器忽略,這時的參數仍將按值傳遞。這時,編譯器不會報告編譯錯誤。由于NOCOPY是一個提示項(Hint),編譯器可以決定是否執行該項。在下列情況下,編譯器將忽略NOCOPY項:
1.實參是索引表(index-by table)的成員時。如果該實參是全表,則該限制不起作用。
2.實參被強制指定精度,比例或NOT NULL時。該限制將不適用按最大長度強制的字符串參數。
3.實參和形參都是記錄類型,二者是以隱含方式或使用了%ROWTYPE類型聲明時,作用在對應字段的強制說明不一致。
4.傳遞實參需要隱式類型轉換時。
5.子程序涉及到遠程過程調用(PRC)。遠程過程調用就是跨越數據庫對遠程服務器的過程調用。