各位高手,请教一个关于触发器的简单问题

kangzhenkang 2004-09-02 01:48:09
我建立了一个很简单的触发器如下:
希望在A_FILE表中插入一条记录时自动在B_FILE表中插入对应记录
CREATE OR REPLACE TRIGGER A_I BEFORE INSERT ON A_FILE
REFERENCING NEW AS N
FOR EACH ROW
INSERT INTO B_FILE SELECT SUBSTR(A001,1,5),'XXXXX' FROM N
在sqlplus中执行的时候会报以下错误:
TRIGGER A_I 出现错误:

LINE/COL ERROR
-------- -----------------------------------------------------------------
1/7 PL/SQL: SQL Statement ignored
1/63 PL/SQL: ORA-00942: 表或视图不存在

警告: 创建的触发器带有编译错误。

如果我将上面的N改为任意一个表比如A_FILE,那么就没有任何错误了,
请各位高手帮帮忙!
...全文
105 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
kangzhenkang 2004-09-02
  • 打赏
  • 举报
回复
各位大侠,知道了,多谢!
再问一个菜鸟问题,我刚刚结贴给分的时候,报回贴次数大于给分次数,请问是怎么回事?
zwj0712 2004-09-02
  • 打赏
  • 举报
回复
给个例子你看一下!!!

CREATE OR REPLACE TRIGGER TRIGGER_table
AFTER INSERT OR UPDATE OR DELETE ON 表名 FOR EACH ROW
DECLARE
p_count integer;
BEGIN
IF INSERTING THEN
SELECT COUNT(*) INTO p_count FROM table_name2 WHERE CUSTOMERID = :NEW.CUSTOMERID;
IF p_count = 0 THEN
INSERT INTO CRM.table_name2 (CUSTOMERID,CUSTOMERCODE,CUSTOMERDESC) VALUES (:NEW.CUSTOMERID,:NEW.CUSTOMERCODE,:NEW.CUSTOMERDESC);
END IF;
ELSIF UPDATING THEN
UPDATE table_name2 SET CUSTOMERID = :NEW.CUSTOMERID, CUSTOMERCODE = :NEW.CUSTOMERCODE, CUSTOMERDESC = :NEW.CUSTOMERDESC
WHERE CUSTOMERID = :OLD.CUSTOMERID;
ELSE
DELETE FROM table_name2 WHERE CUSTOMERID = :OLD.CUSTOMERID;
END IF;
END;
kangzhenkang 2004-09-02
  • 打赏
  • 举报
回复
不好意思,小弟以前是使用SQL Server的,只是现在公司要做Oracle上的测试才赶鸭子上架,菜鸟一个,今后还请各位大侠多多指点,先谢过了!
dejkstro 2004-09-02
  • 打赏
  • 举报
回复
oracle是不能引用 new作为记录的.楼主以前使用sqlserver的吧!:)
bzszp 2004-09-02
  • 打赏
  • 举报
回复
你这样写不正确!
触发器中使用new或old,
:new不是一个表,是一行数据
需要这样来使用 :new.colname or :old.colname
只能用
INSERT INTO B_FILE values(SUBSTR(:new.A001,1,5),'XXXXX');
kangzhenkang 2004-09-02
  • 打赏
  • 举报
回复
还有一个问题,我把语句改成:
INSERT INTO B_FILE SELECT SUBSTR(A001,1,5),'XXXXX' FROM :N
为什么就报错:
TRIGGER A_I 出现错误:

LINE/COL ERROR
-------- -----------------------------------------------------------------
1/63 PLS-00049: 错误的赋值变量 'N'

警告: 创建的触发器带有编译错误。
jiang5460 2004-09-02
  • 打赏
  • 举报
回复
INSERT INTO B_FILE values(SUBSTR(:n.A001,1,5),'XXXXX' )

kangzhenkang 2004-09-02
  • 打赏
  • 举报
回复
多谢二位的悉心解答,我试过了,二位提供的建议可以使用
再问一下,是不是引用这种别名的时候都要在前面加上:呢?
bzszp 2004-09-02
  • 打赏
  • 举报
回复
理解错误,A_file表是否有A001字段?
CREATE OR REPLACE TRIGGER A_I
BEFORE INSERT ON A_FILE
FOR EACH ROW
INSERT INTO B_FILE values(SUBSTR(:new.A001,1,5),'XXXXX');
wylwyl1130 2004-09-02
  • 打赏
  • 举报
回复
INSERT INTO B_FILE values(SUBSTR(:n.A001,1,5),'XXXXX' )
wylwyl1130 2004-09-02
  • 打赏
  • 举报
回复
缺少模式名,找不到表
user.tbname
wylwyl1130 2004-09-02
  • 打赏
  • 举报
回复
缺少模式名,找不到表
user.tbname
kangzhenkang 2004-09-02
  • 打赏
  • 举报
回复
N不是一个表,而只是一个别名,是在前面的
REFERENCING NEW AS N
语句中定义的,我查了<<Oracle 9i SQL Reference>>,按照其中的定义做的,但是下面INSERT子句使用的时候就会有问题,所以才不知道为什么:)

各位高手帮帮忙啊!
bzszp 2004-09-02
  • 打赏
  • 举报
回复
表N是这个用户下的表吗?
不是的话,需要赋给他权限,并且在前面加上用户名
如:uname.N

17,086

社区成员

发帖
与我相关
我的任务
社区描述
Oracle开发相关技术讨论
社区管理员
  • 开发
  • Lucifer三思而后行
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧