【问题标题】:Stored procedure to add a row to top of list将行添加到列表顶部的存储过程
【发布时间】:2016-06-09 02:12:48
【问题描述】:

甲骨文 12c

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

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

我遇到的问题是弄清楚我将如何开始编写程序以输入优先级高于 4 的第四位患者,例如优先级为 1。我知道该程序需要每个3个当前患者的优先级被推低价值。

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

谢谢,

【问题讨论】:

  • 这部分对我来说没有意义,请澄清/更正:输入第四个优先级高于 4 的患者,例如优先级为 1
  • wait_list 表将包含以下三列:医生 ID、患者 ID、优先级。优先级将是一个递增的数字,对于 (PhysicianID, PatientID) 的每个实例都是唯一的。在上面的场景中,我们有一个由 3 名患者等待的医生。这些患者中的每一个都已根据优先级(1、2 或 3)分配了一个编号。第 4 名患者进来,决定将这名患者排在前 3 名患者之前。因此,这第四位患者的优先级为 1,前三位患者的优先级分别为 2、3 和 4。

标签: sql oracle stored-procedures plsql oracle12c


【解决方案1】:

使用高级 PL/SQL 可能会有更好的答案。但是我想到的是使用唯一约束。创建表wait_list时,添加如下unique constraint创建语句:

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。您可以通过按下所有现有记录然后插入优先级来处理。

【讨论】:

    【解决方案2】:

    此过程会将值插入到 wait_list 表中,如果已经有 3 名患者在等待该特定医生,则它将优先级编号设置为 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;
    

    【讨论】:

    • 这把我带到了我需要去的地方!再次感谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-06
    • 2017-06-25
    相关资源
    最近更新 更多