這是Oracle PL/SQL的一個特點,即存儲過程參數和函數返回類型不能被限制。也就是說,我們不能有一個過程,像這樣的簽名:
SQL> create or replace procedure my_proc (p1 in varchar2(30))
2 is
3 begin
4 null;
5 end;
6/
Warning: Procedure created with compilation errors.
SQL> show error
Errors for PROCEDURE MY_PROC:
LINE/COL ERROR
-------- -----------------------------------------------------------------
1/34 PLS-00103: Encountered the symbol "(" when expecting one of the
following:
:= .) , @ % default character
The symbol ":=" was substituted for "(" to continue.
SQL> create or replace procedure my_proc (p1 in varchar2)
2 is
3 begin
4 null;
5 end;
6/
Procedure created.
SQL>
當然,我們可以用一個亞型定義過程的參數,但甲骨文會忽視它。這同樣適用於函數的返回類型...
SQL> create or replace package my_subtypes as
2 subtype ltd_string is varchar2(30);
3 end;
4/
Package created.
SQL> create or replace function my_func return my_subtypes.ltd_string
2 is
3 begin
4 return lpad('a', 4000, 'a');
5 end;
6/
Function created.
SQL> select length(my_func) from dual
2/
LENGTH(MY_FUNC)
---------------
4000
SQL>
限制參數的唯一途徑和返回類型是聲明使用存儲過程中的亞型變量。使用包中的變量,並將它們分配給OUT參數(或者將函數的RETURN變量)。
這是一種冗長的說法,你可以在你的代碼中使用DBMS_OBFUSCATION_TOOLKIT.VARCHAR2_CHECKSUM
確信它不會阻止你的函數返回32個字符。
但是,它會混淆查找SUBTYPE聲明的開發人員。在最壞的情況下,這些人會用亞型具有以下悲慘結果宣佈自己的工作變量:
SQL> declare
2 v my_subtypes.ltd_string;
3 begin
4 v := my_func;
5 end;
6/
declare
*
ERROR at line 1:
ORA-06502: PL/SQL: numeric or value error: character string buffer too small
ORA-06512: at line 4
SQL>
因此,最好不要使用不恰當的亞型。相反,申報你自己的。
來源
2011-05-05 12:58:12
APC
這是在那裏我希望能夠接受兩個答案的情況之一...... – 2011-06-09 11:39:37