分享

sybase存储过程书写技巧

 云淡风轻轻123 2010-09-16

第一篇 变量篇

数据库中只有两类数据,一类是单变量,一类是集合变量。
declear 就是定义变量
create table 就是定义结果集变量
select 结果就是结果集,但是select可以给变量赋值,这点比较特殊。

比如:
1、select @aa = "aa"
这是给单个变量赋值
2、insert into T_TEST select XXX from XXX
这就是给表T_TEST赋值
把集合变量可以理解为java中的List——似乎为废话,那也说了,将就看吧。
而select XXX into T_TEST from XXX 则是把定义变量与赋值合一了,相当于java中的String aa = "";
sybase提供的临时表,我们就可以当作临时变量。

3、系统提供的诸如avg、sum、count等函数,我们可以理解为java中的api,拿来用就可以了。
有了变量定义、变量类型、计算操作符、api,我们就可以开始编程了。

第二篇 输出篇
1、系统输出
select 无疑是万能输出工具,什么变量都可以输出
print  就是我们console

2、insert into 也是输出
大家很奇怪吧!!
其实我们都有针对每天定时更新表数据的开发过程,这里可以转换思路达到实时统计的目的。

如果需要对一个中间结果产生多个统计结果,那么insert into是最好的选择,来看看吧。
a、在tempdb创建一个全局临时表
create table tempdb.guest.T_OLAP_SP_XS_DM
b、insert into 这个表数据
c、这样就能够在多个存储过程中(或者单独的select)查询到你想要的各种统计数据,ok后就可以删除这个表了。
d、全局临时表我们也是可以用程序动态生成啊,这样可以实现存储过程的并发,多好啊!(为什么用tempdb呢?因为它的日志小,全内存,快速)

3、group by、distinct
这与join一样,是描述操作集合变量的方法。
我的理解是:
join 把2个或2个以上的集合变量合并为一个集合变量使用;
group by 把1个集合变量分解为多个几个变量使用;
distinct 把减少了集合变量中重复的内容;
这样我们就又多了集中变量计算方法,其实这些与加减乘除都一样,

第三篇 模块化1、结构控制
a、if —— java中的if(一点区别也没有)
亲切吧.
if @a = 1 —— sql
if( a == 1 ) —— java
嘿嘿!你要是觉得不一样,我也没话说了。

b、游标——java中的for(感觉比java的for好方便)
可以在for的体内,体外定义循环计数变量,我们也能够完成java中计数等功能,再配合if,简直无敌了。

2、变量返回
a、output 返回单变量
这就是java中函数返回变量,多简单啊。
public int getid()

create procedure P_OLAP
    @COUNTS      int = 1 output       
有什么区别么?只不过是书写形式的不同了,等你看习惯了就是一样的。
有了它,自然可以在多个存储过程中传递数据。

b、临时表 共用结果集
看到了存储过程能够通过output返回单变量,是不是有想法让存储过程返回结果集呢?简单啊。
p1 创建临时表#t ,调用p2产生结果集。
p2 直接insert into #t 就可以了,这样p1就可以用了。

有人说p2创建出错,因为没有#t表。两种解决方法。
第一种、在创建存储过程的前面先创建一模一样的 #t,等p2创建完毕了再删除 #t ;
第二种、在p2中动态拼写insert into #t脚本,用exec执行这个脚本;
其中第二种方法还能够有更多的用途。(比如建立分页存储过程)

临时表可以实现存储过程的并发操作,这就相当于java函数之间的局部变量,好用吧。

c、固定表 全局变量
有两种固定表,一种是常规库上的固定表,一种是tempdb上的固定表。
因为固定表只有1个实例,所以全体存储过程都只使用一个结果集,这就是全局变量。用法上与临时表完全一样。

d、函数
用户自定义函数也可以理解成为API,就类似把你写的java程序变成了API。

3、代理表——将模块化进行到底

如果你的应用不允许调用存储过程,或者你就想通过select from 得多结果集,那就把你写的存储过程建立为代理表吧,
这样我们可以方便的用select得到结果集。

第四篇 调试经验1、监控中间结果
大家普遍认为存储过程不好调试,无论是用工具还是其它手段,这里讲几个个人调试经验(手动调试)
相信我们每一位都写过c语言,都用过turbo c编译过,而且在刚开始使用时,对工具不熟悉的情况下我们如何调试程序呢?再回忆一下,你第一个接触的程序是什么?
print("hello world")相信大家都知道。
那么第一个经验就是输出变量。
这就用到了万能select输出(因为是调试,多输出点也没什么啊)。
我们想监控中间变量,最简单的就是select出来变量值,判断与预期结果是否一致,这个可以在存储过程的任何地方输出(包括在游标循环内部)。
最后不要忘了清楚中间调试代码(其实可以放一个debug参数,把调试代码放到if体内。这里还有一个思路,能够开发工具采用这样的方法辅助调试)

2、不能监控的结果集
如果一个结果集很大,这样我们无法把整个结果集输出,就算输出,也无法看全部内容。
我们要分析结果集什么呢?(中间结果集)
是不是只要知道count、avg、sum等结果集的统计信息就可以了呢?或者distinct一列就可以了呢?
相信这些足够了,那么不要顾虑,select出这些值就可以了,这就能够帮助你确定中间结果集是否正确了。

3、print
为什么说它呢? 其实整个调试中我并没用过它。
我觉得它用这很不方便。
我觉得这个输出应该是做一些监控存储过程执行状态使用,多与if配合使用。
print与select之间最大的不同,应该是输出的地方不同。
select是直接输出为结果集,多个select就代表一个步骤中返回多个结果集(mssql支持用程序得到多个结果的,但是sybase似乎不支持)
而print输出的是监控信息,不在结果集中显示,这就说明它不影响你所有业务逻辑。

原始手段用熟了也就成为了最好用的手段了。

第五篇 罗嗦
我们用平时编程语言的思维去编写存储过程,这不仅仅能够加快学习,而且能够编写出各种复杂的业务存储过程。

运用模块化思路的运用,就能够构建一整套etl过程。(我觉得Sybase是用简单的处理代替复杂的概念。sybase并没有提出包的概念,但是确实可以书写类似于包的存储过程集合;sybase并没有提出物化视图、cube的概念,但是它的IQ快速查询性能拟补了这个缺陷,看来简单也是一种好处)

以上介绍的都是单例数据库存储过程书写心得,多实例数据库还会更多的内容。

有了上面的罗嗦,相信我们都能很快开发了。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多