发表于: 2016-10-27 10:21:12
1 2548
使用oracle重新建立了任务一要求的数据库表
特此记录艰辛的处理错误报告的过程
CREATE TABLE it_students( --创建表
ID NUMBER(8),
name VARCHAR(10) NOT NULL,
QQ NUMBER(20),
study_type VARCHAR(20),
graduated VARCHAR(20),
dailyReport_url VARCHAR(100),
create_at DATE,
update_at DATE,
comment VARCHAR(100)
)
CREATE SEQUENCE it_students_sequence --加入序列,不设缓存
NOCACHE;
CREATE TRIGGER it_students_trigger AFTER
INSERT ON it_students FOR EACH ROW WHEN(new.ID is null) --有行内容(且id为空)插入时
BEGIN
INSERT INTO it_students(ID,create_at) VALUES(it_students_sequence.NEXTVAL,sysdate);
--自动加入自增序列给id,加入当前系统时间给create_at
end;
创建TRIGGER以后,插入一行数据错误提示“表 LEARN.IT_STUDENTS 发生了变化, 触发器/函数不能读它”
查询资料得知,after trigger是跟要触发的表处于同一个事务中的,如果表发生了变化,trigger是不能对表再进行操作的
处理方法有两种:
(1)
在begin前声明trigger为独立的事务
Declare
pragma autonomous_transaction;
但是我加入以后试验,会错误提示“ORA-06519: 检测到活动的独立的事务处理, 已经回退”,原因不明,弃用这个方法
(2)
使用before trigger,和select into(select into跟insert into的区别,
暂且挖个坑http://blog.sina.com.cn/s/blog_7c7ec19b0100u6vb.html,回头有时间看看)
CREATE TRIGGER it_students_trigger BEFORE
INSERT ON it_students FOR EACH ROW WHEN(new.ID is null)
BEGIN
SELECT it_students_sequence.NEXTVAL INTO :new.ID FROM DUAL;
SELECT sysdate INTO :new.create_at FROM DUAL;
end;
试加一条,INSERT INTO it_students(name,QQ,study_type,graduated,dailyReport_url) VALUES
('张三丰',666666,'Java','武当派','http://www.sanfeng.com');
成功自增id,并自动加入create_at=sysdate
本想再接再厉弄个触发器在内容有更新时,自动记录时间到update_at里的,结果发现触发器一个特性“不能更新触发条件所在的行”,纠结调试很久,无果,不能再钻牛角尖了,直接在myBatis里设置更新sql的时候加入就好了。
利用剩下的一些时间继续maven事业
1)参考此文http://www.open-open.com/lib/view/open1392252233301.html,将pom.xml中相关的依赖包配置好
(它里面的阿里巴巴数据源包让我虚了很久。。暂且不放,看看后面写的时候哪里会报错)
2)将myBatis的两个配置文件移植到src/main/resource,conf.xml mapper.xml
27日计划的事情:
把maven中java代码部分尽量配好
顺利的话,试着开始测试
评论