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

是否可以在过程中将值与oracle中的行关联?,oracle,plsql,Oracle,Plsql,我有一个程序,当然可以对选择进行操作,现在我想在每一行添加一个分数,以便根据它对它们进行排序。在甲骨文中有没有办法做到这一点 我有这张桌子: CREATE TABLE Occr_lezione ( Codice_corso varchar2(20), Nome_modulo varchar2(50), Data_inizio_ed_modulo date, Giorno_lezione numbe

我有一个程序,当然可以对选择进行操作,现在我想在每一行添加一个分数,以便根据它对它们进行排序。在甲骨文中有没有办法做到这一点

我有这张桌子:

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
);
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'))
);
现在,当类被插入到第一个表(Occr_lezione)中时,教室的外键被插入为null。这是因为我需要创建一个过程,将每个类分配给一个教室。 你怎么说

很高兴你这么问

正如你在第二张表中所看到的,有一个属性,最后一个属性准确地说,它基本上是教室的容量(就可以容纳的人而言)。伟大的现在,要将每节课分配给相应的班级,我需要知道有多少人将参加。假设我有一个返回该值的函数。这并不困难,因为有不同类型的教室:普通教室和实验室教室。当然,有些课程是在普通教室里学习的,有些是在实验室里学习的。但这没什么大不了的,因为我有一张桌子:

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
);
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表

好的,记住这一点,我试图实现的是将每个班级与正确类型的教室和最接近的容量联系起来,以尽量减少免费座位的腰围。因此,基本上通过更新将最后两个属性(即房间编号和房间类型)分配给第一个表的每一行。这样做
我的想法是给每一行一个分数(基本上是富裕程度,我也有一个函数来计算),添加一个临时列(如果有意义的话),然后按类型和分数排序(使用orderby)。在那之后,我可以对教室表做同样的事情,我已经有了教室表的类型和容量,然后不知怎么(我仍然不知道如何做最后一部分)将教室表中对应的班级表分配给每一行。我不知道是否有更好的方法,在这种情况下,我非常有兴趣学习如何操作。

您可以在程序中使用下面的选择

select function_score(input_data) score,a.* from your_table a
Order by a.type,score
更新1:-您可以使用plsql表创建枚举,如下所示

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

我不明白你在问什么。你有一个程序。我不知道“选择工作”是什么意思。您是说您正在过程中运行查询吗?这个查询填充了什么?收藏?一组标量变量?您是否正在打开要返回给调用者的
sys\u refcursor
?你想给什么增加一个
分数
?好的,我会尽力更好地解释我自己。我有一个过程,在这个过程中,我有一个从表中选择的行,当然是通过查询获得的。现在我想用一个值来限定每一行,它是由我所做的一个函数决定的。最好的情况是,如果这个值可以成为查询获得的结果集的一列,这样我就可以直接在结果集上使用sortedby。首先,我仍然不明白。第二,请编辑您的问题,包括您想要添加的任何澄清。第三,我仍然不明白“选择行”是什么意思。您是说您已将数据加载到集合中?您是否已打开一个
sys\u refcursor
返回调用方?您运行了一个
选择进入
来填充一些标量变量?还有别的吗?代码总是有助于演示您实际在做什么。如果您已经有了一个计算所需值的函数,那么您在查询中不调用该函数有什么原因吗?您想要代码吗?你有密码!我想说清楚,我们需要代码,但我们不需要数百行代码。一个好的、小的、可复制的测试用例是理想的。如果你能在5行中重现你的问题,这比你转储500行更有意义。谢谢你,先生,我在函数get_tipo_aula中做了非常类似的事情。