Oracle jdbc创建表,序列和触发器

时间:2011-09-25 21:37:26

标签: java oracle jdbc

我正在尝试使用序列创建一个表,并为该序列创建一个触发器。当我在Oracle Express版本中执行此操作时,我有以下SQL语句。使用我使用JDBC登录的同一用户在Oracle Express中正确运行。

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;

所以我现在所做的就是将每一个放入一个字符串列表中并逐个执行:

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

3 个答案:

答案 0 :(得分:2)

调用方法execute时出现错误。另一种方法Statement#executeUpdate应该用于DDL查询。请参阅official javadoc

更新:您是否尝试过使用executeBatch方法?我正在尝试使用spring jdbc执行批处理:

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

它对我来说很好。

答案 1 :(得分:1)

检查所创建表格的synonym。如果没有为用户创建同义词,则无法访问。

答案 2 :(得分:0)

感谢您的投入。

我有两个问题。通过使用executeUpdate方法而不是execute方法为每个运行的SQL创建一个新语句来解决“表或视图不存在”错误。

然后我遇到触发器无效的问题 - 因此我确保所有触发器/表/索引名称都使用大写。