使用Oracle中的触发器内的select语句的错误绑定变量错误

时间:2015-05-13 03:52:52

标签: oracle plsql triggers bind-variables

我正在尝试使用触发器将记录插入到与另一个表中更改的记录相同的表中。

我还需要插入操作是插入,更新还是删除

CREATE OR REPLACE TRIGGER triggername
AFTER INSERT OR UPDATE OR DELETE
ON tablename

DECLARE
operation_type VARCHAR2;
changed_id VARCHAR2;
BEGIN

IF UPDATING
THEN operation_type := 'Update';

ELSE IF INSERTING
THEN operation_type := 'Insert';

ELSE IF DELETING
THEN operation_type := 'Delete';

END IF;


SELECT id
FROM tablename
WHERE :OLD.record1 != :NEW.record1
OR :OLD.record2 != :NEW.record2
OR :OLD.record3 != :NEW.record3
OR :OLD.record4 != :NEW.record4
OR :OLD.record5 != :NEW.record5
OR :OLD.record6 != :NEW.record6;

INTO changed_id;

  INSERT INTO trigger_table.id VALUES(changed_id);
  INSERT INTO trigger_table.type VALUES(operation_type);
END;
/

我收到错误

  

“BAD BIND NAME:NEW”或“BAD BIND NAME:OLD”为每个:NEW或   :OLD

如上所示

2 个答案:

答案 0 :(得分:1)

您的触发器代码存在多个问题:

  1. operation_type VARCHAR2;
  2. 您必须声明变量大小。否则你会收到错误

      

    PLS-00215:字符串长度约束必须在范围(1 .. 32767)

    例如,将其修改为:

    operation_type VARCHAR2(20);
    changed_id VARCHAR2(20);
    
    1. SELECT .. INTO语句
    2. SELECT id
      FROM tablename
      WHERE :OLD.record1 != :NEW.record1
      OR :OLD.record2 != :NEW.record2
      OR :OLD.record3 != :NEW.record3
      OR :OLD.record4 != :NEW.record4
      OR :OLD.record5 != :NEW.record5
      OR :OLD.record6 != :NEW.record6;
      
      INTO changed_id;
      

      语法不正确。 INTO 子句应位于 SELECT FROM 子句之间:

      SELECT id 
        INTO changed_id 
      FROM tablename 
       WHERE ...
      
      1. WHERE:OLD.record1!=:NEW.record1
      2. 这是关于错误绑定变量错误的原始问题。

        要引用:OLD:NEW值,您需要创建 ROW LEVEL Trigger ,其中必须包含以下条件:

        FOR EACH ROW
        
        1. INSERT语句
        2. INSERT INTO trigger_table.id VALUES(changed_id);
          INSERT INTO trigger_table.type VALUES(operation_type);
          

          您必须插入一行而不是两行插入两个插入语句。此外,trigger_table.id语法不正确。您需要在括号内提及列名称。

          例如,

          INSERT INTO trigger_table(column1, column2) VALUES
                    (changed_id, operation_type);
          

答案 1 :(得分:0)

当您尝试使用时:NEW表示删除,并且:OLD表示创建触发器,您会看到这些错误。

最好移动选择&在

中插入语句
IF INSERTING THEN ... END IF;
IF UPDATING THEN ... END IF;
IF DELETING THEN ... END IF;

使用:NEW和:OLD变量