在oracle中以查询方式运行string



我在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本身的分号-尽管不是用于直接从客户端运行它的执行/。这在其他示例中显示。

相关内容

  • 没有找到相关文章

最新更新