天天看點

pl/sql中的參數模式

在平時的工作中,可能通過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進行修改。

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