oracle 存储过程 - 选择、更新并返回一组随机行
oracle 我希望从表中随机选择几行,更新这些行中的列并使用存储过程返回它们
PROCEDURE getrows(box IN VARCHAR2, row_no IN NUMBER, work_dtls_out OUT dtls_cursor) AS
v_id VARCHAR2(20);
v_workname VARCHAR2(20);
v_status VARCHAR2(20);
v_work_dtls_cursor dtls_cursor;
BEGIN
OPEN v_work_dtls_cursor FOR
SELECT id, workname, status
FROM item
WHERE status IS NULL
AND rownum <= row_no
FOR UPDATE;
LOOP
FETCH v_work_dtls_cursor
INTO v_id ,v_workname,v_status;
UPDATE item
SET status = 'started'
WHERE id=v_id;
EXIT
WHEN v_work_dtls_cursor % NOTFOUND;
END LOOP;
close v_work_dtls_cursor ;
/* I HAVE TO RETURN THE SAME ROWS WHICH I UPDATED NOW.
SINCE CURSOR IS LOOPED THRU, I CANT DO IT. */
END getrows;
请帮助
oracle i wish to select few rows at random from a table, update a column in those rows and return them using stored procedure
PROCEDURE getrows(box IN VARCHAR2, row_no IN NUMBER, work_dtls_out OUT dtls_cursor) AS
v_id VARCHAR2(20);
v_workname VARCHAR2(20);
v_status VARCHAR2(20);
v_work_dtls_cursor dtls_cursor;
BEGIN
OPEN v_work_dtls_cursor FOR
SELECT id, workname, status
FROM item
WHERE status IS NULL
AND rownum <= row_no
FOR UPDATE;
LOOP
FETCH v_work_dtls_cursor
INTO v_id ,v_workname,v_status;
UPDATE item
SET status = 'started'
WHERE id=v_id;
EXIT
WHEN v_work_dtls_cursor % NOTFOUND;
END LOOP;
close v_work_dtls_cursor ;
/* I HAVE TO RETURN THE SAME ROWS WHICH I UPDATED NOW.
SINCE CURSOR IS LOOPED THRU, I CANT DO IT. */
END getrows;
PLEASE HELP
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
一种可能的解决方案:
如果行数特别多,全局临时方案可能会更好。
A possible solution:
If the number of rows is particularly large, the global temporary solution may be better.
跟进 Sjuul Janssen 的出色建议:
一些注释:
未经测试。
您需要将类型声明中的括号部分替换为适合您的架构的类型。
您需要在 SELECT 语句的 SAMPLE 子句中给出适当的值;可能可以将其作为参数传递,但这可能需要使用动态 SQL。但是,如果您的要求是从表中获取随机行(仅按 ROWNUM 进行过滤无法实现),您将需要执行类似的操作。
由于您正在选择更新,因此一个会话可能会阻止另一个会话。如果您使用的是 11g,您可能希望检查 SELECT 语句的 SKIP LOCKED 子句,这将使多个并发会话能够运行这样的代码。
Following up on Sjuul Janssen's excellent recommendation:
A few notes:
This is untested.
You'll need to replace the bracketed section in the type declarations with appropriate types for your schema.
You'll need to come up with an appropriate value in the SAMPLE clause of the SELECT statement; it might be possible to pass that in as an argument, but that may require using dynamic SQL. However, if your requirement is to get random rows from the table -- which just filtering by ROWNUM will not accomplish -- you'll want to do something like this.
Because you're SELECTing FOR UPDATE, one session can block another. If you're in 11g, you may wish to examine the SKIP LOCKED clause of the SELECT statement, which will enable multiple concurrent sessions to run code like this.
不确定您在哪里进行提交,但根据代码,您需要做的就是 SELECT ... FROM ITEM WHERE STATUS='started'
如果数字很小,您可以保留 ROWID 的集合。
如果它更大,那么我会执行“
然后返回一个游标”
Not sure where you are doing your committing, but based on the code as it stands all you should need to do is SELECT ... FROM ITEM WHERE STATUS='started'
If it is small numbers, you could keep a collection of ROWIDs.
if it is larger, then I'd do an
Then return a cursor of
也许这可以帮助你做你想做的事?
http:// it.toolbox.com/blogs/database-solutions/returning-rows-through-a-table-function-in-oracle-7802
Maybe this can help you to do what you want?
http://it.toolbox.com/blogs/database-solutions/returning-rows-through-a-table-function-in-oracle-7802