【DB2报错】执行存储过程报 SQLCODE:-104 SQLSTATE:42601

今天创建存储过程的时候碰到这个报错:

AN unexpected tkoen "END-OF-STATEMENT" was found following "COMMIT",Expected tokens may include:"END IF"..SQLSTATE:42601 SQLCODE:-104

不要慌!!遇事不决先翻译!!!

翻译:在“COMMIT”之后发现了一个异常的tkoen“END-OF-STATEMENT”,异常的tkoen 可能包括:“END IF”.SQL状态:-104 SQL代码:42601

报错解释 :

原因分析:

处理方式:

情况一、

情况二、


报错解释 :

SQLCODE:-104   错误状态码,在 文本 后面找到异常 标记。预期标记可能包括: 标记列表

SQLSTATE:42601 错误类代码,含义字符、标记或自居无效或丢失。

用户响应:在指定的标记区域内检查并更正语句。


原因分析:

根据提示找到问题语句所在地方,COMMIT后面也只是一个正常的 IF 判断结束和 存储过程结束而已,并没有什么异常。但是提示还另外补了一句unexpected tkoen "END-OF-STATEMENT" 结束出现了问题。

CREATE OR REPLACE PROCEDURE DROP_VIEW(
  IN V_NAME VARCHAR(100))
BEGIN
 DECLARE CNT_V INTEGER;
 DECLARE DROP_SQL VARCHAR(1000);

SET CNT_V= (SELECT COUNT(1) FROM SYSCAT.VIEWS WHERE VIEWSCHEMA = TRIM(CURRENT_SCHEMA) AND VIEWNAME = V_NAME);
IF CNT_V <> 0 THEN
SET DROP_SQL = 'DROP VIEW ' || V_NAME;
COMMIT;
END IF;

END;

处理方式:

情况一、

按照提示的话我们可以发现问题就出现在存储过程结束的位置,检查结束语句分隔符为“@”;

先进行一波检查  DBeaver 客户端 工具栏 中 【窗口】-->>【首选项】 找到设置语句分隔符的窗口。

 基于第一种情况如果正常存储过程的内容没有任何语法问题,应用并关闭后是可以执行成功的。

ps:因为这次我执行创建存储过程实在DBeaver上,底层对应的DB2数据库是基于Linux环境部署的,所以它接受的存储过程 结束语句分隔符为“@” 而并不是常见的 结束语句分隔符“;”。


情况二、

明明已经按照 情况一 的步骤改好了语句分隔符,为什么还是会报SQLSTATE:42601 SQLCODE:-104呢?!主要原因有如下:

  1. 根据提示查看出现报错的位置是否有语法错误。一般存储过程是从上往下执行的。如果有重复的 字眼 ,看第一个出现该 字眼 的位置就好了。
  2. 多个 IF 条件或者其他循环体中 漏了 END IF;有时候 IF 一层套一层的很容易少了的。
  3. SET = ........ 句式后面忘记添加 “;” 作为结束了。因为存储过程中基本每一句后面都要加 “;”,出了 IF.....THEN 还有循环 那些开头外。

其他报错 的原因码以及其他报错的错误状态码可以在下面 IBM 的链接查看。

👇👇👇👇👇👇👇👇👇👇👇
SQL0500 - SQL0749 - IBM Documentationhttps://www.ibm.com/docs/en/db2/11.1?topic=messages-sql0500-sql0749#sql0668n有需要文档的同学也可以私信我~

  • 25
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值