编辑:
所以我有这张桌子:
CREATE TABLE Occr_lezione (
Codice_corso varchar2(20),
Nome_modulo varchar2(50),
Data_inizio_ed_modulo date,
Giorno_lezione number(1),
Ora_inizio_lezione date,
Data_inizio_occr_lezione date,
Data_fine_occr_lezione date NOT NULL,
Nome_sede varchar2(30),
Num_aula varchar2(3),
Tipo_aula varchar2(20),
--
CONSTRAINT fk_Occr_lezione_lezione FOREIGN KEY (Codice_corso,Nome_modulo,Data_inizio_ed_modulo,Giorno_lezione,Ora_inizio_lezione) REFERENCES Lezione(Codice_corso,Nome_modulo,Data_inizio_ed_modulo,Giorno_lezione,Ora_inizio_lezione) ON DELETE CASCADE,
CONSTRAINT fk_Occr_lezione_aula FOREIGN KEY (Nome_sede,Num_aula,Tipo_aula) REFERENCES Aula(Nome_sede,Num_aula,Tipo_aula) ON DELETE SET NULL,
CONSTRAINT pk_Occr_lezione PRIMARY KEY (Codice_corso,Nome_modulo,Data_inizio_ed_modulo,Giorno_lezione,Ora_inizio_lezione,Data_inizio_occr_lezione),
CHECK ( trunc(Data_inizio_occr_lezione) = trunc(Data_fine_occr_lezione) ), -- data inizio = data fine // prenotazione giornaliera
CHECK ( Data_inizio_occr_lezione < Data_fine_occr_lezione ) -- ora inizio < ora fine // coerenza temporale
);
基本上包含了大学学院的课程。最后3个值是建筑物的名称,房间的数量和房间的类型,它是包含教室的桌子的外键,特别是这一个:
CREATE TABLE Aula(
Nome_sede varchar2(30),
Num_aula varchar2(3),
Tipo_aula varchar2(15),
Locazione varchar2(20) NOT NULL,
Capienza NUMBER(4) NOT NULL,
--
CONSTRAINT fk_Nome_sede FOREIGN KEY (Nome_sede) REFERENCES sede(Nome_sede) ON DELETE CASCADE,
CONSTRAINT pk_Aula PRIMARY KEY (Nome_sede,Num_aula,Tipo_aula),
CHECK (Tipo_aula IN ('Conferenze','Laboratorio','Aula'))
);
现在,当类插入第一个表(Occr_lezione)时,教室的外键将插入为null。这是因为我需要创建一个将每个班级分配到教室的程序。 你怎么说??
很高兴你问。
正如你在第二张表中看到的那样,有一个属性,最后一个属性,基本上是教室的容量(就可能包含的人而言)。大。现在要将每节课分配到相应的课程,我需要知道有多少人会参加课程。假设我有一个返回该值的函数。这并不是很难,因为有不同类型的教室:普通教室和实验室。当然,普通房间和实验室中的其他人都会学到一些课程。但这不是什么大不了的事,因为我有这张桌子:
CREATE TABLE Modulo (
Codice_corso varchar2(20) NOT NULL,
Nome_modulo varchar2(50),
Locazione_modulo varchar2(20) NOT NULL,
--
CONSTRAINT fk_Modulo_Corso FOREIGN KEY(Codice_corso) REFERENCES Corso(Codice_corso) ON DELETE CASCADE,
CONSTRAINT pk_Modulo PRIMARY KEY(Codice_corso,Nome_modulo),
CHECK (Locazione_modulo IN ('Aula','Laboratorio','Conferenze'))
);
第三个属性确切地定义了那个,并且我可以使用第一个属性轻松地加入到classes表中。
考虑到这一点,我想要实现的是将每个班级与正确类型的教室和最小化自由座椅腰部的最接近的能力联系起来。所以基本上通过更新为第一个表的每一行分配最后两个属性(翻译为room_number和room_type)。这样做 我的想法是给每一行得分(基本上是富裕,我又有一个计算函数)添加一个临时列(如果有意义),然后按类型和分数(使用order by)排序。之后,我可以用教室表做同样的事情,我已经有了类型和容量,然后以某种方式(我仍然不知道如何做这个最后一部分)分配给类的每一行有序表来自于教室订购了桌子。我不知道是否有更好的方法可以做到这一点,在这种情况下,我非常有兴趣学习如何。 对于noob问题和长篇帖子感到抱歉,谢谢你的时间。
答案 0 :(得分:1)
您可以在程序中使用以下选项
select function_score(input_data) score,a.* from your_table a
Order by a.type,score
更新1 : - 您可以使用plsql表创建ENUM,如下所示
create or replace package my_classroom_enum as
type classrooms is table of varchar2(100);
set_of_classrooms classrooms := classrooms('conference',
'Lab',
'Standard');
end;
declare
begin
for i in 1..3
loop
dbms_output.put_line(my_classroom_enum.set_of_classrooms(i));
end loop;
end;
<强>输出: - 强>
conference
Lab
Standard