2011-09-25 66 views
3

我想創建一個序列表和一個觸發器序列的表。當我在Oracle Express版本中執行此操作時,我擁有以下SQL語句。哪些內容可以在Oracle Express中使用同一用戶正確運行,我使用JDBC登錄。Oracle jdbc創建一個表,序列和觸發器

CREATE table "TEST" (
    "ID"   NUMBER(10) NOT NULL, 
    "NAME"  VARCHAR2(20), 
    constraint "TEST_PK" primary key ("ID") 
) 


CREATE sequence "TEST_SEQ" 


CREATE trigger "BI_TEST" 
    before insert on "TEST"    
    for each row 
begin 
    if :NEW."ID" is null then 
    select "TEST_SEQ".nextval into :NEW."ID" from dual; 
    end if; 
end; 

所以,現在我做什麼是由一個像這樣把每一個到這些字符串列表並執行1:

List<String> commands = new ArrayList<String>(4); 
commands.add("Create table ..."); 
commands.add("Create sequence ..."); 
commands.add("Create trigger..."); 

st = con.createStatement(); 
for (String command : commands) { 
    st.execute(command); 
} 

等等

但我得到一個錯誤與觸發器聲明。 「Oracle命令錯誤:ORA-00942:表或視圖不存在」

在我看來,Oracle在這一點上還沒有看到新表。我該如何解決這個問題?我應該創建多個語句對象還是嘗試在每個命令之間進行提交?

TIA

+1

你如何在你的java代碼中包含大寫標識符(例如「TEST_SEQ」)? – nos

+0

我正在使用\「在字符串內部對報價進行編碼 – sproketboy

回答

2

看來,在調用方法execute錯誤。應該使用另一種方法Statement#executeUpdate進行DDL查詢。請參閱official javadoc

更新:您是否嘗試過使用executeBatch方法?我試圖執行批次使用spring jdbc

getJdbcTemplate().batchUpdate(new String[] { createTable, createTrigger, insert }); 

它適用於我。

+0

有趣的想法,但沒有 - 這沒有什麼區別 – sproketboy

+0

您是否嘗試過使用executeBatch方法? – BrownFurSeal

1

檢查創建的表格的synonym。如果沒有爲用戶創建同義詞,則無法訪問。

+0

我該怎麼做?我是Oracle Noob。 ) – sproketboy

+0

我不確定,但ORA-00942:表或視圖不存在時,可能會發生同義詞缺失。您是否嘗試過提交,for循環? – Vaandu

0

感謝您的意見。

我有2個問題。通過使用executeUpdate方法而不是execute方法爲每個運行的SQL創建新語句來解決「表或視圖不存在」錯誤。

然後我遇到了觸發器無效的問題 - 所以我確保所有觸發器/表/索引名稱都用大寫。