最近新的项目,会批量执行数据,用到了存储过程和函数,遇到的问题记录如下:
1、涉及大量数据,所以决定分批commit数据
2、out无论是存储过程还是函数,都会返回数据,当时当我们手动raise(抛出异常时),参数并不会返回。感觉应该和java代码一样,抛出异常,被上层调用捕获,并没有返回值
3、MSG := SQLCODE || SQLERRM;可以查看错误信息
4、设计相关,最原子性的操作如果抛出异常后,可以通过错误代码,错误信息传送给调用者,依次传送到最外层调用者。最后返回给程序调用者
5、建包后,可能调试进不到程序中(没有验证)
6、如果存储过程不能debug执行到存储过程中,可以尝试重新编译
7、计算时,例如计算相差时间,可以通过伪表dual,将数据into到声明的变量中
8、可以自定义类型type,封装参数
9、动态sql语句,要用到动态游标,如下
--定义一个动态游标
TYPE REF_CURSOR_TYPE IS REF CURSOR; --定义游标类型 INFO_CURSOR REF_CURSOR_TYPE;10、循环游标暂时知道两种方式
有一种带参数的游标,项目中没有用到,参考http://blog.csdn.net/s630730701/article/details/68938837
10.1、
不用手动打开关闭游标
FOR 自定义随便起名 IN 游标名称 LOOP
END LOOP;
10.2、
--声明游标
CUSOR 游标名称 IS
查询语句;(普通游标)
--打开游标
OPEN INFO_CURSOR FOR VSQL;(动态游标);
OPEN INFO_CURSOR(普通游标);
--循环游标
LOOP
FETCH 游标名称 INTO 变量;
EXIT WHEN 游标名称%NOTFOUND;
END LOOP;
--关闭游标
CLOSE 游标;
11、执行动态sql
计算条数:
EXECUTE IMMEDIATE 动态SQL名称 INTO 变量;
12、遇到死锁等问题,可以用sys登录,在工具栏中的session,kill掉session。如下所示