据我所知,我可以在不使用CURSOR的情况下在PL / SQL中进行更新。 例如:
CREATE OR REPLACE PROCEDURE update_my_table (id NUMBER)
AS
...
BEGIN
...
UPDATE my_table SET column=NULL WHERE my_id = id;
...
END
我想只有当你想要获取更新的行时才需要光标,是吗?
答案 0 :(得分: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 ...
来阻止其他人修改select
和{之间的数据{1}}。
您现在获得的简单更新将是最有效的方式,无论您是更新一行还是数百万。