【案例分析】创建存储过程报错误282: Found a quote for which there is no matching quote.

创建存储过程时第4行报282错误,该错误的原是说引号不匹配。创建的存储过程语句如下:

drop procedure if exists proc1;
create procedure proc1(out p_cursor sys_refcursor)
  define v_sqlstr lvarchar(1024);
  let v_sqlstr = "select tabid,tabname 
                  from systables
                  where tabid > 99
                    and tabtype = 'T'";
  open p_cursor for v_sqlstr;
end procedure;

从let 语句上看,只有简单的双引号、单引号,且存在一一对应关系,不应存在引号不匹配的情况。
考虑到引号内存在换行,那么可能的原因就是数据库没有开启ALLOW_NEWLINE。
在没有开启ALLOW_NEWLINE的情况下,引号内的内容不允许换行。即:
语句需要改为

  -- 单行
  let v_sqlstr = "select tabid,tabname from systables where tabid > 99 and tabtype = 'T'";
  -- 或者
  let v_sqlstr = "select tabid,tabname " || 
                 "from systables " ||
                 "where tabid > 99 " ||
                 "  and tabtype = 'T'";

为避免出现字符串换行出现的此类问题,可以在ONCONFIG配置文件中开启ALLOW_NEWLINE(默认为0,不开启),设置为1为开启允许换行

ALLOW_NEWLINE 1

如果临时仅仅是当前会话允许使用换行,那么可以先执行过程ifx_allow_newline('f')

execute procedure ifx_allow_newline('t');

然后,该会话在关闭前或者修改allow_newline参数前,将允许字符串换行。

标签: 282, ALLOW_NEWLINE, 引号不匹配

添加新评论