【发布时间】:2012-11-27 21:14:00
【问题描述】:
我正在尝试编写一个 PLSQL 函数来实现一个约束,即员工不能同时是司机和机械师,换句话说,来自 TRKEMPLOYEE 的相同 E# 不能同时在 TRKDRIVER 和 TRKMECHANIC 中.如果数据库的内容违反了该约束,请列出所有既是机械师又是司机的员工的 E# 和 NAME。上述表格如下:
TRKEMPLOYEE(E# NUMBER(12) NOT NULL
NAME VARCHAR(50) NOT NULL,
DOB DATE ,
ADDRESS VARCHAR(300) NOT NULL,
HIREDATE DATE NOT NULL,
CONSTRAINT TRKEMPLOYEE_PKEY PRIMARY KEY(E#))
TRKDRIVER(E# NUMBER(12) NOT NULL
L# NUMBER(8) NOT NULL,
STATUS VARCHAR(10) NOT NULL,
CONSTRAINT TRKDRIVER_PKEY PRIMARY KEY(E#),
CONSTRAINT TRKDRIVER_FKEY FOREIGN KEY(E#) REFERENCES TRKEMPLOYEE(E#))
TRKMECHANIC(E# NUMBER(12) NOT NULL
L# NUMBER(8) NOT NULL,
STATUS VARCHAR(10) NOT NULL,
EXPERIENCE VARCHAR(10) NOT NULL,
CONSTRAINT TRKMECHANIC_PKEY PRIMARY KEY(E#),
CONSTRAINT TRKMECHANIC_FKEY FOREIGN KEY(E#) REFERENCES TRKEMPLOYEE(E#))
我试图编写一个函数,但在第 1 行第 7 列中不断出现编译错误。谁能告诉我为什么我的代码不起作用?我的代码如下
CREATE OR REPLACE FUNCTION Verify()
IS DECLARE
E# TRKEMPLOYEE.E#%TYPE;
CURSOR C1 IS SELECT E# FROM TRKEMPLOYEE;
BEGIN
OPEN C1;
LOOP
FETCH C1 INTO EMPNUM;
IF(EMPNUM IN(SELECT E# FROM TRKMECHANIC )AND EMPNUM IN(SELECT E# FROM TRKDRIVER))
SELECT E#, NAME FROM TRKEMPLOYEE WHERE E#=EMPNUM;
ELSE
dbms_output.put_line(“OK”);
ENDIF
EXIT WHEN C1%NOTFOUND;
END LOOP;
CLOSE C1;
END;
/
任何帮助将不胜感激。谢谢。
【问题讨论】:
-
我不确定我是否了解您的数据模型。 TRKDRIVER 和 TRKMECHANIC 表存储什么?他们是否具有 TRKEMPLOYEE 所没有的其他属性?为什么不在 TRKEMPLOYEE 中设置一个标志来标记员工是司机还是机械师?
-
我省略了我的表格的一些细节,因为我认为它们与当时的问题无关。我已将这些字段连同我的问题的全部详细信息一起添加回
-
顺便说一句:您可以通过使用物化视图将约束破解到此模型中。该解决方案是否可行取决于这些表的更新频率以及它们的大小。