plsql—有人能帮我解决一下如何在一天中的两个特定时间重置oracle 11g数据库中的序列吗?
让我向您解释一下医院管理工具的场景 在每家医院,我们分别有n个医生、n个行政人员、n个安全部门等。每一家医院我们在早上大约8:00到10:00左右进行门诊咨询,从上午10:00到晚上5:00,医生将在“重症监护病房”(ICU)为住院患者进行手术和治疗。所以现在下午5点以后,医生将在18:00到20:00在医院进行门诊会诊 现在,让我用技术术语向大家解释一下 当门诊病人来时,询问某某医生的令牌号码。然后,管理员将在UI中选择特定的科室,并根据患者的问题选择特定的医生。为此,我在数据库中维护了一个数据库,每个医生的表由医生自己命名 例子: 1) 神经内科 2) 心脏科 3) 骨科 等 创建医生表: 因为我们对每个医生都有相同的表结构。但现在的问题是,每个医生表中的第一列必须从1自动生成,为此,我创建了一个序列和一个过程,以在管理员插入之前执行序列 我们上午8:00到10:00进行门诊咨询。每个医生只有20名病人需要咨询 序列创建: 程序创建: 我需要你做的是: 在会诊期间,任何医生的代币数量达到20名患者后,即在上午8:00到上午10:00之间,代币数量达到其最大水平。如果有人要求预约某位医生。管理员不应为该医生提供任何形式的预约,并坚持要求患者在晚上18:00到20:00进行会诊plsql—有人能帮我解决一下如何在一天中的两个特定时间重置oracle 11g数据库中的序列吗?,oracle,plsql,oracle11g,Oracle,Plsql,Oracle11g,让我向您解释一下医院管理工具的场景 在每家医院,我们分别有n个医生、n个行政人员、n个安全部门等。每一家医院我们在早上大约8:00到10:00左右进行门诊咨询,从上午10:00到晚上5:00,医生将在“重症监护病房”(ICU)为住院患者进行手术和治疗。所以现在下午5点以后,医生将在18:00到20:00在医院进行门诊会诊 现在,让我用技术术语向大家解释一下 当门诊病人来时,询问某某医生的令牌号码。然后,管理员将在UI中选择特定的科室,并根据患者的问题选择特定的医生。为此,我在数据库中维护了一个数
我需要一个程序或函数,其中医生表应该被截断,序列应该分别在上午10:00和晚上20:00后重置回minvalue 首先,您应该有
患者指定
表,而不是有医生姓名的单独表,只需在该表中传递医生ID即可
create table patient_appoint(token_no not null primary key,
doctor_id number not null,
patient_name char(50) not null ,
patient_age number(3) not null ,
patient_phonenumber number(12) not null unique ,
patient_email varchar2(50) not null unique,
patient_gender char(1) not null,
patient_location varchar2(50) not null,
patient_dateofappointment date not null,
CONSTRAINT sk_token_no CHECK (token_no<=20);
对于每天仅限20名患者,您可以使用以下触发器-
CREATE OR REPLACE TRIGGER TR_PATIENT_APPOINT
AFTER INSERT ON PATIENT_APPOINT
DECLARE
v_count NUMBER;
BEGIN
SELECT COUNT(*)
INTO v_count
FROM PATIENT_APPOINT
WHERE TRUNC(patient_dateofappointment) = TRUNC(SYSDATE);
IF (v_count > 20) THEN
raise_application_error(-20000, 'Maximum 20 appointments allowed per day.');
END IF;
END TR_PATIENT_APPOINT;
首先,您应该有
patient_appoint
表,而不是包含医生姓名的单独表,并且只需在该表中传递医生ID即可
create table patient_appoint(token_no not null primary key,
doctor_id number not null,
patient_name char(50) not null ,
patient_age number(3) not null ,
patient_phonenumber number(12) not null unique ,
patient_email varchar2(50) not null unique,
patient_gender char(1) not null,
patient_location varchar2(50) not null,
patient_dateofappointment date not null,
CONSTRAINT sk_token_no CHECK (token_no<=20);
对于每天仅限20名患者,您可以使用以下触发器-
CREATE OR REPLACE TRIGGER TR_PATIENT_APPOINT
AFTER INSERT ON PATIENT_APPOINT
DECLARE
v_count NUMBER;
BEGIN
SELECT COUNT(*)
INTO v_count
FROM PATIENT_APPOINT
WHERE TRUNC(patient_dateofappointment) = TRUNC(SYSDATE);
IF (v_count > 20) THEN
raise_application_error(-20000, 'Maximum 20 appointments allowed per day.');
END IF;
END TR_PATIENT_APPOINT;
正如其他人指出的或至少暗示的那样,这将是一场维护噩梦,每个医生都有自己的表和自己的序列。想想当病人取消时会发生什么。你们并没有得到那个序列值,所以医生只能看19个病人。这是一个很容易处理的情况。有一个更简单的方法:不要使用序列 如果你把它分解,每个专利基本上都有6分钟的时间间隔(120分钟/20个批次)。使用his,您可以为最初没有患者信息的每位医生生成一个骨架计划。管理员然后在需要时填写患者信息,并可以实际查看每位医生的可用时间。下面显示了如何生成这样的计划。(注意,它假设您已经规范化了医生表(1个表包含所有医生)并创建了患者表(1个表包含所有患者)
——之前的设置
创建表医生(doc_id整数,名称varchar2(50),…,约束doc_pk主键(doc_id));
创建表pat_id integer,名称varchar2(50),…,约束pat_pk主键(pat_id));
---每日门诊时间表。
创建门诊患者时间表(
ops_id整数
,doc_id整数不为空
,pat_id整数
,apt_计划日期
,约束操作主键(操作id)
,约束ops2doc\u fk外键(doc\u id)引用医生(doc\u id)
,约束ops2pat_fk外键(pat_id)引用患者(pat_id)
);
---生成骨架计划
创建或替换程序gen\u门诊\u骨架\u计划
作为
开始
插入门诊患者时间表(医生id、apt时间表)
以apt_倍为
(选择trunc(系统日期,'天')+8/24+(120/20)*(1级)/(60*24)ApthiTimePieldTimeP正如其他人指出的那样,或者是在暗示这将是一个维护噩梦,每个医生都有自己的表和自己的序列。考虑当病人取消时会发生什么。你没有得到那个序列值,所以医生只能看到19个病人。这是一个很容易的情况。有一个更简单的方法:不要使用序列
如果你把它分解,每个专利基本上都有6分钟的时间间隔(120分钟/20个批次)。通过his,您可以为最初没有患者信息的每位医生生成一个框架计划。管理员然后在需要时填写患者信息,并可以实际查看每位医生的可用时间。以下显示了如何生成此类计划。(注意,它假设您已将医生表标准化。)(1个包含所有医生的表)并创建了一个患者表(1个包含所有患者的表)
——之前的设置
创建表医生(doc_id整数,名称varchar2(50),…,约束doc_pk主键(doc_id));
创建表pat_id integer,名称varchar2(50),…,约束pat_pk主键(pat_id));
---每日门诊时间表。
创建门诊患者时间表(
ops_id整数
,doc_id整数不为空
,pat_id整数
,apt_计划日期
if we think generally admin doesn't know which token number is going on for each and every doctor.
create sequence appointment_sequence
start with 1
increment by 1
minvalue 1
maxvalue 20
cache 5
;
create or replace trigger appointment_sequence before insert on sarath_kumar for each row
begin
:new.token_no := appointment_sequence.NEXTVAL;
end;
/
create table patient_appoint(token_no not null primary key,
doctor_id number not null,
patient_name char(50) not null ,
patient_age number(3) not null ,
patient_phonenumber number(12) not null unique ,
patient_email varchar2(50) not null unique,
patient_gender char(1) not null,
patient_location varchar2(50) not null,
patient_dateofappointment date not null,
CONSTRAINT sk_token_no CHECK (token_no<=20);
create sequence appointment_sequence
start with 1
increment by 1
minvalue 1
maxvalue 20
cycle
cache 5
;
CREATE OR REPLACE TRIGGER TR_PATIENT_APPOINT
AFTER INSERT ON PATIENT_APPOINT
DECLARE
v_count NUMBER;
BEGIN
SELECT COUNT(*)
INTO v_count
FROM PATIENT_APPOINT
WHERE TRUNC(patient_dateofappointment) = TRUNC(SYSDATE);
IF (v_count > 20) THEN
raise_application_error(-20000, 'Maximum 20 appointments allowed per day.');
END IF;
END TR_PATIENT_APPOINT;
--- prior Setup
create table doctors(doc_id integer, name varchar2(50), ..., constraint doc_pk primary key (doc_id));
create table patients(pat_id integer, name varchar2(50), ..., constraint pat_pk primary key (pat_id));
--- Daily Out patient Schedule.
create table out_patient_schedule (
ops_id integer
, doc_id integer not null
, pat_id integer
, apt_schedule date
, constraint ops_pk primary key (ops_id)
, constraint ops2doc_fk foreign key (doc_id) references doctors(doc_id)
, constraint ops2pat_fk foreign key (pat_id) references patients(pat_id)
);
--- Generate skeleton schedule
create or replace procedure gen_outpatient_skeleton_schedule
as
begin
insert into out_patient_schedule( doc_id, apt_schedule)
with apt_times as
( select trunc(sysdate, 'day') + 8/24 + (120/20)*(level-1)/(60*24) apt_time from dual connect by level <= 20
union all
select trunc(sysdate, 'day') + 18/24 + (120/20)*(level-1)/(60*24) from dual connect by level <= 20
)
select doc_id, apt_time from doctors, apt_times;
end gen_outpatient_skeleton_schedule;