帮忙解决一下触发器的问题。

vbcat 2002-03-20 01:16:30
CREATE OR REPLACE TRIGGER "WL"."TRG_AINS_TBL_BILL" AFTER INSERT ON "WL"."TALLY_TBL_BILL" REFERENCING OLD AS OLD NEW AS NEW FOR EACH ROW DECLARE
DS_TALLNO CHAR(20);
DS_PKEY CHAR(20);
CURSOR C_DOC IS
SELECT DOCUMENT_NO,DOCUMENT_NAME
FROM TALLY_CDE_DOCUMENT;
BEGIN
DS_TALLNO := :new.TALLY_NO;
FOR V_DOC IN C_DOC LOOP
DS_PKEY := 'okeee'
INSERT INTO TALLY_TBL_DOCUMENT (DOCUMENT_KEY,DOCUMENT_NO,TALLY_NO,DOCUMENT_NAME)
VALUES ( DS_TALLNO,V_DOC.DOCUMENT_NO,DS_TALLNO,V_DOC.DOCUMENT_NAME);
END LOOP;
END TRG_AINS_TBL_BILL;
使用时提示:ORA-04098:无效且未通过重新验证。
请问如何更改。
还有触发器中如何使用存储?使用又表示应注意什么?
...全文
55 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
vbcat 2002-03-21
  • 打赏
  • 举报
回复
谢谢!已经完成。
正确应为:

CREATE OR REPLACE TRIGGER TRG_AINS_TBL_BILL AFTER INSERT ON TALLY_TBL_BILL FOR EACH ROW
DECLARE
DS_TALLNO CHAR(20);
DS_PKEY CHAR(20);
V_DOCUMENT_NO TALLY_CDE_DOCUMENT.DOCUMENT_NO%TYPE;
V_DOCUMENT_NAME TALLY_CDE_DOCUMENT.DOCUMENT_NAME%TYPE;
CURSOR C_DOC IS
SELECT DOCUMENT_NO,DOCUMENT_NAME
FROM TALLY_CDE_DOCUMENT
WHERE TYPE_KEY = :new.TYPE_KEY;
BEGIN
DS_TALLNO := :new.TALLY_NO;
DS_PKEY := 'okesse';
OPEN C_DOC;
LOOP
FETCH C_DOC INTO V_DOCUMENT_NO,V_DOCUMENT_NAME;
EXIT WHEN C_DOC%NOTFOUND;

INSERT INTO TALLY_TBL_DOCUMENT (DOCUMENT_KEY,DOCUMENT_NO,TALLY_NO,DOCUMENT_NAME)
VALUES ( DS_PKEY,V_DOCUMENT_NO,DS_TALLNO,V_DOCUMENT_NAME);

END LOOP;
-----CLOSE THE CURSOR ----
CLOSE C_DOC;

END TRG_AINS_TBL_BILL;
vbcat 2002-03-21
  • 打赏
  • 举报
回复

ORA-04098: 触发器'TRG_AINS_TBL_BILL'无效且未通过重新验证

还是这样子。
xzou 2002-03-20
  • 打赏
  • 举报
回复
TRY:
CREATE OR REPLACE TRIGGER TRG_AINS_TBL_BILL AFTER INSERT ON TALLY_TBL_BILL FOR EACH ROW
DECLARE
DS_TALLNO CHAR(20);
DS_PKEY CHAR(20);
V_DOCUMENT_NO TALLY_CDE_DOCUMENT.DOCUMENT_NO%TYPE
V_DOCUMENT_NAME TALLY_CDE_DOCUMENT.DOCUMENT_NAME%TYPE
CURSOR C_DOC IS
SELECT DOCUMENT_NO,DOCUMENT_NAME
FROM TALLY_CDE_DOCUMENT
WHERE TYPE_KEY = :new.TYPE_KEY;
BEGIN
DS_TALLNO := :new.TALLY_NO;
DS_PKEY := 'okeee';
OPEN C_DOC;
LOOP
FETCH C_DOC INTO V_DOCUMENT_NO,V_DOCUMENT_NAME;
EXIT WHEN C_DOC%NOTFOUND;
INSERT INTO TALLY_TBL_DOCUMENT (DOCUMENT_KEY,DOCUMENT_NO,TALLY_NO,DOCUMENT_NAME)
VALUES ( DS_PKEY,V_DOCUMENT_NO,DS_TALLNO,V_DOCUMENT_NAME);
END LOOP;
END TRG_AINS_TBL_BILL;
vbcat 2002-03-20
  • 打赏
  • 举报
回复
对不起,其中的游标段
CURSOR C_DOC IS
SELECT DOCUMENT_NO,DOCUMENT_NAME
FROM TALLY_CDE_DOCUMENT;
应改为:
CURSOR C_DOC IS
SELECT DOCUMENT_NO,DOCUMENT_NAME
FROM TALLY_CDE_DOCUMENT
WHERE TYPE_KEY = :new.TYPE_KEY;
主要根据新增加行中TYPE_KEY列值取表TALLY_CDE_DOCUMENT中相关数据。
-------
DS_PKEY := 'okeee'; 此行是为了给变量DS_PKEY付值。
-------
VALUES ( DS_TALLNO,V_DOC.DOCUMENT_NO,DS_TALLNO,V_DOC.DOCUMENT_NAME);
应改为:
VALUES ( DS_PKEY,V_DOC.DOCUMENT_NO,DS_TALLNO,V_DOC.DOCUMENT_NAME);
请诸位帮忙.

完整应为:
CREATE OR REPLACE TRIGGER TRG_AINS_TBL_BILL AFTER INSERT ON TALLY_TBL_BILL FOR EACH ROW
DECLARE
DS_TALLNO CHAR(20);
DS_PKEY CHAR(20);
CURSOR C_DOC IS
SELECT DOCUMENT_NO,DOCUMENT_NAME
FROM TALLY_CDE_DOCUMENT
WHERE TYPE_KEY = :new.TYPE_KEY;
BEGIN
DS_TALLNO := :new.TALLY_NO;
FOR V_DOC IN C_DOC LOOP
DS_PKEY := 'okeee';
INSERT INTO TALLY_TBL_DOCUMENT (DOCUMENT_KEY,DOCUMENT_NO,TALLY_NO,DOCUMENT_NAME)
VALUES ( DS_PKEY,V_DOC.DOCUMENT_NO,DS_TALLNO,V_DOC.DOCUMENT_NAME);
END LOOP;

END TRG_AINS_TBL_BILL;




vbcat 2002-03-20
  • 打赏
  • 举报
回复
对不起,其中的游标段
CURSOR C_DOC IS
SELECT DOCUMENT_NO,DOCUMENT_NAME
FROM TALLY_CDE_DOCUMENT;
应改为:
CURSOR C_DOC IS
SELECT DOCUMENT_NO,DOCUMENT_NAME
FROM TALLY_CDE_DOCUMENT
WHERE TYPE_KEY = :new.TYPE_KEY;
主要根据新增加行中TYPE_KEY列值取表TALLY_CDE_DOCUMENT中相关数据。
-------
DS_PKEY := 'okeee'; 此行是为了给变量DS_PKEY付值。
-------
VALUES ( DS_TALLNO,V_DOC.DOCUMENT_NO,DS_TALLNO,V_DOC.DOCUMENT_NAME);
应改为:
VALUES ( DS_PKEY,V_DOC.DOCUMENT_NO,DS_TALLNO,V_DOC.DOCUMENT_NAME);
请诸位帮忙.

完整应为:
CREATE OR REPLACE TRIGGER TRG_AINS_TBL_BILL AFTER INSERT ON TALLY_TBL_BILL FOR EACH ROW
DECLARE
DS_TALLNO CHAR(20);
DS_PKEY CHAR(20);
CURSOR C_DOC IS
SELECT DOCUMENT_NO,DOCUMENT_NAME
FROM TALLY_CDE_DOCUMENT
WHERE TYPE_KEY = :new.TYPE_KEY;
BEGIN
DS_TALLNO := :new.TALLY_NO;
FOR V_DOC IN C_DOC LOOP
DS_PKEY := 'okeee';
INSERT INTO TALLY_TBL_DOCUMENT (DOCUMENT_KEY,DOCUMENT_NO,TALLY_NO,DOCUMENT_NAME)
VALUES ( DS_PKEY,V_DOC.DOCUMENT_NO,DS_TALLNO,V_DOC.DOCUMENT_NAME);
END LOOP;

END TRG_AINS_TBL_BILL;




天桥半仙儿 2002-03-20
  • 打赏
  • 举报
回复
请帖主重新编译一下TRIGGER,并且回帖说明问题解决没有!
如果问题还没有解决,回帖通知一下,并附上你的基表定义!
xzou 2002-03-20
  • 打赏
  • 举报
回复
但显然错误不在这一个分号,
ORA-04098:无效且未通过重新验证。
所以找真正的原因还需要贴主自己检查一下,我觉得游标的使用很奇怪,请帖主说明
xzou 2002-03-20
  • 打赏
  • 举报
回复
yes
天桥半仙儿 2002-03-20
  • 打赏
  • 举报
回复
to xzou(亡狼补齿):
只有一个错误:
(DS_PKEY := 'okeee'; --UNDERSTAND??)
~~

你在楼上提到:

as --not declare
(是这样吗?你编译一下试试!)

end; --lose end;
(人家不是有 "END TRG_AINS_TBL_BILL;"吗?)


这个是TRIGGER, NOT PROCEDURE....
xzou 2002-03-20
  • 打赏
  • 举报
回复
比较明显的错误三个,另外你的游标不知道这样用有什么用
CREATE OR REPLACE TRIGGER "WL"."TRG_AINS_TBL_BILL" AFTER INSERT ON "WL"."TALLY_TBL_BILL" REFERENCING OLD AS OLD NEW AS NEW FOR EACH ROW
as --not declare
DS_TALLNO CHAR(20);
DS_PKEY CHAR(20);
CURSOR C_DOC IS
SELECT DOCUMENT_NO,DOCUMENT_NAME
FROM TALLY_CDE_DOCUMENT;
BEGIN
DS_TALLNO := :new.TALLY_NO;
FOR V_DOC IN C_DOC LOOP
DS_PKEY := 'okeee';--lose ;
INSERT INTO TALLY_TBL_DOCUMENT (DOCUMENT_KEY,DOCUMENT_NO,TALLY_NO,DOCUMENT_NAME)
VALUES ( DS_TALLNO,V_DOC.DOCUMENT_NO,DS_TALLNO,V_DOC.DOCUMENT_NAME);
END LOOP;
end; --lose end;
/
天桥半仙儿 2002-03-20
  • 打赏
  • 举报
回复
show errors trigger <trigger name>;
天桥半仙儿 2002-03-20
  • 打赏
  • 举报
回复
CREATE OR REPLACE TRIGGER "WL"."TRG_AINS_TBL_BILL" AFTER INSERT ON "WL"."TALLY_TBL_BILL" REFERENCING OLD AS OLD NEW AS NEW FOR EACH ROW DECLARE
DS_TALLNO CHAR(20);
DS_PKEY CHAR(20);
CURSOR C_DOC IS
SELECT DOCUMENT_NO,DOCUMENT_NAME
FROM TALLY_CDE_DOCUMENT;
BEGIN
DS_TALLNO := :new.TALLY_NO;
FOR V_DOC IN C_DOC LOOP
DS_PKEY := 'okeee'; --UNDERSTAND??
INSERT INTO TALLY_TBL_DOCUMENT (DOCUMENT_KEY,DOCUMENT_NO,TALLY_NO,DOCUMENT_NAME)
VALUES ( DS_TALLNO,V_DOC.DOCUMENT_NO,DS_TALLNO,V_DOC.DOCUMENT_NAME);
END LOOP;
END TRG_AINS_TBL_BILL;

2,596

社区成员

发帖
与我相关
我的任务
社区描述
Sybase相关技术讨论区
社区管理员
  • Sybase社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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