【问题标题】:Is it possible to associate values to rows in oracle in a procedure?是否可以在过程中将值与 oracle 中的行相关联?
【发布时间】:2015-03-20 01:44:14
【问题描述】:

我有一个程序当然适用于选择,现在我想为每一行添加一个分数,以便根据它对它们进行排序。有没有办法在 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) 时,教室的外键被插入为空。这是因为我需要创建一个程序,将每个班级分配给一个教室。 你怎么说?

很高兴你问。

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

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

其中第三个属性准确定义了这一点,我可以使用第一个属性轻松加入到类表中。

考虑到这一点,我想要实现的是将每个班级与正确类型的教室和最接近的容量相关联,以尽量减少空闲座位的腰部。所以基本上通过更新给第一个表的每一行分配最后两个属性(翻译为 room_number 和 room_type)。这样做 我的想法是给每一行一个分数(这基本上是富裕程度,我有一个计算函数)添加一个临时列(如果有意义的话),然后按类型和分数对它们进行排序(使用 order by)。之后,我可以对已经有类型和容量的教室表做同样的事情,然后以某种方式(我仍然不知道如何做这最后一部分)为有序表的每一行分配对应的 from教室订了桌子。我不知道是否有更好的方法来做到这一点,在这种情况下,我非常有兴趣学习如何做。

【问题讨论】:

  • 我不明白你在问什么。你有一个程序。我不知道“选择工作”是什么意思。你是说你在这个过程中运行一个查询吗?该查询填充了什么?收藏?一组标量变量?您是否正在打开您打算返回给呼叫者的sys_refcursor?你想添加一个score 到什么?
  • 好的,我会尝试更好地解释我的自我。我有一个过程,在这个过程中,我从通过查询获得的表中选择行。现在我想用一个值来限定每一行,这由我制作的函数确定。最好的情况是,如果这些值可以成为查询获得的结果集的一列,那么我可以直接在结果集上使用 sorted by
  • 首先,我还是不明白。其次,请编辑您的问题以包含您要添加的任何说明。第三,我仍然不明白“选择行”是什么意思。您是说您已将数据加载到集合中吗?那你已经打开了sys_refcursor 来回调用者?你已经运行了SELECT INTO 来填充一些标量变量?还有什么?代码总是有助于展示你实际在做什么。如果您已经有一个计算所需值的函数,那么您是否有理由不在查询中调用该函数?
  • 你想要代码吗?你得到代码!
  • 明确一点,我们想要代码,但我们不想要数百行代码。一个不错的、小型的、可重现的测试用例是理想的。如果你能在 5 行内重现你的问题,那比转储 500 行更有意义。

标签: oracle plsql


【解决方案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

【讨论】:

  • 谢谢您,先生,我在 get_tipo_aula 函数中做了非常相似的事情。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-11-29
  • 1970-01-01
  • 2014-07-13
  • 2013-02-05
  • 1970-01-01
  • 1970-01-01
  • 2012-05-24
相关资源
最近更新 更多