为什么下面这段程序不能在DB2命令编辑器中运行?

为什么下面这段程序不能在DB2命令编辑器中运行?在线等.
CREATE FUNCTION "BRAS".FUN_GET_LSH_FROM_YJNR ( yjnr VARCHAR(80) )
  RETURNS VARCHAR(30)
BEGIN ATOMIC
declare v_startpos real;
declare v_endpos real;
declare v_len real;
declare v_fhy varchar(100);
declare v_lsh varchar(100);
declare Result varchar(30);

set v_startpos = locate('主机流水号:',yjnr);
if(v_startpos = 0) then
return '';
end if;
set v_endpos = locate('|柜员流水号',yjnr);
if(v_endpos = 0) then
return '';
end if;
set v_startpos = v_startpos + 6;
set v_len = v_endpos-v_startpos;
set Result = '';
if (v_len > 0) then
set Result = substr(yjnr,v_startpos,v_len);
end if;

RETURN Result;
END;

错误信息:
CREATE FUNCTION "BRAS".FUN_GET_LSH_FROM_YJNR ( yjnr VARCHAR(80) )
  RETURNS VARCHAR(30)
BEGIN ATOMIC
declare v_startpos real
DB21034E 该命令被当作 SQL
语句来处理,因为它不是有效的“命令行处理器”命令。在 SQL 处理期间,它返回:
SQL0104N 在 "C declare v_startpos" 后面找到异常标记
"real"。预期标记可能包括:"END-OF-STATEMENT"。 LINE NUMBER=4. SQLSTATE=42601

declare v_endpos real
DB21034E 该命令被当作 SQL
语句来处理,因为它不是有效的“命令行处理器”命令。在 SQL 处理期间,它返回:
SQL0104N 在 "declare v_endpos " 后面找到异常标记
"real"。预期标记可能包括:"END-OF-STATEMENT"。 SQLSTATE=42601

declare v_len real
DB21034E 该命令被当作 SQL
语句来处理,因为它不是有效的“命令行处理器”命令。在 SQL 处理期间,它返回:
SQL0104N 在 "declare v_len " 后面找到异常标记
"real"。预期标记可能包括:"END-OF-STATEMENT"。 SQLSTATE=42601

declare v_fhy varchar(100)
DB21034E 该命令被当作 SQL
语句来处理,因为它不是有效的“命令行处理器”命令。在 SQL 处理期间,它返回:
SQL0104N 在 "BEGIN-OF-STATEMENT" 后面找到异常标记 "declare v_fhy
varchar"。预期标记可能包括:"<values>"。 SQLSTATE=42601

declare v_lsh varchar(100)
DB21034E 该命令被当作 SQL
语句来处理,因为它不是有效的“命令行处理器”命令。在 SQL 处理期间,它返回:
SQL0104N 在 "BEGIN-OF-STATEMENT" 后面找到异常标记 "declare v_lsh
varchar"。预期标记可能包括:"<values>"。 SQLSTATE=42601

declare Result varchar(30)
DB21034E 该命令被当作 SQL
语句来处理,因为它不是有效的“命令行处理器”命令。在 SQL 处理期间,它返回:
SQL0104N 在 "BEGIN-OF-STATEMENT" 后面找到异常标记 "declare Result
varchar"。预期标记可能包括:"<values>"。 SQLSTATE=42601

set v_startpos = locate('主机流水号:',yjnr)
DB21034E 该命令被当作 SQL
语句来处理,因为它不是有效的“命令行处理器”命令。在 SQL 处理期间,它返回:
SQL0104N 在 "BEGIN-OF-STATEMENT" 后面找到异常标记 "set v_startpos
="。预期标记可能包括:"<values>"。 SQLSTATE=42601

if(v_startpos = 0) then return ''
DB21034E 该命令被当作 SQL
语句来处理,因为它不是有效的“命令行处理器”命令。在 SQL 处理期间,它返回:
SQL0104N 在 "BEGIN-OF-STATEMENT" 后面找到异常标记
""。预期标记可能包括:"<create_view>"。 SQLSTATE=42601

end if
DB21034E 该命令被当作 SQL
语句来处理,因为它不是有效的“命令行处理器”命令。在 SQL 处理期间,它返回:
SQL0104N 在 "end if" 后面找到异常标记
"END-OF-STATEMENT"。预期标记可能包括:"JOIN <joined_table>"。 SQLSTATE=42601

set v_endpos = locate('|柜员流水号',yjnr)
DB21034E 该命令被当作 SQL
语句来处理,因为它不是有效的“命令行处理器”命令。在 SQL 处理期间,它返回:
SQL0104N 在 "BEGIN-OF-STATEMENT" 后面找到异常标记 "set v_endpos
="。预期标记可能包括:"<values>"。 SQLSTATE=42601

if(v_endpos = 0) then return ''
DB21034E 该命令被当作 SQL
语句来处理,因为它不是有效的“命令行处理器”命令。在 SQL 处理期间,它返回:
SQL0104N 在 "BEGIN-OF-STATEMENT" 后面找到异常标记
""。预期标记可能包括:"<create_view>"。 SQLSTATE=42601

end if
DB21034E 该命令被当作 SQL
语句来处理,因为它不是有效的“命令行处理器”命令。在 SQL 处理期间,它返回:
SQL0104N 在 "end if" 后面找到异常标记
"END-OF-STATEMENT"。预期标记可能包括:"JOIN <joined_table>"。 SQLSTATE=42601

set v_startpos = v_startpos + 6
DB21034E 该命令被当作 SQL
语句来处理,因为它不是有效的“命令行处理器”命令。在 SQL 处理期间,它返回:
SQL0104N 在 "BEGIN-OF-STATEMENT" 后面找到异常标记 "set v_startpos