需求描述:
需要在两个不同oracl数据库实例中进行数据逻辑处理。如果A实例中的表有新数据插入或者数据更新,那么在B实例中执行与之相关的存储过程。
先假设A数据用户中表TEST有变动,那么触发器触发调用实例B中的存储过程改写TEST_LOG表
A中操作如下:
1.建表
——————————————————————-
create table TEST
(
T_ID NUMBER(4),
T_NAME VARCHAR2(20),
T_AGE NUMBER(2),
T_SEX CHAR(1)
);
——————————————————————-
2.建立与B对应的DBLINK
——————————————————————-
create database link INFOSYSTEM
connect to infosystem identified by infosystem
using ‘(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.10.249)(PORT = 1521))
)
(CONNECT_DATA =
(SERVICE_NAME = ORCL)
)
)’;
——————————————————————
3.建立触发器
——————————————————————
CREATE OR REPLACE TRIGGER test_trigger
AFTER DELETE OR INSERT OR UPDATE ON test
DECLARE
v_type VARCHAR2(15);
BEGIN
IF [...]
2009年6月12日 | 发表在 数据库 | 没有留言
当我们用HQL进行子查询的时候,如select * from Tree where pid in (select id from Tree,此时HIBERANTE就会报错,说什么*号错误之类的。但如果将*改为Tree类里的所有子段时就不会有问题了。就会像平时一样第一行数据返回一个Object[],然后你再根据Tree类里字段对Object[]数组里的值进行转换。这样一来比较麻烦。今天发现如果我SQL来查有一个方法可以返回一个对象的。
Configuration config = new Configuration().configure();
SessionFactory sf = config.buildSessionFactory();
Session session = sf.openSession();
Transaction ts = session.beginTransaction();
Query query = session.createSQLQuery("select * from Tree t where pid in (select id from Tree) ").addEntity(Tree.class); //返回对象
List list = query.list();
此时在遍历list时就可以(Tree)list.get[i];将每一行的内容变换为一个对象了。
另还可以返回一个Map对象,也就是说在在list里包含多个Map,代码如下
Query query = session.createSQLQuery("select [...]
2009年5月23日 | 发表在 ORM | 没有留言
ORACLE数据库中,字段类型CHAR(8),值12345678
hibernate中用createSQLQuery方法查询,返回的list用object[]接收,遍历取值发现object[0]输出值是1,只有一位,其他的没了。其他字段正确。
———————————————
查看数据库,发现其他字段包括VARCHAR,DATE等类型均无问题,只有char类型的出问题。
char类型是定义长度的,8代表8个字节,节省空间并且效率要高,缺点是不灵活,长度是定死的,这里用来定义站号,固定8位长度。所以,该数据库这个字段类型能解决问题,但不是最好的办法,也没找到真正原因。
———————————————–
查到现在,有了一些眉目,小结如下:
1,oracle的char字段在hibernate里映射为character类型,是varchar的子集。
2,复杂SQL用createSQLQuery方法查询没问题,如果查询多个字段,遍历用object[]造型,下标从0开始输出值,不需要映射文件;如果愿意可以写一个映射bean,方便取用。
3,如果查询SQL中是只有一个字段,那就不能用object[]数组接收,只能用object类接收,直接输出object.toString(),即是这个字段的值。
4,可以用addScalar(String arg,Type type)方法定义要返回的字段类型,如
s.createSQLQuery(shuiQingHQL).addScalar("STCD",Hibernate.STRING).addScalar("STNM");
这样就解决了CHAR字段类型只出一位字符的问题。
但是需要把其他字段也addScalar()进来!
5,addScalar(String arg)里的参数是需要大写的!
2009年5月23日 | 发表在 ORM | 没有留言
据说这则寓言至今没有多少人能看得懂,尤其是80后尚未找到男朋友或女朋友的人,看得懂的人多数已身为人夫或人妇或人母,80后尚未找到男朋友或女朋友却能看懂的人,很不幸,嘿嘿…..
向日葵公主是在河东岸边遇见驴的。驴是黑色的,但白嘴白肚白蹄。
公主想过河去,河西的城堡里有等着娶她的王子。
河不算深,但她穿着一身美丽的嫁衣,她怕河水会浸湿她的衣裙。
驴说:“想让我驮你过去吗?”
“你能保证不弄湿我的衣裙吗?”
“不能。”
“那就算了,谢谢,”
“如果他不来呢?”
“那我就多等等。”
良久,无人过来,公主独坐岸边,黯然叹息。
“不。”公主依然拒绝,但悄然打量着驴。
“是你希望我让你驮我过去。”公主回答。
“那你希望谁来驮你过去?”
“我要嫁的王子。”
“我驮你过去,你吻吻我,焉知我不能变成王子?”
“你以为你是青蛙王子?”
“我是美驴王子。”
“驴倒是驴,王子就不必勉强了。”
“你为何不想让我帮你渡河?”
“我怕你弄湿我的嫁衣。”
“我想不会的。”
“为什么不会?”
“因为现在我想驮你过去。”
“哦?我该相信吗?”
“你为什么不相信?”
“你说的话我不敢随便信。”
“我说的话你都不信?”
“你说的话我才不信。”
“我说的话你真不信?!”
“难道我应该信?”
“难道你不该信?”
“我信我自己的判断。”
“好吧,那你慢慢判断吧!”
……
天色已晚,公主与驴相对无言。凉意袭来,公主拢了拢衣服。
驴打破沉默:“冷吗?”
“冷。”
“让我驮你过河吧,无论我是否弄湿你的衣裙我都会赠你三句爱的箴言。”
“那我该怎样报答你?”公主问。
“如果你衣裙不湿就带我回家吧。”
公主接受了驴的建议。
公主骑上了驴背。临行前驴郑重对她说:“记住我背着你时你不能流泪,你的泪会令我不堪重负。”
公主说她记得,然后也郑重地对驴说:“记住一定不要弄湿我的衣裙,否则我会立即放弃你的背负。”
驴迈步向河中走去。
“你以前驮过女孩过河吗?”公主问。
“当然。”驴坦然答道。
“她们的衣裙湿了吗?”
“第一个女孩的没湿,以后的都湿了。”
“第一个女孩带你回家了吗?”
“没有,否则我不会再遇见别的女孩。”
“看来你遇见的女孩很多。”
“算上你的话,应该有15、6个了。”
公主笑道:“你是第30头想驮我过河的驴。”
“呵呵。”驴但笑无语。
公主忽然想起驴承诺的爱的箴言,驴答应告诉她第一句:“无论男人还是女人,只有在初恋时爱的是别人,以后恋爱时爱的都是自己。”
驴缓步轻行,果然很平稳,公主放心了,搂着驴的脖子,觉得温暖。
“喜欢我背你过河吗?”驴问。
“喜欢。”公主微笑承认。
“我也喜欢这样背着你,希望就这样一直走下去。”驴的声音于温情中透着忧郁,听起来像叹息。
风与驴的话语不时吻上公主的面颊,公主含笑悄然入睡。
她做了一个公主常做的梦:她吻了驴,然后驴变成了王子,从此王子与公主快乐地生活在一起。
当她醒来时看见驴依然缓步轻行,自己的衣裙分毫不湿。芳心窃喜,于是吻了驴——驴能因此变成王子吗?
没有。
原来童话就是童话,驴不是王子,等着娶她的王子在河西的城堡里。她愣愣地想,一滴泪自目中滴落。
泪落在驴身上。
似突然被灼伤般,驴猛地扬蹄嘶鸣,激起浪花千丈。
公主的衣裙湿了。“为什么?”公主问。
“我跟你说过。”驴面无表情。
公主也记起了她当初对驴说的话。
于是她一言不发,自驴背上下来,独自淌水向对岸走去。
驴没做任何挽留或解释,也自转身回去,径直走向河东——那里又有个姑娘在等着谁驮她过河。
依稀年轻,依稀美丽,她也有一身好看的嫁衣。
“爱情是唯一的,但爱人不是唯一的。”驴忽然说道:“这是第二句箴言。”
公主泪落成河,河水冷彻心肺。
终于走到了对岸,她美丽的衣裙已经彻底湿透。
她无力地在岸边坐下,像只小动物般抱膝蜷缩着黯然哭泣。
还是寒冷。
一只白兔走到她身边:“公主,下次我陪你渡河。”
“谢谢,”公主把白兔搂在怀中:“不必了,现在我只是需要一点温度。”
驴已经走回了河东岸边。
公主忽然记起还有一句箴言驴没说,于是抬头向河西望去:“请告诉我最后一句箴言,美驴。”
驴冷冷看了她最后一眼,说: “我爱我的爱情。 ”然后向那等着渡河的女孩走去。
你看懂了吗?公主,王子,兔子,驴及三句箴言各代表什么意思?
如果你想不到还是来看答案吧,看完了在好好想想.
2009年5月20日 | 发表在 杂感偶赏 | 没有留言
最近较忙,所以这些代码慢一些,不过我会坚持定期发表的,还希望大家多给批评啊
–[6]// Oracle Trigger
———————————————————————————————//
–实例1————————
–创建触发器,当用户对test表执行DML语句时,将相关信息记录到日志表
–创建测试表
CREATE TABLE test
(
t_id NUMBER(4),
t_name VARCHAR2(20),
t_age NUMBER(2),
t_sex CHAR
);
–创建记录测试表
CREATE TABLE test_log
(
l_user VARCHAR2(15),
l_type VARCHAR2(15),
l_date VARCHAR2(30)
);
–创建触发器
CREATE OR REPLACE TRIGGER test_trigger
AFTER DELETE OR INSERT OR UPDATE ON test
DECLARE
v_type test_log.l_type%TYPE;
BEGIN
IF INSERTING THEN –INSERT触发
v_type := ‘INSERT’;
DBMS_OUTPUT.PUT_LINE(’记录已经成功插入,并已记录到日志’);
ELSIF UPDATING THEN –UPDATE触发
v_type := ‘UPDATE’;
DBMS_OUTPUT.PUT_LINE(’记录已经成功更新,并已记录到日志’);
ELSIF DELETING THEN
v_type := ‘DELETE’;
DBMS_OUTPUT.PUT_LINE(’记录已经成功删除,并已记录到日志’);
END IF;
INSERT INTO test_log VALUES(user,v_type,
TO_CHAR(sysdate,’yyyy-mm-dd hh24:mi:ss’));
END;
/
–下面我们来分别执行DML语句
INSERT INTO test VALUES(101,’zhao’,22,’M’);
UPDATE [...]
2009年5月10日 | 发表在 数据库 | 没有留言