我正在尝试使用序列创建一个表,并为该序列创建一个触发器。当我在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
答案 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创建一个新语句来解决“表或视图不存在”错误。
然后我遇到触发器无效的问题 - 因此我确保所有触发器/表/索引名称都使用大写。