CONVERTER CÓDIGO DE BANCO ORACLE PARA FIREBIRD

Firebird

20/06/2014

Pessoal precisava saber como faço para converter esses comandos para um banco firebird
quem puder ajudar agradeço

segue o código:




CREATE TYPE AUTOR_TY;
/

CREATE TYPE AUTORES_NT AS TABLE OF REF AUTOR_TY;
/

CREATE TYPE PUBLICACAO_TY AS OBJECT
(pcodigo number,
titulo varchar2(50),
ano varchar2(4),
autores AUTORES_NT
) NOT FINAL;
/
CREATE TYPE ARTIGO_TY UNDER PUBLICACAO_TY
(conferencia varchar2(50),
local varchar2(20),
paginas varchar2(10));
/

CREATE TYPE LIVRO_TY UNDER PUBLICACAO_TY
(isbn varchar2(15),
editor varchar2(50),
total_paginas number);
/

CREATE TYPE ENDERECO_TY AS OBJECT
(rua varchar2(50),
cidade varchar2(30),
estado varchar2(30),
pais varchar2(30));
/

CREATE TYPE ARTIGOS_NT AS TABLE OF REF ARTIGO_TY;
/

CREATE TYPE LIVROS_NT AS TABLE OF REF LIVRO_TY;
/

CREATE OR REPLACE TYPE AUTOR_TY AS OBJECT
(acodigo number,
nome varchar2(50),
email Varchar2(30),
artigos ARTIGOS_NT,
livros LIVROS_NT,
endereco ENDERECO_TY);
/

**************CRIAÇÃO VISÕES DE OBJETO******************

CREATE OR REPLACE VIEW AUTORES_V OF AUTOR_TY
WITH OBJECT IDENTIFIER(acodigo)
AS SELECT A.acodigo, A.nome, A.email,
null,
null,
ENDERECO_TY(A.rua, A.cidade, A.estado, A.pais)
FROM AUTORES A;

CREATE OR REPLACE VIEW PUBLICACOES_V OF PUBLICACAO_TY
WITH OBJECT IDENTIFIER(pcodigo)
AS SELECT P.pcodigo, P.titulo, P.ano,
CAST(MULTISET(SELECT MAKE_REF(AUTORES_V, A.acodigo)
FROM AUTORES A, AUTORIAS AUT
WHERE AUT.publicacao = P.pcodigo AND
A.acodigo = AUT.autor) AS AUTORES_NT)
FROM PUBLICACOES P;
WHERE P.pcodigo NOT IN ( (SELECT A.pcodigo FROM ARTIGOS A )
UNION
(SELECT L.pcodigo FROM LIVROS L))


CREATE OR REPLACE VIEW ARTIGOS_V OF ARTIGO_TY UNDER PUBLICACOES_V
AS SELECT P.pcodigo, P.titulo, P.ano,
CAST(MULTISET(SELECT MAKE_REF(AUTORES_V, A.acodigo)
FROM AUTORES A, AUTORIAS AUT
WHERE AUT.publicacao = P.pcodigo AND
A.acodigo = AUT.autor) AS AUTORES_NT),
A.conferencia, A.local, A.paginas
FROM PUBLICACOES P, ARTIGOS A
WHERE P.pcodigo = A.pcodigo;

CREATE OR REPLACE VIEW LIVROS_V OF LIVRO_TY UNDER PUBLICACOES_V
AS SELECT P.pcodigo, P.titulo, P.ano,
CAST(MULTISET(SELECT MAKE_REF(AUTORES_V, A.acodigo)
FROM AUTORES A, AUTORIAS AUT
WHERE AUT.publicacao = P.pcodigo AND
A.acodigo = AUT.autor) AS AUTORES_NT),
L.isbn, L.editor, L.total_paginas
FROM PUBLICACOES P, LIVROS L
WHERE P.pcodigo = L.pcodigo;


CREATE OR REPLACE VIEW AUTORES_V OF AUTOR_TY
WITH OBJECT IDENTIFIER(acodigo)
AS SELECT A.acodigo, A.nome, A.email,
CAST(MULTISET(SELECT MAKE_REF(ARTIGOS_V, P.pcodigo)
FROM PUBLICACOES P, AUTORIAS AUT
WHERE AUT.autor = A.acodigo AND
P.pcodigo = AUT.publicacao) AS ARTIGOS_NT),
CAST(MULTISET(SELECT MAKE_REF(LIVROS_V, P.pcodigo)
FROM PUBLICACOES P, AUTORIAS AUT
WHERE AUT.autor = A.acodigo AND
P.pcodigo = AUT.publicacao) AS LIVROS_NT),
ENDERECO_TY(A.rua, A.cidade, A.estado, A.pais)
FROM AUTORES A;







3) Defina INSTEAD OF TRIGGERS para as seguintes operações de atualização:

a) Inserção em ARTIGOS_V

CREATE OR REPLACE TRIGGER INSERT_ARTIGOS_V
INSTEAD OF INSERT ON ARTIGOS_V
FOR EACH ROW
DECLARE
i INTEGER;
autores_list AUTORES_NT;
autor AUTOR_TY;
BEGIN
autores_list := :new.autores;
INSERT INTO PUBLICACOES VALUES (:new.pcodigo, :new.titulo, :new.ano);
INSERT INTO ARTIGOS VALUES (:new.pcodigo, :new.conferencia, :new.local,
:new.paginas);
FOR i in 1..autores_list.count LOOP
UTL_REF.SELECT_OBJECT(autores_list(i), autor);
INSERT INTO AUTORIAS VALUES(:new.pcodigo, autor.acodigo);
END LOOP;

END;
/

b) Remoção em LIVROS_V

CREATE OR REPLACE TRIGGER DELETE_LIVROS_V
INSTEAD OF DELETE ON LIVROS_V
FOR EACH ROW
BEGIN
DELETE FROM LIVROS A WHERE A.pcodigo = :old.pcodigo;
DELETE FROM AUTORIAS A WHERE A.publicacao = :old.pcodigo;
DELETE FROM PUBLICACOES P WHERE P.pcodigo = :old.pcodigo;
END;
/

c) Inserção em AUTORES_V

CREATE OR REPLACE TRIGGER INSERT_AUTORES_V
INSTEAD OF INSERT ON AUTORES_V
FOR EACH ROW
DECLARE
i INTEGER;
artigos_list ARTIGOS_NT;
livros_list LIVROS_NT;
artigo ARTIGO_TY;
livro LIVRO_TY;
BEGIN
artigos_list := :new.artigos;
livros_list := :new.livros;
INSERT INTO AUTORES VALUES (:new.acodigo, :new.nome, :new.email,
:new.endereco.rua, :new.endereco.cidade,
:new.endereco.estado, :new.endereco.pais);
FOR i in 1..artigos_list.count LOOP
UTL_REF.SELECT_OBJECT(artigos_list(i), artigo);
INSERT INTO AUTORIAS VALUES(artigo.pcodigo, :new.acodigo);
END LOOP;
FOR i in 1..livros_list.count LOOP
UTL_REF.SELECT_OBJECT(livros_list(i), livro);
INSERT INTO AUTORIAS VALUES(livro.pcodigo, :new.acodigo);
END LOOP;
END;
/
d) Atualização do atributo email em AUTORES_V

CREATE OR REPLACE TRIGGER UPDATE_AUTORES_V
INSTEAD OF UPDATE ON AUTORES_V
FOR EACH ROW
BEGIN
IF (:new.email <> :old.email) THEN
UPDATE AUTORES A
SET A.email = :new.email
WHERE A.acodigo = :new.acodigo;
END IF;
END;
/

e) Inserção de um autor para uma dada publicação em PUPLICACOES_V.

CREATE OR REPLACE TRIGGER INSERT_AUTORES_PUBLICACOES_V
INSTEAD OF INSERT ON NESTED TABLE autores OF PUBLICACOES_V
FOR EACH ROW
DECLARE
autor AUTOR_TY;
BEGIN
UTL_REF.SELECT_OBJECT(:new.column_value, autor);
INSERT INTO AUTORIAS VALUES(:parent.pcodigo, autor.acodigo);
END;
/





f) Remoção de um artigo de um dado autor em AUTORES_V

CREATE OR REPLACE TRIGGER DELETE_ARTIGOS_AUTORES_V
INSTEAD OF INSERT ON NESTED TABLE artigos OF AUTORES_V
FOR EACH ROW
DECLARE
artigo ARTIGO_TY;
BEGIN
UTL_REF.SELECT_OBJECT(:old.column_value, artigo);
DELETE FROM AUTORIAS A WHERE A.publicacao = artigo.pcodigo AND
A.autor = :PARENT. acodigo
END;
/
Fabio

Fabio

Curtidas 0
POSTAR