DB2 的 SQL 存储过程写法,坑还挺多的,尤其是刚上手的时候。一不留神,用了个user temporary tablespace
,你用系统自带的?那是没戏的。还有,临时表只在当前会话内有效,写多线程代码时可得当心。
存储过程用CREATE PROCEDURE
建的时候,语法得规范,TAB 不能有,空格得对齐,不然容易踩坑。DB2 对格式要求还挺“矫情”的,写惯了别的数据库不太习惯。游标也分两种,常规的需要你手动OPEN
、FETCH
、CLOSE
,不过可以WITH HOLD
让它事务后还活着。循环游标省事点,但就没法WITH HOLD
了,场景不太一样。
要取第一条记录,用FETCH FIRST
还挺方便的,比如SELECT * FROM tb_market_code FETCH FIRST 1 ROWS ONLY
,但你要把值赋给变量,嗯,那就不能偷懒用INTO
了,只能老老实实用游标。更新时,可以搭配WHERE CURRENT OF
做精准更新,前提是你那游标得是可更新的,不然照样报错。
DECODE功能没有?别急,CASE
语句完全能顶上,灵活度还更高点。事务控制这块,COMMIT
和ROLLBACK
得配合好,不然不加WITH HOLD
的游标会在提交后被关掉,写多事务逻辑时要小心。
如果你正在摸索DB2的写法,或者要把别的数据库逻辑迁过来,这篇文章讲的内容还挺全,建议先通读一遍,少走弯路。