سؤال

I'm new to Oracle. I run my scripts through SQL Developer. I try to make few connected tables and two triggers to them.

CREATE TABLE BIKE(
    ID NUMBER(8) NOT NULL,
    FRONT_WHEEL_ID NUMBER(8),
    BACK_WHEEL_ID NUMBER(8)

);

CREATE TABLE WHEEL(
    ID NUMBER(8) NOT NULL,
    DIAMETER NUMBER(8,2)

);

CREATE TABLE PRODUCTS(
    ID NUMBER(8) NOT NULL,
    PRODUCT_NAME NVARCHAR2(64),
    PRODUCT_COUNT NUMBER(8)
);

CREATE TABLE PRODUCTS_HISTORY(
    ID NUMBER(8) NOT NULL,
    DIAMETER NUMBER(8,2)    
);

-- PK's
ALTER TABLE BIKE
ADD CONSTRAINT BIKE_PK PRIMARY KEY (ID);

ALTER TABLE WHEEL
ADD CONSTRAINT WHEEL_PK PRIMARY KEY (ID);

ALTER TABLE PRODUCTS
ADD CONSTRAINT PRODUCTS_PK PRIMARY KEY (ID);

ALTER TABLE PRODUCTS_HISTORY
ADD CONSTRAINT PRODUCTS_HISTORY_PK PRIMARY KEY (ID);

-- FK's
ALTER TABLE BIKE
ADD CONSTRAINT BIKE_FRONT_WHEEL_FK FOREIGN KEY (FRONT_WHEEL_ID)
REFERENCES WHEEL (ID);

ALTER TABLE BIKE
ADD CONSTRAINT BIKE_BACK_WHEEL_FK FOREIGN KEY (BACK_WHEEL_ID)
REFERENCES WHEEL (ID);

-- Simple data
INSERT INTO PRODUCTS (ID, PRODUCT_NAME) VALUES (1, 'Bikes');
INSERT INTO PRODUCTS (ID, PRODUCT_NAME) VALUES (2, 'Wheels');

-- Triggers

CREATE OR REPLACE TRIGGER WHEEL_after_insert
    AFTER INSERT OR DELETE
       ON WHEEL

    DECLARE
       WHEEL_COUNT NUMBER(8);

    BEGIN
    SELECT COUNT(*) INTO WHEEL_COUNT FROM WHEEL;
    UPDATE PRODUCTS SET PRODUCT_COUNT = WHEEL_COUNT WHERE PRODUCT_NAME = 'Wheels';
    END;

CREATE OR REPLACE TRIGGER BIKE_after_insert
    AFTER INSERT OR DELETE
       ON BIKE

    DECLARE
       BIKE_COUNT NUMBER(8);

    BEGIN
    SELECT COUNT(*) INTO BIKE_COUNT FROM BIKE;
    UPDATE PRODUCTS SET PRODUCT_COUNT = BIKE_COUNT WHERE PRODUCT_NAME = 'Bikes';
    END;    

When I run whole as one sql script I get:

...
1 rows inserted.
TRIGGER WHEEL_AFTER_INSERT compiled
Errors: check compiler log

When I run everything except :

    CREATE OR REPLACE TRIGGER BIKE_after_insert

    AFTER INSERT OR DELETE
       ON BIKE

    DECLARE
       BIKE_COUNT NUMBER(8);

    BEGIN
    SELECT COUNT(*) INTO BIKE_COUNT FROM BIKE;
    UPDATE PRODUCTS SET PRODUCT_COUNT = BIKE_COUNT WHERE PRODUCT_NAME = 'Bikes';
    END;

And then run the above in separate worksheet everything works fine.

What shall I add ? I tried adding COMMIT; and COMMIT WORK; between triggers, but it didn't do any difference.

Jah bless ya for help

هل كانت مفيدة؟

المحلول

Program blocks (including triggers declarations) should be separated with as forward slash (/) if you have multiple in the same script. In general, it's best to add a / after each PL/SQL block. You don't need them between SQL statements.

...
CREATE OR REPLACE TRIGGER WHEEL_after_insert
    AFTER INSERT OR DELETE
       ON WHEEL

    DECLARE
       WHEEL_COUNT NUMBER(8);

    BEGIN
    SELECT COUNT(*) INTO WHEEL_COUNT FROM WHEEL;
    UPDATE PRODUCTS SET PRODUCT_COUNT = WHEEL_COUNT WHERE PRODUCT_NAME = 'Wheels';
    END;
/

CREATE OR REPLACE TRIGGER BIKE_after_insert
    AFTER INSERT OR DELETE
       ON BIKE

    DECLARE
       BIKE_COUNT NUMBER(8);

    BEGIN
    SELECT COUNT(*) INTO BIKE_COUNT FROM BIKE;
    UPDATE PRODUCTS SET PRODUCT_COUNT = BIKE_COUNT WHERE PRODUCT_NAME = 'Bikes';
    END; 
/
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top