2012-08-23 182 views
4

我需要在序列值增加後,爲變量分配一個序列值。我試過這個,但它給出了一個錯誤:你如何給一個變量賦值一個序列值?

variable imageID number; 
select SEQ_IMAGE_ID.CURRVAL into :imageID from dual; 

select * from IMAGES where IMAGE_ID = :imageID; 


Error starting at line 2 in command: 
select SEQ_IMAGE_ID.CURRVAL into :imageID from dual 
Error report: 
SQL Error: ORA-01006: bind variable does not exist 
01006. 00000 - "bind variable does not exist" 

我有三重檢查,序列名稱是正確的,任何想法?

+0

這是SQL * Plus還是PL/SQL環境? – Ollie

回答

7

您似乎是在SQL * Plus或SQL Developer中從variable聲明中執行此操作。你需要做的PL/SQL塊的分配,要麼被明確begin/end或與exec調用隱藏了:

variable imageID number; 
exec select SEQ_IMAGE_ID.CURRVAL into :imageID from dual; 
select * from IMAGES where IMAGE_ID = :imageID; 

如果你使用11g中,您不需要select,你可以指定:

variable imageID number; 
exec :image_id := SEQ_IMAGE_ID.CURRVAL; 
select * from IMAGES where IMAGE_ID = :imageID; 

你也可以使用一個替代變量:

column tmp_imageid new_value image_id; 
select SEQ_IMAGE_ID.CURRVAL as tmp_imageID from dual; 
select * from IMAGES where IMAGE_ID = &imageID; 

注意從0變化表示綁定變量,以&表示替換變量。

+0

+1,全面的答案。 – Ollie

+2

完美。我所需要的只是執行官,但是更全面地理解選項總是很好的。 –

+0

我想在插入語句中使用該變量,但我得到了這個錯誤:'在索引:: 1丟失IN或OUT參數' 我錯過了什麼? –

1

只是刪除':'之前:imageId。如果你是在一個觸發器使用:new.imageid

字變量應該刪除,以及

附:我的意思是肯定的匿名封鎖。

+0

如果在當前會話中尚未訪問序列,則可能還不夠。 OP會得到一個'ORA-08002'錯誤。 – Ollie

+0

我相信Nick在...... –

+0

之前調用了SEQ_IMAGE_ID.nextval啊!我應該更仔細地閱讀這個問題。因此他的會議應該可以使用「CURRVAL」。 – Ollie

2

在PL/SQL,變量需要聲明,是這樣的:

declare 
    V_IMAGEID; 
begin 
    select SEQ_IMAGE_ID.CURRVAL into V_IMAGEID from dual; 

    select * /*into ... */ from IMAGES where IMAGE_ID = V_IMAGEID; 
end; 

如果您使用綁定變量,該變量必須綁定。錯誤消息表明情況並非如此。如何綁定變量取決於語言/情況。確保綁定變量時使用正確的方向。在第一個(雙)查詢中,您將需要一個out參數。您可能需要指定。

相關問題