2013-03-07 73 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中顯示。