为什么它会告诉“无效标识符(ORA-00904)”?当我在CONSTRAINT CHECK中调用函数时

时间:2015-02-17 20:33:57

标签: oracle sqlplus oracle11gr2

这是sql文件中的某种学习数据库。我使用oracle 11g并在sqlplus中处理它。

我写了两个函数来检查课程编号和部门编号,因此它取决于每个学生的主要和次要部门。

例如,我是CS系(专业)和BIO系(未成年人)的学生,所以我不能参加关于数学系的课程。

当我在CHECK中调用它但我不知道为什么会这样说。

当我创建所有表时,这是输出(来自sqlplus)

     ....
     ....
     ....
table created.
ALTER TABLE sections ADD CONSTRAINT CK_course_depart CHECK (FindMYDeparture(stuid,find_dno_from_cno(cno)) = 'true');
ERROR at line 1:
ORA-0094: "FIND_DNO_FROM_CNO":invalid identifier

这是在.sql文件

DROP TABLE department CASCADE CONSTRAINTS;
CREATE TABLE department (
    dnumber      number(4) not null,
    dname        varchar(25) not null,
    primary key (dnumber)
);

DROP TABLE courses CASCADE CONSTRAINTS;
CREATE TABLE courses (
    cno      number(4) not null,
    cname    varchar(15) not null,
    credit    number(1) not null,
    dnumber   number(4) not null,
    primary key (cno),
    foreign key (dnumber) references department(dnumber),
    CONSTRAINT credits CHECK (credit > 0 AND credit <= 5)
);

DROP TABLE student CASCADE CONSTRAINTS;
CREATE TABLE student (
    stuid    char(9) not null,
    fname    varchar(15) not null,
    lname    varchar(15) not null,
    dMjno      number(4) not null,
    dMnno      number(4),
    primary key (stuid),
    CONSTRAINT depart_M_n CHECK (dMjno <> dMnno),
    CONSTRAINT dMinor_check CHECK (dMnno = 1 OR dMnno = 2 OR dMnno = 3) 
);

DROP TABLE sections CASCADE CONSTRAINTS;
CREATE TABLE sections (
    sno      number(4)  not null,
    cno      number(4)  not null,
    stuid    char(9) not null,
    semester    varchar(6)  not null,
    year    varchar(4)  not null,
    instructor  varchar(15)  not null,
    CONSTRAINT  combine_pk primary key (sno,stuid),
    foreign key (cno) references courses(cno),
    foreign key (stuid) references student(stuid),
    CONSTRAINT cant_enroll CHECK (semester <> 'Spring' AND year <> 2007)
);

DROP TABLE grading CASCADE CONSTRAINTS;
CREATE TABLE grading (
    sno      number(4) not null,
    stuid    char(9) not null,
    grade  numeric(1,2),
    foreign key (sno,stuid) references sections(sno,stuid),
    foreign key (stuid) references student(stuid),
    CONSTRAINT grading_check CHECK (grade >= 0 AND grade <= 4)

);

DROP FUNCTION FindMYDeparture;
CREATE OR REPLACE FUNCTION FindMYDeparture(stuid_in IN char,depart_course IN NUMBER)
RETURN NUMBER AS
departMa_no  NUMBER;
departMi_no  NUMBER;
report varchar(10);
CURSOR cdno is
SELECT dMjno,dMnno FROM student WHERE stuid = stuid_in;

BEGIN
OPEN cdno;
LOOP
FETCH cdno INTO departMa_no,departMi_no;
IF (departMa_no = depart_course OR departMi_no = depart_course)
THEN
report := 'true';
EXIT;
ELSE 
report := 'flase';
END IF;
EXIT WHEN cdno%NOTFOUND;
END LOOP;
CLOSE cdno;
RETURN report;
END;
/

DROP FUNCTION find_dno_from_cno;
CREATE OR REPLACE FUNCTION find_dno_from_cno(cno_in IN NUMBER)
RETURN NUMBER AS
depart_no NUMBER;
CURSOR cdno is
SELECT dnumber FROM courses WHERE cno = cno_in;
BEGIN
OPEN cdno;
FETCH cdno INTO depart_no;
CLOSE cdno;
RETURN depart_no;
END;
/

ALTER TABLE sections ADD CONSTRAINT CK_course_depart CHECK (FindMYDeparture(stuid,find_dno_from_cno(cno)) = 'true');

2 个答案:

答案 0 :(得分:2)

不会发生。您不能在设计检查约束中使用pl / sql函数:

  

•检查约束条件不能包含以下内容   构建体:

     

•子查询和标量子查询表达式

     

•调用不确定的函数(CURRENT_DATE,   CURRENT_TIMESTAMP,DBTIMEZONE,LOCALTIMESTAMP,SESSIONTIMEZONE,   SYSDATE,SYSTIMESTAMP,UID,USER和USERENV)

     

•调用用户定义的函数

     

•取消引用REF列(例如,使用DEREF函数)

     

•嵌套表格列或属性

     

•伪列CURRVAL,NEXTVAL,LEVEL或ROWNUM

     

•未完全指定的日期常量

http://docs.oracle.com/cd/B19306_01/server.102/b14200/clauses002.htm

答案 1 :(得分:-3)

尝试运行该函数中的每个语句,这是表的不存在列或使用不存在的行的情况。