读书人

为什么下面这段程序不能在DB2命令编辑

发布时间: 2012-03-17 19:06:28 作者: rapoo

为什么下面这段程序不能在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


="。预期标记可能包括:"<values>"。 SQLSTATE=42601

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

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

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

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

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

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

SQL0104N 在 "END" 后面找到异常标记 "END-OF-STATEMENT"。预期标记可能包括:"JOIN <joined_table> "。

解释:

在文本 "<文本>" 后面的指定标记处检测到 SQL
语句中或 SYSPROC.ADMIN_CMD
过程的输入命令字符串中的语法错误。 "<文本>"
字段指示无效标记前面的 SQL 语句中或 SYSPROC.ADMIN_CMD
过程的输入命令字符串的 20 个字符。

作为帮助,在 SQLCA 的 SQLERRM
字段中,提供了有效标记的部分列表作为
"<标记列表>"。此列表假设语句到该位置为止
是正确的。

无法处理该语句。

用户响应:

在指定的标记区域内检查并更正语句。

sqlcode : -104

sqlstate : 42601



[解决办法]
类似MYSQL中的结束符问题
在FUNCTION的最后加上@
然后把命令编辑器默认的语句中止字符;改为@

FUNCTION中每句都有;所以系统默认语句已经结束
[解决办法]
or
将上述代码保存为1。SQL
D:\>db2 -td@ -f 1.sql
[解决办法]
然后把命令编辑器默认的语句中止字符;改为@:修改没有
[解决办法]
db2 list command options
可以看到有关帮助
-t 设置语句终止字符
[解决办法]
@写在最后面,end后面
[解决办法]
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; @
保存为TXT文件

再连接数据库,执行db2 -td@ -f txtfilename



[解决办法]
估计是real类型不行吧,substr的后两个参数可能必须是整型的

读书人网 >IBM DB2

热点推荐