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;
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引數如同一個初始化後的變數,可以對它進行讀寫操作。
比如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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 【PL/SQL】向表中插入連續數字之PL/SQL方法SQL
- 關於pl/sql中的繫結變數SQL變數
- Oracle vs PostgreSQL Develop(23) - PL(pg)sql(引數宣告)OracleSQLdev
- pl/sql中的row物件SQL物件
- PLSQL Language Reference-PL/SQL子程式-子程式引數-子程式引數傳遞方法SQL
- oracle PL/SQL中的過載OracleSQL
- pl/sql中bulk collect的用法SQL
- bash 引數替換中的模式匹配模式
- PL/SQL中繫結變數使用的簡單測試SQL變數
- PL/SQL變數作用域SQL變數
- Oracle PL/SQL中EXCEPTION用法OracleSQLException
- PL/SQL 02 宣告變數 declareSQL變數
- PLSQL Language Referenc-PL/SQL靜態SQL-游標變數-游標變數作為子程式引數SQL變數
- PL/SQL變數值可變在程式中會變嗎?SQL變數
- Oracle PL/SQL程式碼中的註釋OracleSQL
- pl/sql中的forall簡單測試SQL
- PL/SQL中char型別的暗門SQL型別
- 【PL/SQL】在PL/SQL中執行重新整理Shared Pool命令SQL
- PL/SQL開發中動態SQL的使用方法SQL
- PL/SQL中command window與SQL window的區別SQL
- PLSQL Language Reference-PL/SQL語言基礎-表示式-PL/SQL表示式中的SQL函式SQL函式
- pl/sql + client 版本位數問題SQLclient
- 利用pl/sql執行本地的sql檔案中的sql語句SQL
- PL/SQLSQL
- SQL Server 2005中的模板引數的利用方法SQLServer
- pl/sql中錯誤的異常處理SQL
- pl/sql程式碼中不得犯的錯誤!SQL
- GOTO語句在PL/SQL中的應用GoSQL
- PLSQL Language Reference-PL/SQL概覽-PL/SQL的優點SQL
- Oracle PL/SQL編寫PL/SQL程式碼的注意事項OracleSQL
- 【PL/SQL】使用變數傳遞方法生成表更名的SQL語句SQL變數
- 【SQL】Oracle交換分割槽中引數without validation引發的症狀(二)SQLOracle
- 【SQL】Oracle交換分割槽中引數without validation引發的症狀(一)SQLOracle
- PL/SQL-遊標和遊標變數的使用SQL變數
- PL/SQL 中的儲存過程與函式SQL儲存過程函式
- Oracle 12c中增強的PL/SQL功能OracleSQL
- oracle pl/sql儲存過程內外層遊標cursor巢狀引數化示例OracleSQL儲存過程巢狀
- BIRT 中如何根據引數動態拼接 SQLSQL