当前位置: 首页 > 知识库问答 >
问题:

PL/SQL触发器问题(将数据从表1复制到表2)

袁弘化
2023-03-14

我环顾四周,尝试了一些我读过的解决方案。我试图创建一个pl/sql触发器,如果满足子句,它会将数据从一个表复制到另一个表。我觉得我可能只是犯了一个愚蠢的语法错误,而不是一个完全关键的错误,但希望能得到一些帮助。

create or replace TRIGGER TRG_APPLICATIONS
BEFORE INSERT or UPDATE OF APP_ID, Status_id
ON APPLICATIONS
FOR EACH ROW
BEGIN

:new.APP_ID := SEQ_APP_ID.nextval;
:new.APP_DATE := SYSDATE;

IF STATUS_ID = 2 OR STATUS_ID = 5 OR STATUS_ID = 7 OR STATUS_ID = 8 THEN
INSERT INTO APP_HISTORY
SELECT SRN, STATUS_ID, APP_DATE
FROM APPLICATIONS;
END IF;

END;

以下是错误

6.4 PLS-00201:必须声明标识符“STATUS\u ID”

6 1 PL/SQL:语句被忽略

共有3个答案

申屠恺
2023-03-14

看看这个:

create or replace TRIGGER TRG_APPLICATIONS
  BEFORE INSERT or UPDATE OF APP_ID, Status_id
  ON APPLICATIONS
  FOR EACH ROW
BEGIN

  :new.APP_ID := SEQ_APP_ID.nextval;
  :new.APP_DATE := SYSDATE;

  IF :new.STATUS_ID = 2 OR 
     :new.STATUS_ID = 5 OR 
     :new.STATUS_ID = 7 OR 
     :new.STATUS_ID = 8 THEN

    INSERT INTO APP_HISTORY (srn, status_id, app_date)
     values (:new.srn, :new.status_id, :new.app_date);

 END IF;

END;
上官砚文
2023-03-14

可能您需要添加

IF :NEW.STATUS_ID = 2 OR :NEW.STATUS_ID = 5 
OR :NEW.STATUS_ID = 7 OR :NEW.STATUS_ID = 8 THEN
    INSERT INTO APP_HISTORY (srn, status_id, app_date)
    VALUES (:NEW.SRN, :NEW.STATUS_ID, :NEW.APP_DATE);
END IF;
索正豪
2023-03-14

一旦您注意到需要引用值:NEW以获取此插入或更新的ID状态的当前值,您将遇到第二个错误-您无法查询触发器所在的表,因为其内容在不断变化。您将得到一个变异表错误。更不用说你在SELECT上没有where子句,所以你会将所有应用程序转储到APP_历史记录中。我敢打赌,所有你想要的是复制的行,因为它是在更新之前。当然,插入之前没有行,因此没有任何内容可以复制。还是要在插入时将新值复制到历史记录表中?

假设您希望更新旧值,那么您将:

create or replace TRIGGER TRG_APPLICATIONS
BEFORE INSERT or UPDATE OF APP_ID, Status_id
ON APPLICATIONS
FOR EACH ROW
BEGIN

-- APP_ID better not be the PK or it is changing on UPDATE! 
-- IF you only want this value set once on INSERT, wrap it in an IF INSERTING ... END IF; structure
:new.APP_ID := SEQ_APP_ID.nextval;
:new.APP_DATE := SYSDATE;

IF UPDATING AND ( :NEW.STATUS_ID = 2 OR :NEW.STATUS_ID = 5 OR :NEW.STATUS_ID = 7 OR :NEW.STATUS_ID = 8 )
THEN
   INSERT INTO APP_HISTORY (SRN, STATUS_ID, APP_DATE)
   VALUES (:OLD.SRN, :OLD.STATUS_ID, :OLD.APP_DATE);
END IF;

END;

关于触发器第一次切割的其他想法——触发器在app_id更新时触发,但随后在触发器内再次更改app_id。因此,如果您的用户界面设置了一个APP_ID值,然后使用该值插入相关记录——你只是把它搞砸了。

 类似资料:
  • 问题内容: 我正在尝试编写一个触发器来填充一个包含有关雇员的最新工资信息的表。我有一个问题,我现在无法完全绕开我的头。 这是要填充的表: 这是我的触发器: 触发器编译没有问题,但是当我尝试运行此更新时,Oracle告诉我触发器无效。是什么原因造成的? 问题答案: 您已按块显示了代码。但似乎您正在运行一起显示为脚本的内容,最初没有进行更新: 在SQL Developer中作为脚本运行时,脚本输出窗口

  • 我有一个SQL Server2000数据库,有7个表。我想将表数据从此数据库复制到运行在SQL Server2008实例上的另一个数据库。 这些表将完全相同,我只需要将数据从一个复制到另一个。 编辑: 错误0xC0024107:数据流任务1:任务验证过程中出现错误。 (SQL Server导入导出向导) 编辑:

  • 主要内容:创建触发器,示例在本章中,我们将讨论和学习PL/SQL中的触发器。 触发器是存储的程序,在发生某些事件时会自动执行或触发。事实上,触发器是为了响应以下任何事件而被执行的 - 数据库操作(DML)语句(,或) 数据库定义(DDL)语句(,或)。 数据库操作(,,,或)。 可以在事件关联的表,视图,模式或数据库上定义触发器。 使用触发器的好处 触发器可以用于以下目的 - 自动生成一些派生列值 强化参照完整性 事件记录

  • 我有两个SQL表 表 1: 列1, 列2, 列3, 列4, 列5, 列6, 列7 表 2: 列1, 列2, 列4, 列5, 列10 (新列) 应该被赋予默认值0 我需要将数据从表1复制到表2

  • 我在护目镜床单上工作,认为我需要使用谷歌应用程序脚本来做我想做的事情,但我是一家非营利大学医院的心理学家,试图做一些好事,而不是程序员(这可能表明),我拼命在需要帮助。我正试图建立一系列电子表格来跟踪我们治疗方法研讨会的参与情况。 1) 我有一张“参与者注册”表,其中输入了基本信息 2)我想将信息从Participant_Registration的前四列(A: D)转移到第二张Learning_S

  • 问题内容: 我有两个数据库,一个叫做,一个叫做。由于我想练习插入,更新内容,因此我想将某些表从复制到。 我要复制的表称为: 我试图做的是(使用SSMS)右键单击表格,但其中没有“复制”! 问题答案: 假设您有两个数据库,例如A和B: 如果目标表不存在,将创建以下脚本(我不建议这样): INTO COPY_TABLE_HERE FROM A.dbo.table_from_A table_A 如果目标