2012-08-28 109 views
37

我試圖在Oracle 11g Express和SQL Developer中執行類似自動遞增的操作。 我對甲骨文知之甚少,而且我也是觸發器的新手。在Oracle Express中創建觸發器

我試着運行這個,但我不知道如何正確地做到這一點。

CREATE TABLE theschema.thetable 
(id NUMBER PRIMARY KEY, 
name VARCHAR2(30)); 

CREATE SEQUENCE theschema.test1_sequence 
START WITH 1 
INCREMENT BY 1; 

create or replace trigger insert_nums 
before insert on theschema.thetable 
for each row 
begin 
select test1_sequence.nextval into :new.id from dual; 
end; 
/

當我嘗試創建觸發器時,出現一個屏幕,詢問我是否有一些「綁定」。 該對話框只有一個複選框「null」。這是什麼意思,以及如何使 一個正常工作的腳本?

做這種「自動增量」時要採取什麼預防措施?

Enter binds

+0

我添加了SQL-Developer標籤,因爲這段代碼看起來很好;這是要求你填寫一個綁定變量,所以我認爲有一些設置你必須關閉......我不知道什麼。 – Ben

+1

順便說一句,從Oracle 11開始,你可以直接引用一個序列。這意味着你可以在不使用SELECT的情況下編寫':new.id:= test1_sequence.nextval'。 – Ben

+1

同樣的問題在這裏!感謝您的發佈! –

回答

48

看來,SQL開發人員認爲你正在運行一個普通的DML(數據處理)腳本,而不是一個DDL(數據定義)。它也認爲:new.id是一個可綁定的變量。

爲什麼會發生這種情況,我不知道;我無法在Oracle SQL Developer 2.1中重現它。

嘗試打開在theschema架構一個新的SQL工作表窗口,按F5 (不F9)執行「整體」腳本(而不是語句)。

+0

非常感謝!這樣可行。我不知道爲什麼必須執行整個腳本才能使這件事情正常工作。爲什麼不能一部分完成。 –

+0

不客氣!我不知道爲什麼會發生這種情況,因爲我的SQL Developer工作正常。 –

+1

我有這個確切的問題,這是解決方案。我可以確認它與SQL Developer版本有關。 – Jhokva

15

這就是我解決這個問題的方法,把「set define off」在命令之前:

set define off; 
create or replace trigger [...] 
[...] 
end; 
/

然後突出顯示這兩個命令並按F9運行。 或者你可以用F5運行所有的命令。

看來,如果命令是用F9單獨執行的,那麼定義關閉集合不起作用。

+0

聽起來像是一個很好的解決方案,但如果你提到「set define off」實際上做了什麼,會更好。從我讀的,似乎關閉提示用戶這種變量/值綁定?很高興知道。 https://stackoverflow.com/questions/34332639/when-or-why-to-use-a-set-define-off-in-oracle-database – Balmipour

+0

這不能解決問題中的問題。它會阻止SQL Developer解釋佔位符變量(用&符號標記),但不會影響OP詢問的問題的綁定變量的處理方式(用冒號標記:)。 –

0

對於我的情況下,溶液進入了「NEWROW」「新」和「oldrow」爲「老字號」作爲綁定值...

+0

它確實有效! – m0rjjj

0

我在這個新手所以記住這一點作爲我給出我的答案。 我認爲這個問題是代碼

create or replace trigger insert_nums 
before insert on theschema.thetable 
for each row 
begin 
select test1_sequence.nextval into :new.id from dual; 
end; 

實際上是一個腳本,而不是直接的SQL語句。因此你必須運行「運行腳本」。我發現,當我在SQL Developer中打開一個工作表時,如果我在工作表中有任何地方的任何觸發代碼,那麼即使我只是試圖運行一條語句,SQL Developer會回看工作表並嘗試運行腳本。爲了防止這種情況發生,我必須註釋掉代碼。 如果我確實想要運行觸發器的代碼比我不得不打開一個新的工作表,那麼將代碼放在那裏並執行一個RUN SCRIPT。