0

私はまだSQLの使い方を学んでおり、このデータベースの作成について助けが必要です。

次のテーブルを作成しました。

create table Worker
(Num_Worker number(20) PRIMARY KEY,
Name varchar2(30),
ID number(8),
Password varchar2(20));

create table Area
(Code_Area number(10) PRIMARY KEY,
Name varchar2(30),
Current_workers number(2)
Max_workers number(2));

create table Timetable
(ID_Timetable number(10) PRIMARY KEY, 
Time_Entrance date,
Time_Exit date,
Code_Area number(10),
Num_Worker number(20),
Foreign Key (Num_Worker) references Worker(Num_Worker),
Foreign Key (Code_Area) references Area(Code_Area));

おそらく、各労働者は働く地域を選ぶことができますが、各地域には制限があり、同時に労働者がいます。

ワーカーは新しいタイムテーブルを作成しますが、そのタイムテーブルを作成する前に、「Current_workers」が「Max_workers」と同じ値であるかどうかを確認するために選択した領域を確認する必要があります。起こらせよう。

そのためのトリガーを作成しようとしていますが、正しい構文を見つけることができず、その方法もわかりません。また、それを行うよりも良い方法があるかどうかもわかりません。トリガー。これが私がこれまでにしたことのすべてです:

create trigger limit_worker_per_zone
before insert
on Timetable
for each row
as
 BEGIN
  if (select Current_Workers from Area) >= (select Max_workers from Area) <-Not sure...
  BEGIN
    ???
  END
 END

これで私を助けてくれたら本当にありがたいです。その間、私はまだ自分自身でより多くの情報を探していますが、より多くの助けがより良いです。

4

2 に答える 2

1
CREATE TRIGGER limit_worker_per_zone
BEFORE INSERT
ON Timetable
FOR EACH ROW
DECLARE
 v_total NUMBER;
 BEGIN
   BEGIN 
    SELECT max_workers - current_workers
    INTO v_total
    FROM Area
    WHERE Code_Area = :NEW.Code_Area;
    exception when no_data_found then
       v_total := 1;
    END;
 IF v_total <= 0 THEN
   raise_application_error(990000, 'workers full for this area');
 END IF;
END limit_worker_per_zone;
于 2012-06-02T20:37:07.260 に答える
0

これを出発点として試してください:

CREATE OR REPLACE TRIGGER LIMIT_WORKER_PER_ZONE
  BEFORE INSERT ON TIMETABLE
  FOR EACH ROW
AS
  nCurrent_workers  NUMBER;
  nMax_workers      NUMBER;
BEGIN
  SELECT CURRENT_WORKERS,
         MAX_WORKERS
    INTO nCurrent_workers,
         nMax_workers
    FROM AREA
    WHERE CODE_AREA = :NEW.CODE_AREA;

  IF nCurrent_workers = nMax_workers THEN
    NULL;  -- add code here to do the appropriate thing when the area is already full
  ELSE
    NULL;  -- add code here to to the appropriate thing if the area is not full
  END IF;
END LIMIT_WORKER_PER_ZONE;

これを肉付けするのはあなたに任せます。

共有してお楽しみください。

于 2012-06-02T20:35:25.950 に答える