Function 无法在触发器内调用和插入函数返回的值,是否缺少任何内容?

Function 无法在触发器内调用和插入函数返回的值,是否缺少任何内容?,function,plsql,triggers,Function,Plsql,Triggers,我想在表上使用触发器,每次插入、更新或删除行时都会触发该触发器。我写了这样的东西:不幸的是,我调用的函数不起作用,它给出了java.sql.SQLSyntaxErrorException:ora-04098:trigger compier3.test01无效,重新验证失败。 CREATE OR REPLACE TRIGGER test001 AFTER INSERT OR UPDATE OR DELETE ON m_transaction FOR EACH ROW DECLAR

我想在表上使用触发器,每次插入、更新或删除行时都会触发该触发器。我写了这样的东西:不幸的是,我调用的函数不起作用,它给出了
java.sql.SQLSyntaxErrorException:ora-04098:trigger compier3.test01无效,重新验证失败。

CREATE OR REPLACE TRIGGER test001
   AFTER INSERT OR UPDATE OR DELETE
   ON m_transaction
   FOR EACH ROW
DECLARE
   Availableqty   NUMBER;
BEGIN
   Availableqty := BOMQTYAVAILABLE (:old.m_product_id, 1000000, 1000000);

   INSERT INTO MonitorTable (m_transaction_id, m_product_id, Availableqty)
        VALUES (OLD.m_transaction_id, OLD.m_product_id, Availableqty);
END;

在您的列名子句中,Availableqty可能应该是m_Availableqty?基于您的明显命名约定。它需要一个列名,而需要一个变量。

最后我找到了解决方案,正确的语法如下:

CREATE OR REPLACE TRIGGER test001
   AFTER INSERT OR UPDATE OR DELETE
   ON m_transaction
   FOR EACH ROW
DECLARE
   Availableiqty   NUMBER;
BEGIN
   Availableiqty := BOMQTYAVAILABLE (:new.m_product_id, 1000000, 1000000);

   INSERT INTO MonitorTable (m_transaction_id, m_product_id, Availableqty)
        VALUES (:new.m_transaction_id, :new.m_product_id, Availableiqty);
END;

确保编译触发器
test001
时没有任何错误。然后尝试执行函数测试它是否返回值,例如
select BOMQTYAVAILABLE(testid,1000000,1000000)从dual
中,您可以确保函数返回值,并且该部分代码工作正常。yes函数返回正确的值,但当我编译此触发器时,它在忽略6,3 PL/SQL语句和7,34 PL/SQL:ORA-00984列时给出错误。实际上,bomqtyavailable函数返回产品的当前可用数量,我的表中没有任何m_AvailableQuaty字段。我认为需要额外的列,这可能是错误的。。。请参阅,如果插入,您必须引用为:新值,因为您在更新时没有旧值,因为日志已捕获插入值,您知道您只需要:新值,但如果已删除,则您需要知道已删除的内容引用为:旧,所以在我们的系统中做了什么:如果插入,则插入到。。()值('插入',:新建…)如果更新,则插入到。。()值('更新',:新建…)如果删除,则插入到。。()值('delete',:OLD…)类似的东西…是的,没错。我完全同意你的意见,谢谢你的评论。