问题概要:
此存储过程的逻辑是根据用户的选项,插入数据到同一张表里,但是存储过程可能有多人执行,考虑到多人选项不同时,可能造成数据插入混乱,故在插入之前,先查询是否有人在执行这个存储过程,如果有,则返回:请稍后执行,如果无,则根据该用户的选项,输出对应的数据
遇到的问题:
1.如何判断此时是否有用户在执行该存储过程;
2. 动态表在存储过程中查询时无权限
解决办法:
1.先po代码:
v_sql :='select count(nvl(o.sid,0)) from sys.v_$access o,sys.v_$session n where o.sid=n.sid and o.OBJECT=''PCX_DXTSCX'' and o.owner=''CRMII'' and n.STATUS=''ACTIVE'''; Execute Immediate v_sql Into v_bz;
1)在此之前用的一种方法是直接取nvl(o.sid,0),但是当插入到v_bz中的值为null时就会报错;
2)也可以用select into给变量v_bz赋值。
2.代码
grant select on sys.v_$session to crmii; grant select on sys.v_$access to crmii;
动态视图在存储过程中使用时,需要使用sys重新赋予权限,不然会报错。
另.因为存储过程中写了异常,导致在测试过程中,常常会不知道错误的原因是什么,此时可以把异常注释掉,重新测试,即可知道存储过程报错的原因