在平時的工作中,可能通過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;
test_value:=100;
test_param(test_value);
dbms_output.put_line('test_value is '||test_value);
/
唯一的不同之處就在于參數類型,分别為in,out,in out
運作的結果如下:
procedure test_param(t_value in integer)
*
ERROR at line 6:
ORA-06550: line 6, column 1:
PLS-00363: expression 'T_VALUE' cannot be used as an assignment target
PL/SQL: Statement ignored
procedure test_param(t_value out integer)
test_value is
procedure test_param(t_value in out integer)
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進行修改。
明白了基本點,不能說哪種模式好,隻有最合适的。