1. Exercise

Bank duldet keine Kontoüberziehung, sondern erzeugt bei negativen Kontostän- den (Tabelle account) einen Kredit:

  • setze den Kontostand auf 0

  • erzeuge einen Kredit in der entsprechenden Höhe (Tabelle loan)

  • Kreditnummer ist Kontonummer

Beispiel, wie das Ergebnis ausschauen soll:

delete from account;
delete from loan;
insert into account values(1,'Tumfart',20);
update account set balance=-100 where account_number=1;
select * from account;
Account_Number Account_Name Balance

1

Tumfart

0

select * from loan;
LOAN_NUMBER AMOUNT

1

-80

2. Exercise

Erstelle einen Database Trigger, der überprüft, dass eine Gehaltsänderung nicht über die Grenzen der aktuellen Gehaltsstufe (Tabelle SALGRADE) gehen kann. Ausgenommen sind die MANAGER und der PRESIDENT. Teste den Code.

Salgrade Inserts
CREATE TABLE SALGRADE (
 GRADE               NUMBER,
 LOSAL               NUMBER,
 HISAL               NUMBER);

INSERT INTO SALGRADE VALUES (1,700,1200);
INSERT INTO SALGRADE VALUES (2,1201,1400);
INSERT INTO SALGRADE VALUES (3,1401,2000);
INSERT INTO SALGRADE VALUES (4,2001,3000);
INSERT INTO SALGRADE VALUES (5,3001,9999);
create or replace trigger check_sal
    before update of sal on emp
    for each row
    when (OLD.JOB not in ('Manager', 'President'))
declare
    v_losal SALGRADE.LOSAL%type;
    v_hisal SALGRADE.HISAL%type;
begin
    -- get data
    select HISAL, LOSAL
    into v_hisal, v_losal
    from SALGRADE
        where :old.SAL between LOSAL and HISAL;

    if(:new.SAL > v_hisal) then
        raise_application_error(
            -20000,
            'Cannot update to a higher Salary grade! (limit: ' || v_hisal || ')'
        );
    elsif (:new.SAL < v_losal) then
        raise_application_error(
            -20000,
            'Cannot update to a lower Salary grade! (limit: ' || v_losal || ', employee: ' || :new.EMPNO || '/' || :new.ENAME || ')'
        );
    end if;
end;
/
Disable the trigger
alter trigger check_sal disable;

3. Exercise

Erstelle einen Database Trigger, der überprüft, dass pro Monat nur 2 Neueinstellungen durchgeführt werden können. Teste den Code.

create or replace trigger checkNewEmployment
    before insert on EMP
    for each row
declare
    v_count number;
    v_max number := 2;
begin
    select count(*) into v_count
    from EMP
        where months_between(SYSDATE, HIREDATE) <= 1;

    if (v_count >= v_max) then
        raise_application_error(
            -20000,
            'There cannot be more then' || v_max || 'monthly new hired persons!'
        );
    end if;
end;
/
Disable the trigger
alter trigger checkNewEmployment disable;

4. Exercise

Erstelle einen Database Trigger, der überprüft, dass eine Gehaltserhöhung nicht mehr als 10% betragen darf. Ausgenommen davon ist der PRESIDENT. Teste den Code.

create or replace trigger checkSalaryUpdate
    before update of SAL on EMP
    for each row
    when (OLD.JOB not in ('PRESIDENT'))
begin
    if(((:new.SAL / :old.SAL) -1) > 0.1) then
        raise_application_error(
            -20000,
            'Salary update cannot be over 10%!'
        );
    end if;
end;
Disable the trigger
alter trigger CHECKSALARYUPDATE disable;