• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

elcamone

usar trigger para inserir em tabelas

8 mensagens neste tópico

Ola,

basicamente o que pretendo fazer é:

ir a duas tabelas verificar se um determinado dado se encontra em ambas e escrever as primary key de ambas as tabelas numa terceira tabela, algo do género:

tabela exp1 (ID_exp1, xpto1)

tabela exp2 (ID_exp2, xpto2)

Caso um (ou vários) xpto1 = xpto2 escrever na tabela exp3 (ID_exp1,ID_exp2), exemplo:

Insiro na tabela exp2 os seguintes valores:

insert into exp2 values ('3','aaa')

insert into exp2 values ('4','bbb')

insert into exp2 values ('77','aaa')

insiro na tabela exp1 os seguintes valores:

insert into exp1 values ('gg','aaa')

O trigger deve ir colocar na tabela exp3:

('gg','3')

('gg','77')

Seria algo deste género (embora não funcione):

CREATE or replace TRIGGER experiencia

    AFTER INSERT ON exp1

    REFERENCING NEW AS newRow and old as oldRow

    FOR EACh ROW

    BEGIN

    select xpto2 from exp2

    WHEN (newRow.ID_exp1 = oldRow.ID_exp2)

        INSERT INTO exp3 VALUES(:newRow.ID_exp1, :oldRow.id_exp2);

    END experiencia;

Se alguém souber o que estou a fazer errado agradecia, já ando a queimar neurónios com isto e não chego la...  :wallbash:

Fiquem bem e obrigado

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

não queres é seleccionar a row de xpto que tem um ID = newRow.ID_exp1

tipo WHEN (exp2.ID_exp = newRow.ID_exp1)  ?

EDIT: a meu ver oldRow.ID_exp2 não existe, não foi um insert em exp1?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Se eu usar:

CREATE or replace TRIGGER experiencia

    AFTER INSERT ON exp1

    REFERENCING NEW AS newRow

    FOR EACh ROW

    BEGIN

    select xpto2 from exp2

    WHEN (exp2.ID_exp = newRow.ID_exp1)

        INSERT INTO exp3 VALUES(:newRow.ID_exp1, id_exp2);

    END experiencia;

Dame os seguintes erros:

Error(8,5): PL/SQL: SQL Statement ignored

Error(9,10): PL/SQL: ORA-00933: SQL command not properly ended

Não consigo ver onde esta o erro  :D  :wallbash:

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Se eu usar:

CREATE or replace TRIGGER experiencia

    AFTER INSERT ON exp1

    REFERENCING NEW AS newRow

    FOR EACh ROW

    BEGIN

    select xpto2 from exp2

    WHEN (exp2.ID_exp = newRow.ID_exp1)

        INSERT INTO exp3 VALUES(:newRow.ID_exp1, id_exp2);

    END experiencia;

Dame os seguintes erros:

Error(8,5): PL/SQL: SQL Statement ignored

Error(9,10): PL/SQL: ORA-00933: SQL command not properly ended

Não consigo ver onde esta o erro  :D  :wallbash:

não conheço essa sintaxe, mas pelo menos uma coisa está mal, falta o 2 no ID_exp

WHEN (exp2.ID_exp2 = newRow.ID_exp1)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

e estás a inserir duas values numa variável

INSERT INTO exp3 VALUES(:newRow.ID_exp1, id_exp2);"
0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

e estás a inserir duas values numa variável

? exp3 é uma tabela, onde é que está a inserção de 2 valores numa variável?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

de facto...é uma tabela...devo ter confundido porque eu uso sempre o nome dos campos em inserts.. nem sabia sequer que podias fazer assim um insert directo....

.... insert into tabelaX  (campo1, campo2...)  values (value1, value2,...);

Desc pela observação.

Mas já agora

CREATE or replace TRIGGER experiencia
    AFTER INSERT ON exp1
    REFERENCING NEW AS newRow
    FOR EACh ROW
    BEGIN
    select xpto2 from exp2
    WHEN (exp2.ID_exp = :newRow.ID_exp1)
        INSERT INTO exp3 VALUES(:newRow.ID_exp1, id_exp2);
    END experiencia;

Sempre que te referes a "newRow" tens que user os :", não?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

de facto...é uma tabela...devo ter confundido porque eu uso sempre o nome dos campos em inserts.. nem sabia sequer que podias fazer assim um insert directo....

Sempre que te referes a "newRow" tens que user os :", não?

Não tens que pedir desculpa de nada, eu podia estar a ver mal a coisa daí a pergunta.

(Insert Directo) Quando o numero de parâmetros a passar é igual ao numero de parâmetros da tabela pode-se meter os parâmetros por ordem e usar apenas o nome da tabela porque neste caso o sql sabe onde meter esses parâmetros.

Caso se pretenda passar menos parâmetros que as colunas da tabela, ele não consegue adivinhar onde meter cada parâmetro, e nesse caso temos que indicar as colunas.

(":" sem q se refere newRow) não sei, não conheço a sintaxe (já o tinha referido) mas fica a nota  :)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora