sql - 如何在选择中使用 SYS_REFCURSUR 在 pl/sql 中进行更新
问题描述
我想选择多行并更新所有选定的行。所以这个目标我写了这个查询。但是执行时会抛出异常。
我在像下面这样的生产者中写了这个查询。
PROCEDURE get_rows(
a_cursor OUT SYS_REFCURSOR,
a_id IN VARCHAR,
a_count IN NUMBER);
异常详情:
java.sql.SQLException: ORA-01002: 提取乱序
a_cursor
是 SYS_REFCURSOR
OPEN a_cursor FOR
SELECT mytable.VID
FROM mytable
WHERE ROWNUM <= COUNT FOR UPDATE;
loop
FETCH a_cursor INTO a_id;
if a_cursor %notfound then
cnumber := 9999;
else
UPDATE mytable SET
...
WHERE VID = a_vid;
COMMIT;
end if;
end loop;
解决方案
Asys_refcursor
不能在update
语句中使用。您可以使用如下所示的显式游标。使用这种方式:
DECLARE
cursor a_cursor is
SELECT mytable.VID
FROM mytable
WHERE ROWNUM <= COUNT FOR UPDATE;
a_id number;
begin
OPEN a_cursor;
loop
FETCH a_cursor INTO a_id;
exit when a_cursor%notfound;
UPDATE mytable SET
...
WHERE VID = a_vid;
end loop;
COMMIT;
close a_cursor;
end;
编辑:
create or replace PROCEDURE get_rows(
a_cursor OUT SYS_REFCURSOR,
a_id IN VARCHAR,
a_count IN NUMBER)
IS
cursor a_cur is
SELECT mytable.VID
FROM mytable
WHERE ROWNUM <= a_COUNT ;
a_id NUMBER;
cnumber number;
BEGIN
OPEN a_cur;
LOOP
FETCH a_cur INTO a_id;
IF a_cur%notfound THEN
cnumber := 9999;
End if;
exit when a_cursor%notfound;
UPDATE mytable SET
...
WHERE VID = a_vid;
END loop;
COMMIT;
CLOSE a_cur;
Open a_cursor for select * from mytable;
end ;
推荐阅读
- laravel - Laravel 将模型保存到 sqlserver
- node.js - 即使服务器关闭,节点 js 仍保持连接
- python - make 在 make 调用期间找不到 OpenCV 库
- python - Tensorflow特征值分解极慢
- javascript - 将 Promise.All 用于多个 ajax 请求时,如何将该数据分配给局部变量?
- c# - 角度函数偶尔会返回 NaN
- javascript - 如何使用node js从.then返回neo4j查询结果
- mysql - 如何在 mysql 中按每个类别划分用户帖子的总数?
- cassandra - 在 Cassandra 中,为什么不允许从使用紧凑存储定义的表中删除列?
- xpages - 生成要与 Wowza CDN Cloud 一起使用的身份验证令牌