是否可以在过程中将值与oracle中的行相关联?

时间:2015-03-20 01:44:14

标签: oracle plsql

好吧,所以我有一个程序当然可以选择,现在我想在每一行添加一个分数,以便根据它进行排序。有没有办法在oracle中做这样的事情?

编辑:

所以我有这张桌子:

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问题和长篇帖子感到抱歉,谢谢你的时间。

1 个答案:

答案 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