在oracle中将字符串作为查询运行

mit*_*ter 2 oracle sequence execute-immediate ora-06512

我在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;
Run Code Online (Sandbox Code Playgroud)

我收到以下错误:

Error report:
ORA-00911: invalid character
ORA-06512: at line 5
00911. 00000 -  "invalid character"
Run Code Online (Sandbox Code Playgroud)

如果我执行y变量的值,它就可以完美地运行.我正在使用SQL Developer作为输入接口并在11g r2 Oracle服务器上工作.我找到了类似的代码,其中'INCREMENT BY'参数是脚本生成的.有人可以解释我的错误吗?

Ale*_*ole 8

当你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;
Run Code Online (Sandbox Code Playgroud)

这在纯SQL示例中显示.但是,为了让您感到困惑,如果您在动态SQL中使用PL/SQL,您仍然需要适合PL/SQL本身的分号 - 尽管不是/您用来直接从客户端运行它的执行.这在其他示例中示出.