程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> Oracle數據庫 >> 關於Oracle數據庫 >> Oracle 子程序參數模式,IN,OUT,NOCOPY

Oracle 子程序參數模式,IN,OUT,NOCOPY

編輯:關於Oracle數據庫

IN主要用於傳入參數,可以是變量,常量,表達式,在子程序內部不能改變其值.
代碼如下:

DECLARE
n NUMBER := 10;
PROCEDURE do_something (
n1 IN NUMBER) IS
BEGIN
dbms_output.put_line(n1); -- prints 10
--n1:=20; --illegal assignment.
END;
BEGIN
do_something(n);
do_something(20);
END;

OUT模式用於返回值,必須傳入變量調用,變量的初始的值不會傳給形式參數,如<<1>>所示.
形參的值在子程序返回時(不是在形式參數改變時)才copy給實參, ,如<<2>>所示,如果在 返回之前發生異常,實際參數的值不會被改變.
代碼如下:

DECLARE
n NUMBER := 10;
PROCEDURE do_something (
n1 OUT NUMBER) IS
BEGIN
dbms_output.put_line('before assign: ' || n1); -- prints none <<1>>
n1:=20;
dbms_output.put_line('before return: ' || n); -- prints 10 <<2>>
END;
BEGIN
do_something(n);
dbms_output.put_line('after return: ' || n); -- prints 20
END;

NOCOPY模式用於限定OUT模式在調用時是不是以傳引用的方式進行(它只是一個編譯器暗示,不一定總是起作用),默認情況下,OUT模式的參數是以傳值的方式進行調用的.
IN主要用於傳入參數的,雖然n2 := 20被調用,但是要到返回的時候才生效.如<<1>>所示.
NOCOPY是傳引用,會在賦值的時候立即生效 ,如<<2>>所示,如果在 返回之前發生異常,實際參數的值也會被改變.
由於OUT參數在 子程序返回的時候會將值copy到實際參數,所以調用完後n的值為20,如<<3>>所示.
代碼如下:

DECLARE
n NUMBER := 10;
PROCEDURE do_something (
n1 IN NUMBER,
n2 IN OUT NUMBER,
n3 IN OUT NOCOPY NUMBER) IS
BEGIN
n2 := 20;
dbms_output.put_line(n1); -- prints 10<<1>>
n3 := 30;
dbms_output.put_line(n1); -- prints 30 <<2>>
END;
BEGIN
do_something(n, n, n);
dbms_output.put_line(n); -- prints 20 <<3>>
END;

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved