Jump to content
Vigaro

Criar Trigger

Recommended Posts

Vigaro

Estou com problemas em criar um trigger.

O que eu quero que ele faça é quando se faz a venda do medicamento ele vê se a quantidade (coluna da tabela stock) está abaixo ou igual ao stockmin (coluna da tabela medicamentos). Se estiver ele insere um nova linha na tabela stockp.

Eu fiz um procidemento e  o trigger chama-o  mas está-me a dar erro e não mudar isso...

create or replace
procedure stocks as
BEGIN
declare
b number
select medicamentos.stockmin into b from medicamentos, stock where stock.nmed=medicamentos.nmed;
when (quantidadet<=b)
insert into stockp values((select max(ordem)+1 from stockp),(select nmed from stock where quantidadet=0),(select (medicamentos.stockmax-medicamentos.stockmin) from medicamentos, stock where stock.quantidadet=0), sysdate+(3*365));
END stocks;

create or replace
trigger controlar
after insert or update on stock
for each row
begin
stocks();
end controlar;

Preciso urgentemente de ajuda tenho que entregar este trabalho na segunda-feira...

Obrigado

Share this post


Link to post
Share on other sites
brunoais

"Está a dar erro" é tão inútil como dizeres que o teu carro não anda e o outro q descubra (e o problema ser de não meteres a chave).

Se dá erro, indica os erros todos, sem isso, é demasiado complicado encontrar o problema.


"[Os jovens da actual geração]não lêem porque não envolve um telecomando que dê para mirar e atirar, não falam porque a trapalhice é rainha e o calão é rei" autor: thoga31

Life is a genetically transmitted disease, induced by sex, with death rate of 100%.

Share this post


Link to post
Share on other sites
Vigaro

Os erros são:

Error(6,1): PLS-00103: Encontrado o símbolo "SELECT" quando era esperado um dos seguintes:     := . ( @ % ; not null range default character 
Error(7,1): PLS-00103: Encontrado o símbolo "WHEN"
Error(8,1): PLS-00103: Encontrado o símbolo "INSERT" quando era esperado um dos seguintes:     * & = - + ; < / > at in is mod remainder not rem    <expoente (**)> <> or != or ~= >= <= <> and or like like2    like4 likec between overlaps || multiset year day member    submultiset 
Error(8,28): PLS-00103: Encontrado o símbolo "SELECT" quando era esperado um dos seguintes:     ( - + case mod new not null <identificador>    <identificador delimitado entre aspas>    <variável de associação> continue avg count current exists    max min prior sql stddev sum variance execute forall merge    time timestamp interval date    <literal de cadeia de caracteres com especificação do conjunto de caracteres>    <número> <cadeia de caracteres de SQL entre plicas> pipe    <literal de cadeia de caracteres entre asp
Error(8,59): PLS-00103: Encontrado o símbolo ")" quando era esperado um dos seguintes:     . , @ ; for <identificador>    <identificador delimitado entre aspas> group having intersect    minus order partition start subpartition union where connect    sample 
Error(8,220): PLS-00103: Encontrado o símbolo "+" quando era esperado um dos seguintes:     . , @ ; for <identificador>    <identificador delimitado entre aspas> group having intersect    minus order partition start subpartition union where connect    sample O símbolo "having" foi substituído por "+" para continuar. 
Error(8,228): PLS-00103: Encontrado o símbolo ")" quando era esperado um dos seguintes:     * & = - + ; < / > at for in is mod remainder not rem    <expoente (**)> <> or != or ~= >= <= <> and or like like2    like4 likec between group having intersect minus order start    union where connect || year day member submultiset 

Share this post


Link to post
Share on other sites
mauro.edgar

Ora então vamos lá:

Tens muita coisa mal aqui....

_ falta ; a seguir à declaração do number;

_ falta o begin e end depois do declare;

_ de onde vem o quantidadet;

_ depois faz um if como deve ser...

_ essa query de insert está uma miséria mesmo!

Experimenta assim, se é que entendi o teu raciocínio.....

CREATE OR REPLACE PROCEDURE stocks AS
BEGIN
    DECLARE
        b   NUMBER;
        qty NUMBER;
    BEGIN
        SELECT m.stockmin, s.quantidadet
          INTO b, qty
          FROM medicamentos m
          JOIN stock s
            ON s.nmed = m.nmed;
    
        IF qty <= b
        THEN
            INSERT INTO stockp
                SELECT (SELECT nvl(MAX(sp.ordem) + 1, 0)
                          FROM stockp sp),
                       s.nmed,
                       (m.stockmax - m.stockmin),
                       SYSDATE + (3 * 365)
                  FROM stock s
                  JOIN medicamentos m
                    ON s.nmed = m.nmed
                 WHERE s.quantidadet = 0;
        END IF;
    END;
END stocks;

Share this post


Link to post
Share on other sites
Vigaro

É isso Mauro =D

Só me faltava esse trigger para acabar o trabalho.

Muito Obrigado pela ajuda!!

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.