Como criar essa Trigger

Dúvidas, dicas e truques de PL/SQL. Aqui também vão assuntos relacionados a pacotes, triggers, funções, Java-Stored Procedures, etc
Responder
facc
Rank: Analista Pleno
Rank: Analista Pleno
Mensagens: 104
Registrado em: Qua, 27 Mai 2009 2:37 pm
Localização: Cerquilho / SP

Boa tarde,

Preciso criar uma trigger que faça um update na tabela para gravar um valor de acordo com algumas particularidades

Exemplo da tabela

Selecionar tudo

Código---TipoPreco--Sequencia--Filial--ValidadeFim
585880----1--------------[b]1[/b]---------999------null
585880----1--------------[b]2[/b]---------999------21/06/2010
585880----2--------------[b]1[/b]---------999------null
585880----2--------------[b]2[/b]---------999------null
585880----1--------------[b]3[/b]---------999------22/06/2010 
585881----1--------------[b]1[/b]---------999------22/06/2010
585881----1--------------[b]2[/b]---------999------23/06/2010
Em palavras:
Preciso procurar na base os campos Codigo, TipoPreco e Filial, se encontrar a sequencia vai ser (Sequencia + 1), porém se encontrar mais de um caso, terá que verificar o campo ValidadeFim, se for a mais recente, vai receber a sequencia maior, e caso não encontre nenhum registro, a sequencia deve ser 1

Obs. Em todas as inclusões, o Campo ValidadeFim vai receber uma data igual ou maior que a atual, ou também uma data nula.[/b]
facc
Rank: Analista Pleno
Rank: Analista Pleno
Mensagens: 104
Registrado em: Qua, 27 Mai 2009 2:37 pm
Localização: Cerquilho / SP

em outro forúm me passaram isso,

Selecionar tudo

CREATE OR REPLACE TRIGGER TRG_TABELA BEFORE INSERT ON TABELA
DECLARE
  VN_SEQUENCIA NUMBER;
BEGIN
  BEGIN
    SELECT SEQUENCIA INTO  VN_SEQUENCIA 
    FROM TABELA
    WHERE Codigo ::NEW.CODIGO AND TipoPreco = NEW.TIPOPRECO AND FILIAL = :NEW.FILIAL;
  EXCEPTION
    WHEN NO_DATA_FOUND THEN
      VN_SEQUENCIA:=0;
  END;
  VN_SEQUENCIA:=VN_SEQUENCIA+1;
  NEW.SEQQUENCIA := VN_SEQUENCIA; 
END;
Estava suplindo minha necessidade, até que me me avisaram (hoje - 25/06/2010) que quando a ValidadeFim estiver nula/branco tem que ter a sequencia maior.

Outra coisa, é preciso criar uma Trigger after update que faça a mesma coisa, ou seja, a data mais recente vai ter a maior sequencia. Posso utilizar a mesma idéia?
rodfbar
Rank: DBA Pleno
Rank: DBA Pleno
Mensagens: 241
Registrado em: Ter, 09 Out 2007 11:15 am
Localização: Batatais - SP

ola
veja se esta query te ajuda

Selecionar tudo

select Codigo, Tipo,Filial, Validadefim
     ,ROW_NUMBER()  OVER(PARTITION BY Codigo, Tipo,Filial ORDER BY Codigo, Tipo,Filial, NVL(Validadefim,'01/01/1900') ) AS sequencia
from tabela
rodfbar
Rank: DBA Pleno
Rank: DBA Pleno
Mensagens: 241
Registrado em: Ter, 09 Out 2007 11:15 am
Localização: Batatais - SP

desculpem

Selecionar tudo

select Codigo, Tipo,Filial, Validadefim
     ,ROW_NUMBER()  OVER(PARTITION BY Codigo, Tipo,Filial ORDER BY Codigo, Tipo,Filial, NVL(Validadefim,'01/01/1900') ) AS Row_Number
from TABELA

abrçs
facc
Rank: Analista Pleno
Rank: Analista Pleno
Mensagens: 104
Registrado em: Qua, 27 Mai 2009 2:37 pm
Localização: Cerquilho / SP

Obrigado, gostei desse SELECT, mas como posso utilizar ele para dar um update na tabela?
rodfbar
Rank: DBA Pleno
Rank: DBA Pleno
Mensagens: 241
Registrado em: Ter, 09 Out 2007 11:15 am
Localização: Batatais - SP

ola...

hum... só para eu entender.... pra que necessita armazenar esta sequencia?

desculpe a intromissão... esta duvida é só para talvez dar a melhor dica ok...


abrçs
facc
Rank: Analista Pleno
Rank: Analista Pleno
Mensagens: 104
Registrado em: Qua, 27 Mai 2009 2:37 pm
Localização: Cerquilho / SP

é a sequencia que será exibido na tela para o usuário.

essa tabela possui a formação de preço, ou seja, o usuário final vai escolher a sequencia no momento que vai realizar a venda do produto.
rodfbar
Rank: DBA Pleno
Rank: DBA Pleno
Mensagens: 241
Registrado em: Ter, 09 Out 2007 11:15 am
Localização: Batatais - SP

fazer este bloco baseado em query não rola?
facc
Rank: Analista Pleno
Rank: Analista Pleno
Mensagens: 104
Registrado em: Qua, 27 Mai 2009 2:37 pm
Localização: Cerquilho / SP

o software é de uma empresa terceirizada, eles solicitaram para ser via banco
facc
Rank: Analista Pleno
Rank: Analista Pleno
Mensagens: 104
Registrado em: Qua, 27 Mai 2009 2:37 pm
Localização: Cerquilho / SP

Boa tarde, Com essa Trigger

Selecionar tudo

CREATE OR REPLACE TRIGGER TRG_PRECOS_VMX_SEQ
  BEFORE insert on vm_produtosprecos  
  for each row
declare
  VN_SEQUENCIA NUMBER;  
begin
  BEGIN
    SELECT SEQUENCIA INTO VN_SEQUENCIA
      FROM VM_PRODUTOSPRECOS
     WHERE ID_PRODUTOSPRECOS = :new.ID_PRODUTOSPRECOS
       AND TIPOPRECO = :new.TIPOPRECO
       AND FILIAL = :new.FILIAL
     ORDER BY VALIDADEFIM ASC;
  EXCEPTION
  WHEN NO_DATA_FOUND THEN
    VN_SEQUENCIA := 0;
  END;
  VN_SEQUENCIA := VN_SEQUENCIA + 1;
     
  :new.SEQUENCIA := VN_SEQUENCIA;
end TRG_PRECOS_VMX_SEQ;
Consegui chegar nesse resultado

Imagem

mas a sequencia está invertida, exemplo é as linhas selecionadas. Quando a ValidadeFim for nula, deverá ter a sequencia maior, o mesmo caso serve para quando a ValidadeFim possuir data, a mais recente deverá receber a sequencia maior. Lembrando que preciso verificar se os campos Codigo, TipoPreco e filial são iguais
thiago_r_f
Rank: Programador Pleno
Rank: Programador Pleno
Mensagens: 43
Registrado em: Qui, 17 Abr 2008 4:02 pm
Localização: Rio de Janeiro - RJ
O Backup é meu pastor e nada me faltará!
Thiago Rodrigues de Farias

Altere sua query para colocar os valores nulos em último lugar no ORDER BY.

Selecionar tudo

ORDER BY VALIDADEFIM ASC NULLS LAST;
Mais em http://psoug.org/reference/orderby.html
facc
Rank: Analista Pleno
Rank: Analista Pleno
Mensagens: 104
Registrado em: Qua, 27 Mai 2009 2:37 pm
Localização: Cerquilho / SP

Mudei o Order by, mas continua na mesma.

Fiz também os testes com First, Last, ASC, DESC...
rogenaro
Rank: DBA Pleno
Rank: DBA Pleno
Mensagens: 232
Registrado em: Sex, 30 Mar 2007 7:26 pm
Localização: Londrina - PR
Rafael O. Genaro

Hmm... em primeiro lugar: qual foi o registro inserido por último?
lembrando que esta trigger não irá reordenar sua sequencia caso você tenha um registro com validadefim null (logo seria o único registro, com sequencia 1) e insira um novo registro, agora com validadefim preenchida (a consulta que sua trigger está realizando simplesmente busca a maior sequencia + 1 com base nos registros recuperados, que no caso seria 2)

Neste caso, você precisaria reordenar as sequencias, ou é permitido que um registro fique com a sequencia fora da ordem definida pela sua regra se um registro for inserido ou alterado em uma ordem diferente? O exemplo abaixo estaria correto? Senão, qual seria a ordenação esperada?

Selecionar tudo

insert de um registro com data igual a 01/06:
registro   data   sequencia
1          01/06  1

insert de novo registro com data igual a 03/06:
registro   data   sequencia
1          01/06  1
1          03/06  2

insert de novo registro com data null:
registro   data   sequencia
1          01/06  1
1          03/06  2
1          null   3

insert de novo registro com data 02/06:
registro   data   sequencia
1          01/06  1
1          03/06  2
1          null   3
1          02/06  4
segundo: Sua trigger irá disparar um erro quando você tentar inserir um terceiro registro para determinado (id_produtoprecos, tipopreco e filial), pois está realizando um select ... into ... (se a consulta retornar 2 ou mais registros, vai gerar uma exceção too_many_rows)

terceiro: eventualmente sua trigger irá disparar um erro ORA-04091: table ... is mutating, trigger/function may not see it, pois sua trigger realiza uma consulta sobre a própria tabela que está sendo alterada.
Aqui você encontra uma documentação sobre o problema, e como evitá-lo

http://www.oracle-base.com/articles/9i/ ... ptions.php
facc
Rank: Analista Pleno
Rank: Analista Pleno
Mensagens: 104
Registrado em: Qua, 27 Mai 2009 2:37 pm
Localização: Cerquilho / SP

Entendi o que você quis dizer. Realmente já me retornou uma vez esse erro de mutating

Mas como poderia fazer isso que me solicitarão? Não posso mexer no arquivo texto e não posso solicitar para a empresa (terceirizada) tratar isso via programa (geraria um custo)

Existe alguma forma? Criar uma procedure e no final da importação eu chamaria, ou importar primeiramente em uma tabela de integração e tratar nela antes da importação definitiva
rodfbar
Rank: DBA Pleno
Rank: DBA Pleno
Mensagens: 241
Registrado em: Ter, 09 Out 2007 11:15 am
Localização: Batatais - SP

se quiserem deixar as regras no banco pode-se criar uma view com a query que te passei... e o bloco no forms apontar para ela...

se for criar mesmo uma rotina... vai ter q criar uma funcao com pragma autonomous transaction, onde a mesma vai rearanjar as sequencias com um loop... esta vai ser chamada na trigger de insert e update, e vai retornar qual a janela de sequencia que o registro atual vai seguir

e a trigger de update deve ser descriminados quais campos ao atualizados vao dispara-la. onde o campo sequencia não deve estar nesta lista... :(

mas todas são regras de logica, tente montar uma procedure que selecione os mesmos registros do mesmo codigo, tipopreco e filial..

depois da uma olhada em rotinas pragma autonomous transaction, e crie as trigger de insert e update (onde nesta deve ser indicado os campos que vai dispara-la quando atualizados, sem que a coluna SEQUENCIA a dispare BEFOREUPDATE OF CODIGO, TIPOPRECO,FILIAL, VALIDADEFIM
) as triggers vao chamar esta sua funcao.... e atribiur a sequencia retornada ao campo :new.sequencia

abrçs..
facc
Rank: Analista Pleno
Rank: Analista Pleno
Mensagens: 104
Registrado em: Qua, 27 Mai 2009 2:37 pm
Localização: Cerquilho / SP

você teria algum exemplo de como poderia utilizar com o pragma autonomous transaction?
Avatar do usuário
fsitja
Rank: OraSauro
Rank: OraSauro
Mensagens: 611
Registrado em: Seg, 19 Jan 2009 4:29 pm
Localização: Gaúcho no Rio de Janeiro - RJ
"The scars exist to remind us that the past was real"
Campanha: Como fazer uma pergunta e obter uma resposta.
http://tkyte.blogspot.com/2005/06/how-t ... tions.html

OCA & OCP Developer — OCE SQL Expert — OCS Data Warehousing Specialist

A pragma autonomous transaction não foi feito para contornar exception de mutating table... e solução por trigger é bastante ineficiente do ponto de vista de desempenho.

Pelo que entendi os dados só entram na tabela através de carga de arquivo, certo? Não tem inserts em transações individuais?

Se for assim você poderia executar um update após a carga, e atribuir o valor correto para todas as linhas.
facc
Rank: Analista Pleno
Rank: Analista Pleno
Mensagens: 104
Registrado em: Qua, 27 Mai 2009 2:37 pm
Localização: Cerquilho / SP

Exato, isso é uma carga padrão, vai haver apenas um insert.

Mas poderão haver alterações nessa tabela (não tenho informações a respeito), porém acredito que que caíra na regra também (a data mais recente deverá ter a sequencia maior).

Em programação, eu resolveria com if, mas é uma terceira empresa que cuida do software, não posso solicitar.
Avatar do usuário
fsitja
Rank: OraSauro
Rank: OraSauro
Mensagens: 611
Registrado em: Seg, 19 Jan 2009 4:29 pm
Localização: Gaúcho no Rio de Janeiro - RJ
"The scars exist to remind us that the past was real"
Campanha: Como fazer uma pergunta e obter uma resposta.
http://tkyte.blogspot.com/2005/06/how-t ... tions.html

OCA & OCP Developer — OCE SQL Expert — OCS Data Warehousing Specialist

Segue um pouco sobre o pragma autonomous transaction, para entender porque ela não é apropriada para lidar com mutating exceptions:
http://www.orafaq.com/node/1915

Sobre as eventuais atualizações. Fui olhar sua regra no exemplo do primeiro post, mas fiquei com dúvidas sobre a lógica para atribuir a sequência, pois ela sobe e desce depois...

Supondo o caso de teste abaixo, como ficaria a coluna sequência? Em especial a 6a linha? Fica 3 ainda?

(linha 1 = 1, linha 2 = 2 depois a linha 6 =3)

E as linhas 3, 4 e 5? Tanto faz qual for a ordem, pois nenhuma tem data?
Avatar do usuário
fsitja
Rank: OraSauro
Rank: OraSauro
Mensagens: 611
Registrado em: Seg, 19 Jan 2009 4:29 pm
Localização: Gaúcho no Rio de Janeiro - RJ
"The scars exist to remind us that the past was real"
Campanha: Como fazer uma pergunta e obter uma resposta.
http://tkyte.blogspot.com/2005/06/how-t ... tions.html

OCA & OCP Developer — OCE SQL Expert — OCS Data Warehousing Specialist

Selecionar tudo

    CODIGO  TIPOPRECO  SEQUENCIA     FILIAL VALIDADEFIM
---------- ---------- ---------- ---------- -----------
    585880          1                   999 
    585880          1                   999 21/6/2010
    585880          2                   999 
    585880          2                   999 
    585880          2                   999 
    585880          1                   999 22/6/2010
    585881          1                   999 22/6/2010
    585881          1                   999 23/6/2010
facc
Rank: Analista Pleno
Rank: Analista Pleno
Mensagens: 104
Registrado em: Qua, 27 Mai 2009 2:37 pm
Localização: Cerquilho / SP

Pela imagem dos post anteriores dá para visualizar bem

Se o código, tipopreco e filial forem iguais, devo olhar a ValidadeFim se for nulo ou uma data mais recente devo colocar a sequencia maior
Porem se o código e a filial forem iguais e o tipopreco diferente, devo recomeçar a sequencia, ou seja,

Se os 3 campos forem iguais a sequencia vai de 1 até o final, e se um dos campos for diferente, reinicio a sequencia.

É exatamente o que a trigger está fazendo, porem preciso que, quando a ValidadeFim for nula a sequencia seja maior.

Selecionar tudo

Código---TipoPreco--Sequencia--Filial--ValidadeFim
585880----1--------------1---------999------22/06/2010
585880----1--------------2---------999------21/06/2010
585880----1--------------3---------999------null
585880----2--------------2---------999------null
585881----1--------------1---------009------22/06/2010
585881----1--------------1---------999------23/06/2010
Avatar do usuário
fsitja
Rank: OraSauro
Rank: OraSauro
Mensagens: 611
Registrado em: Seg, 19 Jan 2009 4:29 pm
Localização: Gaúcho no Rio de Janeiro - RJ
"The scars exist to remind us that the past was real"
Campanha: Como fazer uma pergunta e obter uma resposta.
http://tkyte.blogspot.com/2005/06/how-t ... tions.html

OCA & OCP Developer — OCE SQL Expert — OCS Data Warehousing Specialist

Desculpa, eu esqueci de postar o exemplo no mesmo post. Ficou num post separado, eu modifiquei o seu, se verificar acima.
Avatar do usuário
fsitja
Rank: OraSauro
Rank: OraSauro
Mensagens: 611
Registrado em: Seg, 19 Jan 2009 4:29 pm
Localização: Gaúcho no Rio de Janeiro - RJ
"The scars exist to remind us that the past was real"
Campanha: Como fazer uma pergunta e obter uma resposta.
http://tkyte.blogspot.com/2005/06/how-t ... tions.html

OCA & OCP Developer — OCE SQL Expert — OCS Data Warehousing Specialist

Mas no último exemplo que você postou está ao contrário... data mais recente está menor, e a que a data está null está com 3 em vez de 1 na coluna sequência. :?
facc
Rank: Analista Pleno
Rank: Analista Pleno
Mensagens: 104
Registrado em: Qua, 27 Mai 2009 2:37 pm
Localização: Cerquilho / SP

Desculpa...

to ficando louco aqui já...

vou montar um exemplo e posto aqui
facc
Rank: Analista Pleno
Rank: Analista Pleno
Mensagens: 104
Registrado em: Qua, 27 Mai 2009 2:37 pm
Localização: Cerquilho / SP

Selecionar tudo

CODIGO  TIPOPRECO  SEQUENCIA     FILIAL VALIDADEFIM
----------   ----------       ----------      ---------- -----------
585880          1                  2                999
585880          1                  1                999       21/6/2010
585880          2                  1                999
585880          2                  2                999
585880          2                  3                999
585880          1                  1                999       22/6/2010
585881          1                  2                999       22/6/2010
585881          1                  3                999       23/6/2010 
seria +/- isso
rogenaro
Rank: DBA Pleno
Rank: DBA Pleno
Mensagens: 232
Registrado em: Sex, 30 Mar 2007 7:26 pm
Localização: Londrina - PR
Rafael O. Genaro

Para uma carga inicial dos dados, a consulta que o rodfbar postou no início já resolveria (faça primeiro a carga o campo sequencia preenchido com qualquer valor no primeiro passo, e em seguida faça a consulta):

Selecionar tudo

select p.*
     , row_number() over ( partition by id_produtosprecos, tipopreco, filial 
                           order     by validadefim nulls last
                         ) rn 
from   vw_produtosprecos p
Veja se a ultima coluna (rn) retorna a numeração da sequencia que você espera.

Pelo que entendi:
A menor data de validade fim recebe a menor sequencia (1), que é incrementada de 1 em 1 conforme a data de validade fim aumenta.
Datas não informadas (null), devem possuir a maior sequencia do grupo.
A cada alteração em id_produtosprecos, tipopreco ou filial, a seqencia derá ser reiniciada a partir do número 1.

(só para confirmar, pois no seu ultimo exemplo o código da antepenultima linha é 585880 com sequencia 1.. já o código seguinte, 585881, inicia na sequencia 2... ficou meio estranho neste ponto.. a antepenultima linha deveria ter o código 585881 também, ou a penultima linha deveria ter sequencia 1 e a ultima sequencia 2? Ou eu entendi a regra errado?)

Se estiver tudo OK, é só atualizar os dados conforme o comando abaixo (versão 9i ou superior)

Selecionar tudo

merge into vm_produtosprecos p
using ( select rowid rid
             , row_number() over ( partition by id_produtosprecos, tipopreco, filial 
                                   order     by validadefim nulls last
                                 ) rn 
        from   vw_produtosprecos
      ) p2
on    ( p.rowid = p2.rid )
when  matched then
  update
  set    p.sequencia = p2.rn
;
Agora, para reorganizar as sequencias sem alterar o programa (que seria o ideal), é possível realizar via triggers também, mas fica um pouco mais trabalhoso...

Selecionar tudo

-- Primeiro criamos uma package para armazenar as chaves dos registros que foram alterados
create or replace package k_produtosprecos as

  type pp_rec is record
  ( id_produtosprecos vw_produtosprecos.id_produtosprecos%type
  , tipopreco         vw_produtosprecos.tipopreco%type
  , filial            vw_produtosprecos.filial%type
  );

  type pp_tab is table of pp_rec index by binary integer;
  
  t_pp pp_tab;

end k_produtosprecos;
/

-- Em seguida, uma trigger before inset/update (statement level), para limpar os dados utilizados por outras execuções
create or replace trigger t_vm_produtosprecos_biu before insert or update on vm_produtosprecos as
begin
  k_produtosprecos.t_pp.delete;
end t_vm_produtosprecos_bi;
/

-- Agora, uma trigger before insert/update (row level), para armazenar os conjuntos de id, tipo e filial que foram inseridos/alterados
create or replace trigger t_vm_produtosprecos_biur before insert or update on vm_produtosprecos for each row as
declare
  i number;
begin
  i := k_produtosprecos.t_pp.count() + 1;
  k_produtosprecos.t_pp(i).id_produtosprecos := :new.id_produtosprecos;
  k_produtosprecos.t_pp(i).tipopreco         := :new.tipopreco;
  k_produtosprecos.t_pp(i).filial            := :new.filial;
end t_vm_produtosprecos_biur;
/

-- Finalmente, uma trigger after insert/update (statement level), para realizar o processamento.
-- Este tipo de trigger não dispara o erro mutating table, pois ela é disparada apenas uma vez para 
-- o comando (como não é possível acessar os valores :new ou :old, precisamos da package para armazenar
-- estas informações)
create or replace trigger t_vm_produtosprecos_aiu after insert or update on vm_produtosprecos as

begin

  if ( k_produtosprecos.t_pp.count() > 0 ) then
    
    for i in k_produtosprecos.t_pp.first .. k_produtosprecos.t_pp.last loop
      merge into vm_produtosprecos p
      using ( select rowid rid
                   , row_number() over ( partition by id_produtosprecos, tipopreco, filial 
                                         order     by validadefim desc nulls first 
                                       ) rn 
              from   vw_produtosprecos
              where  id_produtosprecos = k_produtosprecos.t_pp(i).id_produtosprecos
              and    tipopreco         = k_produtosprecos.t_pp(i).tipopreco
              and    filial            = k_produtosprecos.t_pp(i).filial
            ) p2
      on    ( p.rowid = p2.rid )
      when  matched then
        update
        set    p.sequencia = p2.rn
      ;
    end loop;
    
  end if;

  k_produtosprecos.t_pp.delete;

end t_vm_produtosprecos_aiu;
facc
Rank: Analista Pleno
Rank: Analista Pleno
Mensagens: 104
Registrado em: Qua, 27 Mai 2009 2:37 pm
Localização: Cerquilho / SP

boa tarde rogenaro, primeiramente obrigado pela sua resposta.
Desculpa a demora para responder, surgirão algumas prioridades.

Respondendo
(só para confirmar, pois no seu ultimo exemplo o código da antepenultima linha é 585880 com sequencia 1.. já o código seguinte, 585881, inicia na sequencia 2... ficou meio estranho neste ponto.. a antepenultima linha deveria ter o código 585881 também, ou a penultima linha deveria ter sequencia 1 e a ultima sequencia 2? Ou eu entendi a regra errado?)
Realmente foi um erro de digitação minha. Ele deveria ser 1 mesmo.

Gostei muito das suas SQLs, mas quando a data é nula ele está retornando a menor sequencia e essa deveria ser a maior.
rogenaro
Rank: DBA Pleno
Rank: DBA Pleno
Mensagens: 232
Registrado em: Sex, 30 Mar 2007 7:26 pm
Localização: Londrina - PR
Rafael O. Genaro

Ops.. o order by ficou errado na query da trigger.. Acredito que as consultas anteriores estão retornando os registros na ordem correta, não?

Selecionar tudo

      merge into vm_produtosprecos p 
      using ( select rowid rid 
                   , row_number() over ( partition by id_produtosprecos, tipopreco, filial 
                                         order     by validadefim desc nulls last -- Aqui tem que ser last
                                       ) rn 
              from   vm_produtosprecos 
              where  id_produtosprecos = k_produtosprecos.t_pp(i).id_produtosprecos 
              and    tipopreco         = k_produtosprecos.t_pp(i).tipopreco 
              and    filial            = k_produtosprecos.t_pp(i).filial 
            ) p2 
      on    ( p.rowid = p2.rid ) 
      when  matched then 
        update 
        set    p.sequencia = p2.rn 
      ; 
facc
Rank: Analista Pleno
Rank: Analista Pleno
Mensagens: 104
Registrado em: Qua, 27 Mai 2009 2:37 pm
Localização: Cerquilho / SP

Dando continuidade,

Ao criar a package está dando erro nessa linha

Selecionar tudo

type pp_tab is table of pp_rec index by binary integer; 
no identificados integer;

O que poderia ser?

PS.: Versão do Oracle é 10G (10.0.2.1.0)
rogenaro
Rank: DBA Pleno
Rank: DBA Pleno
Mensagens: 232
Registrado em: Sex, 30 Mar 2007 7:26 pm
Localização: Londrina - PR
Rafael O. Genaro

ops

Selecionar tudo

binary_integer
faltou o _
emer_rosa
Rank: Programador Júnior
Rank: Programador Júnior
Mensagens: 29
Registrado em: Sáb, 28 Ago 2010 10:45 am
Localização: Torres-RS
Emerson E. Rosa

Boa tarde,

Estou com um problema semelhante, que não consegui resolver, tenho uma tabela de sequencia de visita TGFVIS, onde tenho os seguintes campos:

Selecionar tudo

Codparc | Tipo   | Valor  | Seqvisita  | Codvend  | Codreg

8974   | P       |       2|              1|         105|         0
29457  | P       |       2|              2|         105|         0
9024   | P       |       2|              3|         105|         0
1199   | P       |       2|              4|         105|         0
28175  | P       |       2|              5|         105|         0
8745   | P       |       2|              6|         105|         0
Codparc = Codigo do Cliente
Tipo = Semana da Visita
Valor = Dia da Semana
Seqvisita = Sequencia de Visita no dia
Codvend = Código do vendedor
Codreg = Codigo da região, atualmente não uso, é sempre zero.

Estou precisando fazer um Insert de um cliente neste meio via trigger ou procedure, e que ao fazer o insert, ele faça um update na sequencia do restante dos clientes daquele dia.

EX: terei o cliente 1515, Tipo=P, Valor=2 para inserir na Sequencia 2 do vendedor 105, ele teria que inserir e automaticamente ajustar a sequencia dos demais ficaria assim:

Selecionar tudo

Codparc | Tipo | Valor | Seqvisita | Codvend | Codreg

8974    | P       |       2|              1|         105|         0
1515    | P       |       2|              2|         105|         0
29457   | P       |       2|              3|         105|         0
9024    | P       |       2|              4|         105|         0
1199    | P       |       2|              5|         105|         0
28175   | P       |       2|              6|         105|         0
8745    | P       |       2|              7|         105|         0
alguém poderia me ajudar por favor, seria um insert seguido de update, ou um update primeiro apra abrir o espaço para o insert pois tenho uma constraint que não deixa inserir no mesmo dia clientes com a mesma sequencia.
Responder
  • Informação
  • Quem está online

    Usuários navegando neste fórum: Nenhum usuário registrado e 17 visitantes