存储过程关于并发性的问题

问题概要:

       此存储过程的逻辑是根据用户的选项,插入数据到同一张表里,但是存储过程可能有多人执行,考虑到多人选项不同时,可能造成数据插入混乱,故在插入之前,先查询是否有人在执行这个存储过程,如果有,则返回:请稍后执行,如果无,则根据该用户的选项,输出对应的数据

遇到的问题:

  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重新赋予权限,不然会报错。

另.因为存储过程中写了异常,导致在测试过程中,常常会不知道错误的原因是什么,此时可以把异常注释掉,重新测试,即可知道存储过程报错的原因

   

posted @ 2017-07-31 14:13  智慧小姐  阅读(1830)  评论(0编辑  收藏  举报