匿名块内的更新失败,但可以解决



我有这个数据补丁:

ALTER TABLE MY_TABLE ADD new_id number;
DECLARE
MAX_ID NUMBER;
BEGIN   
SELECT max(id) INTO MAX_ID FROM some_table;
EXECUTE IMMEDIATE 'CREATE sequence temp_seq start WITH ' || MAX_ID || ' increment by 1';
UPDATE MY_TABLE SET new_id = temp_seq.nextval;
EXECUTE IMMEDIATE 'DROP sequence temp_seq';  
END;
/

这给了我

UPDATE MY_TABLE SET new_id = temp_seq.nextval;
*
ERROR at line 8:
ORA-06550: line 8, column 40:
PL/SQL: ORA-02289: sequence does not exist
ORA-06550: line 8, column 3:
PL/SQL: SQL Statement ignored

但是,如果我将更新移到外面,它可以工作:

DECLARE
MAX_ID NUMBER;
BEGIN   
SELECT max(id) INTO MAX_ID FROM some_table;
EXECUTE IMMEDIATE 'CREATE sequence temp_seq start WITH ' || MAX_ID || ' increment by 1';  
END;
/
UPDATE MY_TABLE SET new_id = temp_seq.nextval;

我可以使用第二种方法,但我很好奇为什么块内的更新失败。

因为在编译时该序列不存在。如果你想在PL/SQL块中使用它,你必须动态地执行此操作,就像你创建序列一样。

相关内容

最新更新