据我所知,我可以在不使用 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
我猜只有当你想获取更新的行时才需要游标,对吗?
据我所知,我可以在不使用 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
我猜只有当你想获取更新的行时才需要游标,对吗?
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 表中选择多行并在那里操作数据,但仍然没有可见游标。
但是,如果您想选择和更新行,您可能确实需要一个带有select ... for update
子句的游标,然后update ... where current of ...
防止其他人修改 和 之间的select
数据update
。
无论您是更新一行还是数百万行,您现在所拥有的简单更新将是最有效的方式。