pl/sql中的引數模式

jeanron100發表於2015-02-22
在平時的工作中,可能透過pl/sql傳入引數來做一些特定的操作,引數模式一般有In,out.in out這幾種
比如dbms_sqltune下的PREPARE_SQLSET_STATEMENT就包含了三種型別的引數
FUNCTION PREPARE_SQLSET_STATEMENT RETURNS VARCHAR2
 Argument Name                  Type                    In/Out Default?
 ------------------------------ ----------------------- ------ --------
 SQLSET_NAME                    VARCHAR2                IN
 SQLSET_OWNER                   VARCHAR2                IN
 BASIC_FILTER                   VARCHAR2                IN     DEFAULT
 STMT_FILTER                    BOOLEAN                 IN     DEFAULT
 OBJECT_FILTER                  VARCHAR2                IN     DEFAULT
 PLAN_FILTER                    VARCHAR2                IN     DEFAULT
 RANK1                          VARCHAR2                IN     DEFAULT
 RANK2                          VARCHAR2                IN     DEFAULT
 RANK3                          VARCHAR2                IN     DEFAULT
 RESULT_PERCENTAGE              NUMBER                  IN     DEFAULT
 RESULT_LIMIT                   NUMBER                  IN     DEFAULT
 ATTRIBUTE_LIST                 VARCHAR2                IN     DEFAULT
 ATTRIBUTE_SELECTED             BINARY_INTEGER          IN/OUT
 WRAP_OBJ_CTOR                  BOOLEAN                 IN     DEFAULT
 CHECK_BINDS                    BOOLEAN                 IN     DEFAULT
 STS_ID                         NUMBER                  OUT
 FIRST_ROWS_HINT                BOOLEAN                 IN     DEFAULT
可能猛然接觸會對這三種型別有些疑惑,為了能夠從對比中說明問題,我會使用如下的pl/sql塊做為例子。
例子雖然簡單,但是結果卻截然不同。

declare
test_value integer;
procedure test_param(t_value in integer)
is
begin
t_value:=t_value+1;
end;
begin
test_value:=100;
test_param(test_value);
dbms_output.put_line('test_value is '||test_value);
end;
/

唯一的不同之處就在於引數型別,分別為in,out,in out
執行的結果如下:
declare
test_value integer;
procedure test_param(t_value in  integer)
is
begin
t_value:=t_value+1;
end;
begin
test_value:=100;
test_param(test_value);
dbms_output.put_line('test_value is '||test_value);
end;
/
t_value:=t_value+1;
*
ERROR at line 6:
ORA-06550: line 6, column 1:
PLS-00363: expression 'T_VALUE' cannot be used as an assignment target
ORA-06550: line 6, column 1:
PL/SQL: Statement ignored

declare
test_value integer;
procedure test_param(t_value out  integer)
is
begin
t_value:=t_value+1;
end;
begin
test_value:=100;
test_param(test_value);
dbms_output.put_line('test_value is '||test_value);
end;
/

test_value is

declare
test_value integer;
procedure test_param(t_value in out  integer)
is
begin
t_value:=t_value+1;
end;
begin
test_value:=100;
test_param(test_value);
dbms_output.put_line('test_value is '||test_value);
end;
/

test_value is 101

in 模式
允許使用者將值傳送到子程式中
in引數類似於一個常量,所以不能對它賦值
對於第一個例子,執行不成功,這個錯誤能夠說明對於in引數的解釋,in引數類似一個常量,不能對它賦值,如果需要對它進行賦值,需要考慮使用out或者in out模式。

out 模式
out引數主要用於子程式返回某些只給子程式的呼叫者,out引數類似一個沒有初始化的變數,使用之前必須初始化
第二個例子。可以看出執行沒有問題,但是out引數由於沒有在子程式中初始化,所以就預設為null,再做任何運算都是Null了。
如果希望在子程式中生效,需要對它進行初始化。

in out 模式
in out引數如同一個初始化後的變數,可以對它進行讀寫操作。
這個引數在這個例子中算是功能比較齊全,能夠滿足我們的需求,可以在子程式test_param對t_value進行修改。

明白了基本點,不能說哪種模式好,只有最合適的。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/23718752/viewspace-1439877/,如需轉載,請註明出處,否則將追究法律責任。

相關文章