Особенностью 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>
Конечно, мы можем определить параметр процедуры, используя SUBTYPE, но Oracle ее проигнорирует.То же самое относится и к типам возвращаемых функций ...
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 (или ВОЗВРАЩАЙТЕ переменную для функций).
Это довольно многословный способ сказать, что вы можете использовать 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>
Таким образом, лучше не использовать неподходящий подтип.Вместо этого объявите свое собственное.