12
返回列表 发新帖
楼主: pass21

关于trigger中操作引用(ref)的问题

[复制链接]
论坛徽章:
10
授权会员
日期:2005-10-30 17:05:332010年世界杯参赛球队:科特迪瓦
日期:2010-04-15 12:20:472010年世界杯参赛球队:智利
日期:2010-04-13 17:15:21生肖徽章2007版:蛇
日期:2009-09-24 13:54:11生肖徽章2007版:龙
日期:2009-09-22 13:56:012009日食纪念
日期:2009-07-22 09:30:00生肖徽章2007版:龙
日期:2009-02-10 13:45:15生肖徽章2007版:狗
日期:2009-02-03 13:53:34会员2006贡献徽章
日期:2006-04-17 13:46:34ITPUB十周年纪念徽章
日期:2011-11-01 16:20:28
11#
发表于 2004-12-30 18:17 | 只看该作者
wyq@ORCL>create type User_ty as object(
  2  User_ID VARCHAR2(20) ,
  3  Name VARCHAR2(10)
  4  )
  5  /

Type created.

wyq@ORCL>create table USERS
  2  of USER_TY
  3  tablespace users
  4  /

Table created.

wyq@ORCL>Create table Document
  2  ( docid number not null,
  3  user_ref ref user_ty not null
  4  )
  5  /

Table created.

为了演示ref的用法,下面作了一些修改,最后触发器的作用是将当前用户指针指向的用户的名字填入表的新加的一个字段中。

wyq@ORCL>alter table document add username varchar2(10);

Table altered.

wyq@ORCL>create or replace trigger document_ai
  2  Before insert on document
  3  for each Row
  4  Declare
  5     l_User User_Ty;
  6  Begin
  7     Select Deref(:New.User_Ref) Into l_User From Dual;
  8     Select Us.Name
  9       Into :New.Username
10       From Users Us
11      Where Us.User_Id = l_User.User_Id;
12  End;
13  /

Trigger created.

wyq@ORCL>insert into users values (100,'TEST');

1 row created.

wyq@ORCL>commit;

Commit complete.

wyq@ORCL>Insert Into Document
  2        (Docid, User_Ref)
  3        Select 10001, Ref(u) From Users u Where User_Id = 100;

1 row created.

wyq@ORCL>select * from document;

     DOCID
----------
USER_REF
----------------------------------------------------------------------------------------------------
USERNAME
----------
     10001
00002202081187DB3BDF204FDE8458832E6137DC83E309C616090D466EBF1AE42837DB6426
TEST

使用道具 举报

回复
论坛徽章:
0
12#
发表于 2004-12-31 10:26 | 只看该作者
我刚才试了你的那个例子,SQL语句本身没问题的,但是如果你想
在document表里做insert动作,比如:insert into document values(1,user_ty('aa','aa')),那么在表users的相应字段也应该有一条'aa'记录,否则在document表里做insert动作就会有触发器错误。

使用道具 举报

回复
论坛徽章:
10
授权会员
日期:2005-10-30 17:05:332010年世界杯参赛球队:科特迪瓦
日期:2010-04-15 12:20:472010年世界杯参赛球队:智利
日期:2010-04-13 17:15:21生肖徽章2007版:蛇
日期:2009-09-24 13:54:11生肖徽章2007版:龙
日期:2009-09-22 13:56:012009日食纪念
日期:2009-07-22 09:30:00生肖徽章2007版:龙
日期:2009-02-10 13:45:15生肖徽章2007版:狗
日期:2009-02-03 13:53:34会员2006贡献徽章
日期:2006-04-17 13:46:34ITPUB十周年纪念徽章
日期:2011-11-01 16:20:28
13#
发表于 2004-12-31 10:37 | 只看该作者
最初由 jgsong 发布
[B]我刚才试了你的那个例子,SQL语句本身没问题的,但是如果你想
在document表里做insert动作,比如:insert into document values(1,user_ty('aa','aa')),那么在表users的相应字段也应该有一条'aa'记录,否则在document表里做insert动作就会有触发器错误。 [/B]


当然,如果考虑到周边的环境还需要加上相应的出错处理。
不能直接用这样的语句:insert into document values(1,user_ty('aa','aa')),字段Document.User_Ref必须是已存在于对象表Users中的某个对象的引用(指针),这是字段属性规定的,应用其它的类型值都会出错。
Oracle文档PLSQL User's Guide and Referencef的第九章Object Types中有很详细的说明和很好理解的例子。

使用道具 举报

回复
论坛徽章:
0
14#
 楼主| 发表于 2004-12-31 10:52 | 只看该作者

谢谢大家的支持

Happy new year to everybody

使用道具 举报

回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

TOP技术积分榜 社区积分榜 徽章 团队 统计 知识索引树 积分竞拍 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档
  ChinaUnix | ChinaUnix博客 | ChinaUnix论坛
CopyRight 1999-2011 itpub.net All Right Reserved. 北京盛拓优讯信息技术有限公司版权所有 联系我们 未成年人举报专区 
京ICP备16024965号-8  北京市公安局海淀分局网监中心备案编号:11010802021510 广播电视节目制作经营许可证:编号(京)字第1149号
  
快速回复 返回顶部 返回列表