发表于: 2016-10-27 10:21:12

1 2542


使用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代码部分尽量配好

顺利的话,试着开始测试



返回列表 返回列表
评论

    分享到