【问题标题】:How can I find the error in the following SQL query?如何在以下 SQL 查询中找到错误?
【发布时间】:2020-07-13 19:13:25
【问题描述】:

我在第 5 行不断收到以下错误:

Error at line 5: PL/SQL: SQL Statement ignored

代码:

CREATE OR REPLACE TRIGGER  trg_videorental_up  
AFTER UPDATE OF DETAIL_RETURNDATE ON DETAILRENTAL 
FOR EACH ROW 
BEGIN 
      IF :NEW.DETAIL_RETURNDATE IS NULL THEN UPDATE VIDEO SET VID_STATUS =       'OUT' WHERE    VIDEO.VID_NUM = :NEW.VID_NUM; 
      ELSIF :NEW.DETAIL_RETURNDATE > SYSDATE  THEN UPDATE VIDEO SET VID_STATUS = 'OUT' WHERE VIDEO.VID_NUM = :NEW.VID_NUM; 
      ELSIF:NEW.DETAIL_RETURNDATE ='01/01/01' THEN UPDATE VIDEO SET VID_STATUS= 'LOST' WHERE VIDEO.VID_NUM = :NEW.VID_NUM;
      ELSIF :NEW.DETAIL_RETURNDATE <= SYSDATE THEN UPDATE VIDEO SET VID_STATUS = 'IN'  WHERE VIDEO.VID_NUM=  :NEW.VID_NUM;
      END IF;
END; 

【问题讨论】:

  • 好吧,您在一个冒号之前缺少一个空格...(另外'01/01/01' 不是日期;这不会导致错误,但不要依赖隐式转换, 或使用 2 位数的年份。)
  • 实际上,您在doesn't throw that exception 上发布的内容。也许是你的称呼?
  • 这不是查询,也不是 SQL。 PL/SQL 是一种编程语言。

标签: oracle plsql oracle11g database-trigger


【解决方案1】:

如何使用 case/when 值更改为单个更新...如果您没有其他值,只需将其设置为原始 vid_status 值。也更容易阅读(IMO)

UPDATE VIDEO SET VID_STATUS = 
          case when :NEW.DETAIL_RETURNDATE IS NULL 
                 OR :NEW.DETAIL_RETURNDATE > SYSDATE THEN 'OUT' 
               when :NEW.DETAIL_RETURNDATE ='01/01/01' THEN 'LOST' 
               when :NEW.DETAIL_RETURNDATE <= SYSDATE THEN 'IN'  
               else VID_STATUS end
   WHERE VIDEO.VID_NUM = :NEW.VID_NUM; 

放回“:”,显然我删除它是不正确的。对于触发器/过程,我对 Oracle 不太熟悉。

【讨论】:

  • 当我运行查询时,会出现一个对话框,上面写着“新:____”。我应该在那里填写什么?
  • @SaadAhmed,修订后的答案。查看了 Oracle 触发器,它们在“新”别名引用之前不使用前导“:”。试着告诉我。
  • @APC,适当地指出,放回我原来的帖子中的“:”引用。我不是 Oracle 专家,如果我不正确,我会接受。谢谢指正。
  • 谢谢。它仍然不起作用,但我正在与我的团队合作。希望能解决这个问题。
猜你喜欢
  • 1970-01-01
  • 2022-08-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-24
  • 2015-06-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多