将行添加到列表顶部的存储过程
Stored procedure to add a row to top of list
甲骨文 12c
我目前有以下三个 table:医师、患者和 Wait_List。 Wait_List table 是一座桥 table 来承载正在等待个别医生的病人。
我想以不同于他们进入等候名单的日期的方式跟踪这些患者中的每一个的优先级。例如,如果给定的医生正在等待 3 名患者,则这些患者中的每一个都在其优先级字段中分配了 1-3 的值。
我遇到的问题是弄清楚我将如何开始编写程序来输入优先级高于 4 的第四个患者,例如优先级为 1。我知道该程序需要3 个当前患者的优先级中的每一个都将被降低价值。
非常感谢对此问题的任何指导。
谢谢,
此过程会将值插入到 wait_list table 中,如果已经有三名患者在等待该特定医生,它会将优先级编号设置为 1。只需编辑列和 table 名称
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;
使用高级 PL/SQL 可能会有更好的答案。但是我想到了使用唯一约束。在创建 table wait_list 时,添加以下 unique constraint to create 语句:
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。您通过下推所有现有记录然后插入优先级来处理。
甲骨文 12c
我目前有以下三个 table:医师、患者和 Wait_List。 Wait_List table 是一座桥 table 来承载正在等待个别医生的病人。
我想以不同于他们进入等候名单的日期的方式跟踪这些患者中的每一个的优先级。例如,如果给定的医生正在等待 3 名患者,则这些患者中的每一个都在其优先级字段中分配了 1-3 的值。
我遇到的问题是弄清楚我将如何开始编写程序来输入优先级高于 4 的第四个患者,例如优先级为 1。我知道该程序需要3 个当前患者的优先级中的每一个都将被降低价值。
非常感谢对此问题的任何指导。
谢谢,
此过程会将值插入到 wait_list table 中,如果已经有三名患者在等待该特定医生,它会将优先级编号设置为 1。只需编辑列和 table 名称
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;
使用高级 PL/SQL 可能会有更好的答案。但是我想到了使用唯一约束。在创建 table wait_list 时,添加以下 unique constraint to create 语句:
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。您通过下推所有现有记录然后插入优先级来处理。