2015-08-19 31 views
3

我想創建一個可以直接複製到MS Excel的模板(通過SQL)。在子查詢中使用sequence.nextval

一般來說,這樣做很好,但是,我遇到了應該存儲Excel公式的字段的問題。根據Excel工作表中某一列的用戶輸入,此字段應用於在Excel文件中創建INSERT語句。

這裏是我的代碼:

SELECT 
-- some other fields here 
[...], 
(SELECT '="INSERT INTO MyTable VALUES(" &C' || CREATE_INSERTS_TEMP_SEQ.nextval || '&",''THIS COLUMN IS TO BE FILLED BY USER IN EXCEL'',''"&D' || CREATE_INSERTS_TEMP_SEQ.currval || '&"'',14,sysdate);"' FROM DUAL) As SQL_Statement 
FROM myTable; 

我收到錯誤消息ORA-02287: sequence number not allowed here

爲什麼不允許在我的子查詢中使用?任何想法如何解決這個問題?

我必須能夠訪問這些值,以創造一個有效的Excel公式,因爲這些數字是參考相應的Excel的行...

回答

3

The documentation包括限制,包括:

CURRVAL和NEXTVAL不能在這些地方使用:

  • 子查詢
  • ...

但你並不需要在此子查詢:

SELECT 
-- some other fields here 
[...], 
'="INSERT INTO MyTable VALUES(" &C' || CREATE_INSERTS_TEMP_SEQ.nextval 
    || '&",''THIS COLUMN IS TO BE FILLED BY USER IN EXCEL'',''"&D' 
    || CREATE_INSERTS_TEMP_SEQ.currval || '&"'',14,sysdate);"' As SQL_Statement 
FROM myTable; 

這種形式不會產生錯誤。

我懷疑有一個原因,它不允許在子查詢中是因爲它不清楚,或確定性,子查詢將被執行多少次。如果它在這種情況下工作,那麼你可能會得到相同的插入語句表中的每一行,這可能不是你的意圖。

+0

那麼這是一個簡單的解決方案,應該考慮到我自己: - /感謝您的快速回復! @edit:它運行的頻率有多重要? Nextval應該照顧它,因爲每次執行該命令都會生成一個新值(下一個值)? – daZza

1
在舊版本的Oracle

你不能在INSERT語句中使用sequence.NEXTVAL 。你必須有一個SELECTNEXTVAL放入一個變量,然後用變量INSERT。甲骨文

新版本允許INSERTsequence.NEXTVAL

+0

對不起,我可能一直不清楚。這在執行插入語句時不會發生,但在執行上面包含的select語句時不會發生。這個select語句有一個子查詢,它將這些插入語句選爲字符串(來自雙重)。他們沒有執行。相反,它們是名爲「SQL_Statement」的列的內容,或者應該是該列的內容(應該是,因爲上述錯誤發生......) – daZza

+0

哪個版本適用於?我從來沒有聽說過。您不能在11g之前將序列值直接分配給PL/SQL變量,並且必須從雙重選擇(例如,在觸發器中)。但在一個實際的插入語句? –