nocopy模式用於限定out模式和in out模式在呼叫時是不是以傳引用的方式進行。預設情況下,out模式和in out模式的引數是以傳值的方式進行呼叫的。
in模式總是以傳引用的方式,如果用nocopy限制會報錯。
傳值就是將實參的值複製到形參。(因為複製,速度會沒有傳引用快)
傳引用就意味著將實參的值的乙個指標傳遞到相應的引數,形參改變實參也會立即被改變。(這些在c指標中講的比較好)
--nocopy限制的out模式
create
orreplace
procedure
raiseerrorcopy(
p_raise
inboolean,
p_parametera out nocopy
number
--將傳值用nocopy限制為傳引用
)asbegin
p_parametera:=7
;
if p_raise then
raise dup_val_on_index;
else
return
;
endif
;end
raiseerrorcopy;
--測試效果
v_num:=1
;begin
dbms_output.put_line(
'value before first call: '||
v_num);
raiseerrorcopy(false,v_num);
dbms_output.put_line(
'value after sucessful call: '||
v_num);
dbms_output.put_line(
'');
v_num:=2
; dbms_output.put_line(
'value before second call: '||
v_num);
raiseerrorcopy(true,v_num);
exception
when others then
dbms_output.put_line(
'value after unsucessful call: '||
v_num);
end;
value before first call:
1value after sucessful call:
7value before second call:
2value after unsucessful call:7--
即使沒有完全成功,但是實參值也因形參改變而立即改變了
如果沒有nocopy限制。結果將會是:
value before first call: 1value after sucessful call:
7value before second call:
2value after unsucessful call:2--
只有當程式正常結束時,賦給out或者in out型別引數的值才會返回
nocopy的主要優點是它可以提高程式效能。傳遞大型陣列的時候,這一點尤為突出當我們宣告乙個引數是in型別時,進行傳參是將傳給該引數乙個實參的指標;
當我們宣告乙個引數是out或者in out型別時,進行傳參是將傳給該引數乙個實參的拷貝;
只有當程式正常結束時,賦給out或者in out型別引數的值才會返回(除非使用了nocopy)。
將nocopy應用在傳遞資料量很大的引數(such as collections, records,and instances of object types)時,可起到優化效能的作用。
當引數是out或者in out型別時:沒有nocopy=按值傳遞(byval);加上nocopy=按引用傳遞(byref)
pl/sql programming scott urman
Android 輸入金額限制,各種限制
小菜最近因工作需要做乙個支付金額對話方塊的小模組,技術很淺顯,遇到幾個小坑,分享給大家 需求小菜遇到的坑之一 其他頁面中獲取到的金額需要儲存兩位小數,本來我打算直接用 string 轉為 double 型別,但是遇到儲存精度問題 string 19.99 double 19.98 所以借鑑bigde...
python科技限制 python 訪問限制
class person object def run self print self.money print run def eat self,food print eat food def init self,name,age,height,weight,money self.name name...
mysql資源限制 MySQL 限制使用者使用資源
在mysql 5.7及後續版本中,可以按照賬號來限制每個賬號實際具有的資源限制。語法 grant with option,如 grant select on test.to user1 localhost with max queries per hour3max user connections5...