将行添加到列表顶部的存储过程

时间:2016-02-26 01:50:05

标签: sql oracle stored-procedures plsql oracle12c

Oracle 12c

我目前有以下三个表:Physician,Patient和Wait_List。 Wait_List表是一个桥接表,用于容纳正在等待个别医生的患者。

我想以不同于他们进入等候名单的日期的方式追踪这些患者的优先级。例如,如果给定的医生正在等待3名患者,则这些患者中的每一名在其优先级字段中被赋予1-3的值。

我遇到的问题是弄清楚我将如何开始编写程序以输入优先级高于4的第四位患者,例如优先级为1.我明白该程序需要每一项目前3名患者的优先考虑因素被推低。

非常感谢对此问题的任何指导。

谢谢,

2 个答案:

答案 0 :(得分:1)

此过程将值插入wait_list表,如果已有三名患者等待该特定医生,则会将优先级编号设置为1。只需编辑列名和表名

  create procedure insertinto_Wait_List(i_patient_name IN Patient.patient_namecolumn%TYPE, i_physician Physician.Physician_column%TYPE)
  IS
  v_max_priority NUMBER;
  BEGIN
  select max(prioritynumber_column) into v_max_priority from Wait_List where Physician_column = i_physician;
  if v_max_priority > 2 THEN
  update Wait_List set prioritynumber_column = prioritynumber_column + 1 where Physician_column = i_physician;
  insert into Wait_List (prioritynumber_column, patient_namecolumn, Physician_column) values (1,i_patient_name, i_physician);
  else
  insert into Wait_List (prioritynumber_column, patient_namecolumn, Physician_column) values (v_max_priority + 1,i_patient_name, i_physician);
  end if;
  end;

答案 1 :(得分:1)

使用高级PL / SQL可能有更好的答案。但是使用独特的约束是我的想法。创建表wait_list时,将以下unique constraint添加到create statement:

CONSTRAINT priority_unique UNIQUE (prioritynumber_column, Physician_column)

然后程序,可以使用如下例外

CREATE PROCEDURE proc_insert_wait_list(i_priority IN wait_list.prioritynumber_column%TYPE, i_patient_name IN Patient.patient_namecolumn%TYPE, i_physician Physician.Physician_column%TYPE)
IS
BEGIN
INSERT INTO Wait_List (prioritynumber_column, patient_namecolumn, Physician_column) values (i_priority,i_patient_name, i_physician);
COMMIT;
EXCEPTION
      WHEN DUP_VAL_ON_INDEX
      THEN
      FOR i IN (SELECT prioritynumber_column, patient_namecolumn, Physician_column
          FROM Wait_List 
          WHERE Physician_column = i_physician 
          AND prioritynumber_column >= i_priority)
      LOOP
      UPDATE Wait_List 
      SET prioritynumber_column = prioritynumber_column + 1;
      END LOOP;
      INSERT INTO Wait_List (prioritynumber_column, patient_namecolumn, Physician_column) values (P_priority,i_patient_name, i_physician);
END proc_insert_wait_list;

这个想法,你可以设置你想要的优先级。但是如果它与现有的碰撞,RDBMS将抛出异常DUP_VAL_ON_INDEX。通过按下所有现有记录然后插入优先级来处理。