执行Sybase存储过程时遇到的坑

Sybase数据库中执行存储过程时遇到的坑


     Sybase数据库估计很多年轻人没听过,现在一般数据库都比较流行Sql Server,Oracle等中大型数据库,Sybase数据库逐渐退出了历史竞争的舞台,但即便如此,国内仍然有不少国企和一些历史悠久的民营公司都在用着sybase数据库,而且我发现一个特别有趣的一点,过去的人们特别喜欢在存储过程中扎堆写业务代码,各种奇葩逻辑,各种判断语句,甚至在存储过程中还会嵌套着另一个存储过程,有时连页面的分页参数也放到存储过程中进行处理,当然我并不是否定这样做不好,只是现在一般都不推荐这样的做法了,至少阿里是不推荐的!

     在开始描述之前先给大家普及一下什么叫做Sybase,在百度上是这样描述的:

      美国Sybase公司研制的一种关系型数据库系统,是一种典型的UNIX或WindowsNT平台上客户机/服务器环境下的大型数据库系统。 Sybase提供了一套应用程序编程接口和库,可以与非Sybase数据源及服务器集成,允许在多个数据库之间复制数据,适于创建多层应用。系统具有完备的触发器、存储过程、规则以及完整性定义,支持优化查询,具有较好的数据安全性。Sybase通常与SybaseSQLAnywhere用于客户机/服务器环境,前者作为服务器数据库,后者为客户机数据库,采用该公司研制的PowerBuilder为开发工具,在我国大中型系统中具有广泛的应用。

     下面开始我的讲解:
就在昨天我执行如下“test1”这个存储过程的时候,居然报错了!!!!
DECLARE @total_num		    int			   
DECLARE @total_fee		    varchar(12)		
DECLARE @return_code        char(4)          
DECLARE @error_msg          varchar(255)     
EXEC test1  '','','1234','','','','','','','2013-02-01','2013-02-02','','','','10', '1','4',@total_num OUTPUT,@total_fee OUTPUT,@return_code OUTPUT,@error_msg OUTPUT 

报错信息如下所示:

截图信息
从以上途中翻译成中文意思是:SQL错误[107][S1000]:列前缀“界面”不匹配的表名或别名查询中使用。java.sql。SQLException异常:列前缀“界面”不匹配表名或别名查询中使用。的表不是在FROM子句中指定或必须使用它有一个相关的名字。
从中可以分析出,存储过程中肯定有个前缀名为ui的东西导致了相对应的表和列都找不到,所以无论如何先要从“ui”这个家伙开刀!
     梳理了一遍存储过程发现,果然有些地方出了一些问题。如下图所示,
第一张图:在这里插入图片描述

第二张图:在这里插入图片描述
从上图可以看出ui.user_name在from dsf_order表后面压根是不存在的,所以自然就会报前缀ui无效的bug了,那么这个ui又是从哪里来的呢,我们继续往下看,居然发现更神奇的东西,如下图所示:
第三张图:
在这里插入图片描述
看到这里,我恍然大悟,原来"select @condition = @condition + ’ and ui.user_name like’ + @q + ‘%’ + @mer_name + ‘%’ + @q“(第一张图)这个条件组装语句不应该放到那个位置,应该放在第二张图中exec(@sql) 这一行语句的下面,这样才会使得ui这个别名才是有效的~,不然的话依旧会报那个错误!


     遇到这个问题时当想了半天,最后幸亏是一个同事帮我解决了,所以写程序或者分析bug时特别要注意细节的错误,仔细看清楚每一行代码执行的目的和含义,这样你才能更快地解决问题!

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Melo_FengZhi

您的鼓励对我就是巨大的动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值