Oracle PL / SQL Trigger (запускать новые строки) - PullRequest
0 голосов
/ 15 октября 2018

У меня есть следующие таблицы:

CREATE TABLE film (
  film_id NUMBER(5) NOT NULL,
  title varchar2(255),
  description varchar2(255),
  release_year NUMBER(4) DEFAULT NULL,
  language_id NUMBER(3) NOT NULL,
  original_language_id NUMBER(3) DEFAULT NULL,
  rental_duration NUMBER(3) DEFAULT 3 NOT NULL,
  rental_rate NUMBER(4,2) DEFAULT '4.99',
  length NUMBER(5) DEFAULT NULL,
  replacement_cost NUMBER(5,2) DEFAULT '19.99' NOT NULL,
  rating varchar2(8) DEFAULT 'G',
  special_features varchar2(255) DEFAULT NULL
);


CREATE TABLE language (
  language_id NUMBER(3) NOT NULL,
  name varchar2(20) NOT NULL
);

и следующие ограничения:

ALTER TABLE FILM ADD CONSTRAINT FK_LANGUAGEID FOREIGN KEY (LANGUAGE_ID) REFERENCES LANGUAGE (LANGUAGE_ID);

ALTER TABLE FILM ADD CONSTRAINT FK_ORLANGUAGEID FOREIGN KEY (ORIGINAL_LANGUAGE_ID) REFERENCES LANGUAGE (LANGUAGE_ID);

Вопрос:

НаписатьТриггер SQL, например с именем BI_FILM_LANG, для добавления текста к описанию каждого нового фильма, вставленного в базу данных.Он основан на языке (language_id) и оригинальном языке (original_language_id) фильма.Формат текста, который вы добавляете, должен быть (заменяющий токены):

Originally in ​<original language>
​ . Re-released in ​<language>
​ . Original language and language should be the name of the language from the             language table. 

Например: если был выполнен следующий запрос:

INSERT INTO FILM (title, description, language_id, original_language_id ) VALUES  ('B Movie', 'Movie about wasps.', 1, 2); 

Он должен выдать следующее, когда следующеевыполняется оператор выбора (при условии, что идентификатор фильма B равен 9999999):

SQL> SELECT description FROM FILM WHERE film_id = 9999999;

description 

---------------------------------------------------------
Movie about wasps. Originally in Italian. Re-released in English. 

1 Ответ

0 голосов
/ 15 октября 2018

1.Вы должны написать прагма автономный блок:

create or replace 
PROCEDURE update_data (ol NUMBER,rl NUMBER,film_id NUMBER
                                )
IS
   PRAGMA AUTONOMOUS_TRANSACTION;

  l_name  VARCHAR2(100);
  l_namerl    VARCHAR2(100);

BEGIN

 SELECT name   INTO l_name FROM language 
 WHERE language_id=ol;

  SELECT name INTO l_namerl FROM language 
 WHERE language_id=rl; 


  UPDATE film
  SET description=description||'.Originally in '||l_name||'. Re-released in '||l_namerl 

  WHERE film_id=film_id;

 COMMIT;    


END;

2. Триггер

create or replace 
TRIGGER sspr_air_tr
    AFTER INSERT
    ON film
    FOR EACH ROW 

BEGIN

 update_data(:new.language_id ,:new.original_language_id,:new.film_id);
END;

3.

INSERT INTO language VALUES (1,'English');
INSERT INTO language VALUES (2,'Italian');

INSERT INTO FILM (film_id,title, description, language_id, original_language_id ) VALUES  (100,'B Movie', 'Movie about wasps.', 1, 2);


SELECT * from film;
...