segunda-feira, 10 de janeiro de 2011

Alterando Start da Sequence

Passo 1: Crio a Sequence

 

create sequence SEQ_TESTE minvalue 1
                          maxvalue 999999999999999999
                          start with 20101000000000
                          increment by 1
                          nocache;

 



 

Passo 2: Crio uma tabela para testes

 

create table sq_teste_seq (col1 number, col2 number(20));

 

Passo 3: Crio uma rotina para adicionar 200 registros

 

declare
  i number := 0;
begin
  for i in 1..200
  loop
      insert into sq_teste_seq values (seq_teste.nextval,20);
  end loop;
  commit;
end;

 






 

Passo 4: Crio uma rotina para atualizar a Sequence.
Adiciono 1 aos quatro primeiros dígitos da Sequence, neste caso representando o ano

 

Declare
  last_num number := 0;
  new_num  number := 0;
  incr_num number := 0;
  new_val  number := 0;
  v_sql    varchar2(200);

begin
    -- Pego o último número da sequence
    select last_number into last_num from user_sequences where sequence_name = 'SEQ_TESTE';

    -- Pego os primeiros 4 digitos da sequence (ANO) e somo mais um
    new_num := substr(last_num,1,4);
    new_num := new_num + 1;
    new_num := new_num || substr(last_num,5,length(last_num)-4);   
    dbms_output.put_line (new_num);

    -- Calculo o novo incrementador
    incr_num := new_num - last_num;
    dbms_output.put_line (incr_num);  

    -- Atualizo o número do incrementador da sequence
    v_sql := 'alter sequence seq_teste increment by ' || incr_num || ' nocache';
    execute immediate (v_sql);

    -- Atualizo o próximo valor da sequence
    select seq_teste.nextval into new_val from dual;
    dbms_output.put_line (new_val);

    -- Retorno o incrementador a 1
    execute immediate 'alter sequence seq_teste increment by 1 cache 20';
end;





























 

Para testar execute o Passo 3 novamente e veja o resultado que deve ficar da forma abaixo:

clip_image002 

Quebra cabeça digital




provided by flash-gear.com

segunda-feira, 3 de janeiro de 2011

Usando o FOR

A sintaxe do FOR Loop é:

FOR loop_counter IN [REVERSE] lowest_number..highest_number
LOOP
     {.statements.}
END LOOP;

Você deve usar o FOR Loop quando quiser executar o mesmo código um determinado número de vezes.
Veja um exemplo:

DECLARE
    Lcntr integer;
    LCalc integer;
BEGIN
  DBMS_OUTPUT.put_line ('Lcntr   LCalc');
  DBMS_OUTPUT.put_line ('-----   -----');
  FOR Lcntr IN 1..20
  LOOP
       LCalc := Lcntr * 31;
       DBMS_OUTPUT.put_line (lpad(Lcntr,5,'0') || '   ' || lpad(LCalc,5,'0'));
  END LOOP;
END;

Resultado

Lcntr   LCalc
-----   -----
00001   00031
00002   00062
00003   00093
00004   00124
00005   00155
00006   00186
00007   00217
00008   00248
00009   00279
00010   00310
00011   00341
00012   00372
00013   00403
00014   00434
00015   00465
00016   00496
00017   00527
00018   00558
00019   00589
00020   00620
Este exemplo fará o Loop 20 vezes. O contador será iniciado em 1 e irá parar no 20.
O FOR Loop também pode ser usado de forma decrescente.
Veja um exemplo:

DECLARE
    Lcntr integer;
    LCalc integer;
BEGIN
  DBMS_OUTPUT.put_line ('Lcntr   LCalc');
  DBMS_OUTPUT.put_line ('-----   -----');
  FOR Lcntr IN REVERSE 1..15
  LOOP
       LCalc := Lcntr * 31;
       DBMS_OUTPUT.put_line (lpad(Lcntr,5,'0') || '   ' || lpad(LCalc,5,'0'));      
  END LOOP;
END;

Resultado

Lcntr   LCalc
-----   -----
00015   00465
00014   00434
00013   00403
00012   00372
00011   00341
00010   00310
00009   00279
00008   00248
00007   00217
00006   00186
00005   00155
00004   00124
00003   00093
00002   00062
00001   00031
Este comando fará o Loop 15 vezes. O contador será iniciado em 15 e irá parar no 1.
Related Posts Plugin for WordPress, Blogger...