Neste artigo vamos aprender como inicializar variáveis usando a declaração SELECT INTO, como usar declarações DML em blocos PL/SQL e como utilizar sequências no PL/SQL. Estes são conceitos fundamentais para qualquer desenvolvedor de banco de dados Oracle, então vamos mergulhar fundo no assunto!
Inicializando Variáveis com a Declaração SELECT INTO
No PL/SQL, existem duas formas principais de atribuir valores a variáveis. A primeira, é a inicialização com o operador de atribuição (:=) que você pode conferir aqui. Neste artigo, você aprenderá como inicializar uma variável com uma declaração SELECT INTO.
Considere o seguinte exemplo:
Antes vamos criar uma tabela para executar essa prática:
1 2 3 4 5 6 |
CREATE TABLE curso ( id_curso NUMBER, nome VARCHAR2(100), custo NUMBER(10,2), PRIMARY KEY (id_curso) ); |
Vamos inserir alguns dados:
1 2 3 4 5 |
INSERT INTO curso (id_curso, nome, custo) VALUES (1, 'Curso de PL/SQL', 500.00); INSERT INTO curso (id_curso, nome, custo) VALUES (2, 'Curso de Java', 800.00); INSERT INTO curso (id_curso, nome, custo) VALUES (3, 'Curso de Python', 600.00); INSERT INTO curso (id_curso, nome, custo) VALUES (4, 'Curso de JavaScript', 700.00); INSERT INTO curso (id_curso, nome, custo) VALUES (5, 'Curso de C#', 900.00); |
Agora vamos executar esse bloco de PL/SQL.
1 2 3 4 5 6 7 8 9 |
DECLARE v_custo_medio VARCHAR2(10); BEGIN SELECT TO_CHAR(AVG(custo), '9,999.99') INTO v_custo_medio FROM curso; DBMS_OUTPUT.PUT_LINE ('Custo médio: '||v_custo_medio); END; |
Neste exemplo, uma variável recebe o custo médio do curso via uma declaração SELECT INTO. A função TO_CHAR é usada para formatar o custo; ao fazer isso, o tipo de dados numérico é convertido para um tipo de dados de caractere. Quando a variável tem um valor, ela é exibida na tela da seguinte forma:
1 |
Custo médio: 700.00 |
É importante notar que a declaração SELECT INTO deve retornar exatamente uma linha. Se retornar várias linhas ou nenhuma linha, ocorrerão erros.
Usando Declarações DML em um Bloco PL/SQL
As declarações DML (Data Manipulation Language) são usadas para manipular dados nas tabelas do banco de dados. O PL/SQL suporta estas declarações DML:
- INSERT
- UPDATE
- DELETE
- MERGE
Vamos criar uma tabela para permitir explorar um exemplo:
1 2 3 4 5 |
CREATE TABLE cep ( cep VARCHAR2(8), cidade VARCHAR2(100), PRIMARY KEY (cep) ); |
Após criar a tabela, você pode inserir alguns dados de exemplo para testar o código PL/SQL:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
-- Exemplo 0 INSERT INTO cep (cep, cidade) VALUES ('43224', 'Columbus'); -- Exemplo 1 INSERT INTO cep (cep, cidade) VALUES ('10001', 'New York'); -- Exemplo 2 INSERT INTO cep (cep, cidade) VALUES ('90001', 'Los Angeles'); -- Exemplo 3 INSERT INTO cep (cep, cidade) VALUES ('60601', 'Chicago'); -- Exemplo 4 INSERT INTO cep (cep, cidade) VALUES ('77001', 'Houston'); -- Exemplo 5 INSERT INTO cep (cep, cidade) VALUES ('33101', 'Miami'); -- Exemplo 6 INSERT INTO cep (cep, cidade) VALUES ('02101', 'Boston'); -- Exemplo 7 INSERT INTO cep (cep, cidade) VALUES ('80201', 'Denver'); -- Exemplo 8 INSERT INTO cep (cep, cidade) VALUES ('85001', 'Phoenix'); -- Exemplo 9 INSERT INTO cep (cep, cidade) VALUES ('98101', 'Seattle'); -- Exemplo 10 INSERT INTO cep (cep, cidade) VALUES ('30301', 'Atlanta'); |
Veja um exemplo de bloco PL/SQL que atualiza uma entrada existente na tabela cep:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
DECLARE v_cidade cep.cidade%TYPE; BEGIN SELECT cidade INTO v_cidade FROM cep WHERE cep = '43224'; DBMS_OUTPUT.PUT_LINE('Nome da cidade antes do UPDATE: '||v_cidade); UPDATE cep SET cidade = UPPER(cidade) WHERE cep = '43224'; SELECT cidade INTO v_cidade FROM cep WHERE cep = '43224'; DBMS_OUTPUT.PUT_LINE('Nome da cidade depois do UPDATE: '||v_cidade); END; |
Para ilustrar os resultados da declaração UPDATE, o valor da cidade é selecionado da tabela CEP e exibido antes e depois da declaração UPDATE ser emitida. Quando executado, este script produz a seguinte saída:
1 2 3 |
Nome da cidade antes do UPDATE: Columbus Nome da cidade depois do UPDATE: COLUMBUS |
Usando uma Sequência em um Bloco PL/SQL
Uma sequência Oracle é um objeto de banco de dados Oracle que pode ser usado para gerar números exclusivos. Você pode usar sequências para gerar valores de chave primária automaticamente.
Depois que uma sequência é criada, você pode acessar seus valores com estas pseudocolunas:
- CURRVAL: Retorna o valor atual da sequência.
- NEXTVAL: Incrementa a sequência e retorna o novo valor.
Veja um exemplo onde uma tabela de teste é usada para demonstrar como a sequência pode ser usada no PL/SQL:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
CREATE SEQUENCE teste_seq INCREMENT BY 10; CREATE TABLE tab_teste (col1 number, col2 varchar2(30)); DECLARE v_valor_seq NUMBER; BEGIN -- Gera o valor inicial da sequência v_valor_seq := teste_seq.NEXTVAL; DBMS_OUTPUT.PUT_LINE('Valor inicial da sequência: '|| to_char(v_valor_seq)); INSERT INTO tab_teste (col1, col2) VALUES (v_valor_seq, 'Linha '||v_valor_seq); -- Atualiza col1 com o próximo valor da sequência UPDATE tab_teste SET col1 = teste_seq.NEXTVAL; -- Exibe o valor atual da sequência DBMS_OUTPUT.PUT_LINE('Valor atual da sequência: '|| to_char(teste_seq.CURRVAL)); END; |
Neste exemplo, inicializamos teste_seq, atribuímos seu valor inicial à variável v_valor_seq e o exibimos na tela. Em seguida, inserimos e atualizamos uma linha na tabela tab_teste. Observe que em ambas as instâncias estamos empregando a pseudocoluna NEXTVAL. Por fim, exibimos o valor atual da sequência na tela com a ajuda da pseudocoluna CURRVAL. Quando executado, este exemplo produz a seguinte saída:
1 2 3 |
Valor inicial da sequência: 1 Valor atual da sequência: 11 |
Conclusão
Neste artigo, aprendemos sobre alguns conceitos importantes do PL/SQL, como inicializar variáveis com a declaração SELECT INTO, usar declarações DML em blocos PL/SQL e utilizar sequências.
Lembre-se, a prática leva à perfeição. Quanto mais você praticar escrevendo seus próprios blocos PL/SQL, mais confortável e proficiente você se tornará. Não tenha medo de experimentar e cometer erros – é assim que aprendemos e crescemos como desenvolvedores.