2013-03-07 72 views
2

我在Oracle中遇到了一些问题。我尝试创建一个用于在已经有数据的表中生成ID的序列。我尝试使用下面的匿名块。在oracle中运行字符串查询

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 Developer作为输入接口并在11g r2 Oracle服务器上工作。我发现了类似的代码,其中'INCREMENT BY'参数是脚本生成的。有人可以解释我的错误吗?

回答

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; 

这显示在examples for plain SQL。尽管如此,如果您在动态SQL中使用PL/SQL,仍然需要适合PL/SQL本身的分号(尽管不是执行/直接从客户端运行它)。这在other examples中显示。