Oracle 触发器错误:错误的绑定变量“新”

问题描述

我正在尝试创建一个触发器来检查容量,2 个函数 get_max_capacityget_current_capacity 的输入具有 OBJECT_U5 类型(我的代码如下)

CREATE OR REPLACE TYPE object_u5 AS OBJECT (
        student_id  VARCHAR2(1000),course_id   VARCHAR2(1000),sec_id      VARCHAR2(1000),semester    VARCHAR2(1000),year        NUMBER(4,0),grade       VARCHAR2(3)
);
CREATE OR REPLACE FUNCTION get_current_capacity (
        course_register IN object_u5
) RETURN NUMBER IS
        current_capacity NUMBER(38);
BEGIN
        SELECT
                COUNT(*)
        INTO current_capacity
        FROM
                takes
        WHERE
                        course_id = course_register.course_id
                AND sec_id = course_register.sec_id
                AND year = course_register.year
                AND semester = course_register.semester;
END;
CREATE OR REPLACE TRIGGER check_capacity BEFORE
        INSERT ON takes
        FOR EACH ROW
ENABLE DECLARE
        max_capacity  NUMBER(4,0);
        current_capacity  NUMBER(4,0);
BEGIN
        max_capacity := get_max_capacity(:new);
        current_capacity := get_current_capacity(:new);
        IF ( max_capacity > cur_capacity ) THEN
                dbms_output.put_line('Insert successfully');
        ELSE
                dbms_output.put_line('The classroom is full! Choose the others');
        END IF;
END;

返回的 2 个错误PLS-00049: bad bind variable 'NEW'

解决方法

正是; :new 什么?应该是例如

    current_capacity := get_current_capacity
          (object_u5(:new.student_id,:new.course_id,:new.sec_id,:new.semester,:new.year,:new.grade));

修复后,触发器编译:

SQL> CREATE OR REPLACE TRIGGER check_capacity BEFORE
  2          INSERT ON takes
  3          FOR EACH ROW
  4  ENABLE DECLARE
  5          max_capacity  NUMBER(4,0);
  6          current_capacity  NUMBER(4,0);
  7  BEGIN
  8          max_capacity :=
  9            get_max_capacity(object_u5(:new.student_id,10                                       :new.course_id,11                                       :new.sec_id,12                                       :new.semester,13                                       :new.year,14                                       :new.grade));
 15          current_capacity :=
 16            get_current_capacity(object_u5(:new.student_id,17                                       :new.course_id,18                                       :new.sec_id,19                                       :new.semester,20                                       :new.year,21                                       :new.grade));
 22
 23          IF ( max_capacity > current_capacity ) THEN
 24                  dbms_output.put_line('Insert successfully');
 25          ELSE
 26                  dbms_output.put_line('The classroom is full! Choose the others');
 27          END IF;
 28  END;
 29  /

Trigger created.

SQL>

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...