2013-05-18 42 views
0

据我所见,我可以在不使用CURSOR的情况下在PL/SQL中进行更新。 例如:使用PL/SQL中的更新游标

CREATE OR REPLACE PROCEDURE update_my_table (id NUMBER) 
AS 
    ... 
BEGIN 
    ... 
    UPDATE my_table SET column=NULL WHERE my_id = id; 
    ... 
END 

我想只需要光标然后如果你想执行一个获取更新行的,是这样吗?

回答

1

Oracle使用引擎盖下的光标进行更新和选择,这超出了您的要求。但是,不,您不必在可见的显式或隐式游标中选择要更新的行。

你甚至不必使用游标来选择行。你可以做一个select ... into

CREATE ... AS 
    my_row my_table%rowtype; 
BEGIN 
    select * into my_row from my_table where my_id = id; 
    -- do something with the row data 
    dbms_output.put_line(my_row.my_col); 
END; 

或者你可以选择单独的列到不同的变量,而不是插入rowtype变量。但是你必须从查询中得到恰好一行(或者一行的值列)如果没有匹配,则会收到no data found错误,如果超过一个则too many rows。你也可以在PL/SQL表中选择多行并在那里操作数据,但仍然没有可见的光标。

但是,如果你想选择更新行,你可能想要一个光标with a select ... for update clause, and then update ... where current of ...,以防止别人修改selectupdate之间的数据。

无论您是更新一行还是数百万行,现在获得的简单更新都将是最有效的方式。

+0

谢谢。所以,如果我理解它是正确的:使用更新游标会阻止选定的行,直到更新操作完成。 – rodrunner

+0

@cortezthekiller - 如果您选择更新,行将被锁定,直到您提交或回滚事务;无论你是否实际更新它们。 –