有没有什么办法能绕过去呢?实际上我的需求是这样的: 我有一张表需要每次从中读取一条记录并且删除掉,读取的时候需要将这一条记录锁住不让其他进程读取该记录,直到delete想到的解决方案是这样的 select pk into :pk from pool sample(10) where rownum = 1 ; --随机读到一条记录,并且将主键拿出来 select * from into ..... pool where pk = :pk for update nowait; -- 读取并锁住记录 delete .... where pk = :pk; -- 删除记录 当然要判断一下1403 和如果被锁住的错误码,前两条语句有个小循环。但是第一句话预编译就报错了,有没有好的办法???
将select * from pool sample(10)建成视图,然后查询视图,应该能绕过去
试试动态语句的写法,应该能绕过 v_Sql:='select pk from pool sample(10) where rownum = 1'; execute immediate v_Sql into v_tmp;
在sqlplus下面是可以执行的
看你的语法确实没啥问题
有没有什么办法能绕过去呢?实际上我的需求是这样的:
我有一张表需要每次从中读取一条记录并且删除掉,读取的时候需要将这一条记录锁住不让其他进程读取该记录,直到delete想到的解决方案是这样的
select pk into :pk from pool sample(10) where rownum = 1 ; --随机读到一条记录,并且将主键拿出来
select * from into ..... pool where pk = :pk for update nowait; -- 读取并锁住记录
delete .... where pk = :pk; -- 删除记录
当然要判断一下1403 和如果被锁住的错误码,前两条语句有个小循环。但是第一句话预编译就报错了,有没有好的办法???
v_Sql:='select pk from pool sample(10) where rownum = 1';
execute immediate v_Sql into v_tmp;
实际上做这个事情是为了增加性能,减少锁造成的排队。改成动态SQL回不回又慢了还未知