我在Oracle有一个小问题。我尝试创建一个序列,用于在已经有数据的表中生成id。我尝试使用以下匿名块。
declare y varchar2(2000);
BEGIN
SELECT 'CREATE SEQUENCE ID_SEQ MINVALUE 1 MAXVALUE 9999999999 START WITH ' || (max(ID)+1) || ' INCREMENT BY 1 CACHE 20;' INTO y FROM TEST_TABLE;
--dbms_output.put_line(y);
execute immediate y;
end;
我得到以下错误:
Error report:
ORA-00911: invalid character
ORA-06512: at line 5
00911. 00000 - "invalid character"
如果我执行变量y的值,它可以完美地工作。我使用SQL开发人员作为输入接口,并在11g r2 Oracle服务器上工作。我发现类似的代码,其中"INCREMENT BY"参数是脚本生成的。有人能解释一下我的错误吗?
当您执行execute immediate
时,您运行的命令不应该在末尾有分号;这是SQL Developer(和SQL*Plus,以及其他客户端)中的命令分隔符,而不是SQL语句本身的一部分。
SELECT 'CREATE SEQUENCE ID_SEQ MINVALUE 1 MAXVALUE 9999999999 START WITH '
|| (max(ID)+1) || ' INCREMENT BY 1 CACHE 20' INTO y FROM TEST_TABLE;
在纯SQL示例中显示了这一点。只是为了帮助您混淆,如果您在动态SQL中使用PL/SQL,您仍然需要适合PL/SQL本身的分号-尽管不是用于直接从客户端运行它的执行/
。这在其他示例中显示。