plsql—有人能帮我解决一下如何在一天中的两个特定时间重置oracle 11g数据库中的序列吗?

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中选择特定的科室,并根据患者的问题选择特定的医生。为此,我在数据库中维护了一个数

让我向您解释一下医院管理工具的场景

在每家医院,我们分别有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进行会诊


我需要一个程序或函数,其中医生表应该被截断,序列应该分别在上午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;