PL/SQL Tables / Arrays / Table-Variables

Coloque aqui tutoriais (por enquanto, sobre qualquer assunto relacionado a Oracle) e apostilas.
Responder
Avatar do usuário
dr_gori
Moderador
Moderador
Mensagens: 5024
Registrado em: Seg, 03 Mai 2004 3:08 pm
Localização: Portland, OR USA
Contato:
Thomas F. G

Você já respondeu a dúvida de alguém hoje?
https://glufke.net/oracle/search.php?search_id=unanswered

Variáveis de tabelas também são conhecidas como arrays ou index-by tables, PL/SQL tables.

A sintaxe é:

Selecionar tudo

   DECLARE
   TYPE type_name IS TABLE OF
      (column_type  |
      variable%TYPE |
      table.column%TYPE
         [NOT NULL]
            INDEX BY BINARY INTEGER;

Selecionar tudo

-- Para declarar uma PL/SQL table faça assim:
   nome_da_var type_name;   --> type mostrado acima

Selecionar tudo

-- Setando valores para PL/SQL table:
   nome_da_var(n).nome_do_campo := 'Seu texto';
-- Onde 'n' é o valor do índice
Usando métodos das PL/SQL table:

Selecionar tudo

Use essa sintaxe

   table_name[ (parametros)]

EXISTS(n)   Retorna TRUE se o n elemento existe.

COUNT       Número de linhas da plsql table

FIRST       Primeiro e último da tabela
LAST        Retorna NULL se está vazia

PRIOR(n)    Retorna o índice que precede n na plsql table

NEXT(n)     Retorna o índice que sucede n na plsql table

EXTEND(n,i) Adiciona n copias do 'i' elemento para a plsql table
            default de i é NULL, defaults de n é 1

TRIM(n)     Remove o n elemento do fim da plsql table
            defaults de n é 1

DELETE(m,n) Apaga os elementos entre m...n
            default de m é n
            default de n é TODOS elementos

Nota Extend / Trim entraram a partir do Oracle 8.
Exemplos:

Selecionar tudo

   DECLARE
   -- declara o tipo
   TYPE MyTrip_table_type IS TABLE OF
       business_trips.bt_cost%Type
       INDEX BY BINARY INTEGER;

   --declara a TABLE variable com este tipo
   myTrips MyTrip_table_type;

   BEGIN
      myTrips(1) := 'Teste';
      UPDATE business_trips
      SET bt_cost = bt_cost * 1.2
      WHERE bt_id_pk = myTrips(1)
   END
   /
Editado pela última vez por dr_gori em Sáb, 20 Jan 2007 2:58 pm, em um total de 1 vez.
Avatar do usuário
rcruz
Rank: Programador Pleno
Rank: Programador Pleno
Mensagens: 32
Registrado em: Ter, 04 Jan 2005 10:52 am
Localização: Candido Mota

Isso funciona no Forms???? Se funcionar resolve meu probelma. Preciso guardar todos os valores de um bloco tabular para compor uma soma, já que quero somar campos que já são sumarizados e não são database.

Att.
Robson
marthaeloiza
Rank: Programador Júnior
Rank: Programador Júnior
Mensagens: 23
Registrado em: Seg, 21 Jan 2008 2:07 pm
Localização: São Paulo
Att
Martha Eloiza Fuchida

olá Robson, funciona sim no forms.....
tem 2 maneira, você declara na triguer que você vai user ou criar uma procedure.
da mesma maneira que você usa no pl/sql, você pode estar usando no forms.

Martha Fuchida
LixX
Rank: Programador Júnior
Rank: Programador Júnior
Mensagens: 25
Registrado em: Qui, 21 Jan 2010 4:40 pm
Localização: Porto Alegre - RS

**Ressuscitando tópico**

Queria criar um pl table de 2 campos, tipo...

Selecionar tudo

TYPE total_table_type IS TABLE OF (VARCHAR2(100), NUMBER) INDEX BY VARCHAR2(100);
(Este código não dá certo, mas determina o que eu precisaria)
O array teria 2 campos em cada posição...Tem como fazer isto?

[]'s
adriana.arraes
Rank: Estagiário Júnior
Rank: Estagiário Júnior
Mensagens: 2
Registrado em: Qua, 02 Jun 2010 7:04 pm
Localização: São Paulo - SP
Adriana C. S. Arraes

LixX,
para fazer o que você precisa "pl table de 2 campos", você pode primeiro criar um record que contenha as duas colunas que você precisa:

Selecionar tudo

TYPE rec_type IS RECORD (nome VARCHAR2(100), cpf NUMBER);
E depois, criar uma tabela:

Selecionar tudo

TYPE table_type IS TABLE OF rec_type INDEX BY VARCHAR2(100);
Exemplo:

Selecionar tudo

DECLARE
  --
  TYPE rec_type IS RECORD (nome VARCHAR2(100), cpf NUMBER);
  --
  TYPE table_type IS TABLE OF rec_type INDEX BY VARCHAR2(100);
  total_table_type table_type;
  --
  idx VARCHAR2(100);
  --
BEGIN
  --
  total_table_type('maria').nome := 'Maria do Carmo Pereira';
  total_table_type('maria').cpf  := '25699957800';
  --
  total_table_type('jose').nome  := 'Jose Paulo da Silva';
  total_table_type('jose').cpf   := '14586954201';
  --
  idx := total_table_type.FIRST;
  --
  LOOP
    --
    EXIT WHEN idx IS NULL;
    --
    dbms_output.put_line(total_table_type(idx).nome||' - CPF '||total_table_type(idx).cpf);
    --
    idx := total_table_type.next(idx);
    --
  END LOOP;
  --
END;
[]'s
Responder
  • Informação
  • Quem está online

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