11
ORACLE :: Programação PL/SQL Objetivo Este curso tem como objetivo fazer uma introdução sobre os principais recursos da linguagem PL/SQL para o desenvolvimento de consultas SQL para a plataforma ORACLE de banco de dados. Aulas Nas aulas encontrará material rico para realização de seu auto-estudo, este tema é compreendido pelas aulas relacionadas abaixo: Aula 01 - Visão Geral (1h) Aula 02 - Conhecendo a Ferramenta Oracle SQL Developer (1h) Aula 03 - Criando e Gerenciando Tabelas com PL/SQL (1h) Aula 04 - Compreendendo as cláusulas de INSERT, UPDATE e DELETE (2h) Aula 05 – Compreendendo a cláusula de SELECT (2h) Aula 06 – Compreendendo as funções agregadas (2h) Aula 07 - Criando Visões com PL/SQL (1h) Aula 08 – Utilizando Funções SQL (2h) Aula 09 – Criando Funções Escalares (2h) Aula 10 - Otimizando Consultas SQL (2h) Exemplos Práticos Materia de Referência Abaixo relaciono material de referência para que possa estudar e compreender detalhadamente o assunto: Livros (comprar) Oracle Database 10g PL/SQL Programming Oracle SQL Developer 2.1 Hyperlinks (acesso gratuíto) Documentação Online do Oracle (Material Completo) Oracle Database PL/SQL – Guia do Usuário e Referência Tire sua Dúvida Caso tenha alguma dúvida, clique aqui para que possa enviá-la e ser respondida em breve.

Curso Oracle - Programação PL-SQL

Embed Size (px)

Citation preview

Page 1: Curso Oracle - Programação PL-SQL

ORACLE :: Programação PL/SQLObjetivo

Este curso tem como objetivo fazer uma introdução sobre os principais recursos da linguagem PL/SQL para o

desenvolvimento de consultas SQL para a plataforma ORACLE de banco de dados.

Aulas

Nas aulas encontrará material rico para realização de seu auto-estudo, este tema é compreendido pelas aulas

relacionadas abaixo:

Aula 01 - Visão Geral (1h)

Aula 02 - Conhecendo a Ferramenta Oracle SQL Developer (1h)

Aula 03 - Criando e Gerenciando Tabelas com PL/SQL (1h)

Aula 04 - Compreendendo as cláusulas de INSERT, UPDATE e DELETE (2h)

Aula 05 – Compreendendo a cláusula de SELECT  (2h)

Aula 06 – Compreendendo as funções agregadas (2h)

Aula 07 - Criando Visões com PL/SQL (1h)

Aula 08 – Utilizando Funções SQL (2h)

Aula 09 – Criando Funções Escalares (2h)

Aula 10 - Otimizando Consultas SQL (2h)

Exemplos Práticos

Materia de Referência

Abaixo relaciono material de referência para que possa estudar e compreender detalhadamente o assunto:

Livros (comprar)

Oracle Database 10g PL/SQL Programming

Oracle SQL Developer 2.1

Hyperlinks (acesso gratuíto)

Documentação Online do Oracle (Material Completo)

Oracle Database PL/SQL – Guia do Usuário e Referência

Tire sua Dúvida

Caso tenha alguma dúvida, clique aqui para que possa enviá-la e ser respondida em breve.

Page 2: Curso Oracle - Programação PL-SQL

Aula 08 – Utilizando Funções SQL     

 

3 Votes

Objetivo

Nesta aula, o aluno terá oportunidade de:

Descrever vários tipos de funções disponíveis no SQL;

Usar funções de data, número e caractere nas instruções SELECT;

Descrever o uso das funções de conversão.

Funções SQL

As funções formam o bloco de consulta básico mais avançado e são usadas para manipular valores de dados.

Portanto, as funções são um recurso avançado do SQL e podem ser usadas para realizar o seguinte:

Executar cálculos usando dados;

Modificar itens de dados individuais;

Manipular saída para grupos de linhas;

Formatar datas e números para exibição;

Converter tipos de dados de coluna;

Podem aceitar argumentos e sempre retornar um valor.

Estrutura conceitual de Função SQL

Page 3: Curso Oracle - Programação PL-SQL

As funções se dividem em:

Funções de Uma única linha – essas funções operam somente linhas únicas e retornam um resultado por

linha, logo temos funções de Caractere, Número, Data, Conversão e Geral.

Suas principais características são:

Manipulam itens de dados;

Aceitam argumentos e retornam um valor;

Agem em cada linha retornada;

Retornam um resultado por linha;

Podem modificar o tipo de dado;

Podem ser aninhadas.

Funções de Várias linhas – essas funções manipulam grupos de linha a fim de obter um resultado por

grupo de linhas.

A sintaxe de uma função é compreendida por:

-- SINTAXE DA FUNÇÃO

function_name (coluna/expressão, [arg1, arg2, ...])

Vamos adentrar ao assunto por tipo de função, logo temos:

Funções de Caractere:

Funções de Conversão de Maiúscula e Minúsculas

LOWER(coluna|expressão) – converte valores de caractere alfabético para letras minúsculas.

UPPER(coluna|expressão) – converte valores de caractere alfabético para letras maiúsculas.

INITCAP(coluna|expressão) – converte valores de caractere alfabético para usar maiúsculas na primeira

letra de cada palavra e todas as outras.

Funções de Manipulação de Caractere

CONCAT(coluna1|expressão1,coluna2|expressão2) – retorna o número de caracteres do valor.

SUBSTR(coluna|expressão, m[,n]) – retorna caracteres específicos a partir do valor de caractere

començando na posição m, até n caracteres depois.

LENGTH(coluna|expressão) - retorna o número de caracteres do valor.

INSTR(coluna|expressão,m) – retorna a posição numérica do caractere nomeado.

LPAD(coluna|expressão, n, ‘string’) – preenche o vlaor de caracter justificado à direita a uma largura

total de n posições de caractere.

TRIM(anterior|posterior|ambos, trim_character FROM trim_souce) – permite organizar cabeçalhos ou

caracteres de fim de linha (ou os dois) a partir de uma string de caractere.

Exemplificando o uso das funções de caractere, temos:

-- USANDO A FUNÇÃO LOWER

SELECT LOWER('IGOR BORLOT BORBA') FROM DUAL; -> Resultado: "igor borlot borba"

-- USANDO A FUNÇÃO UPPER

SELECT UPPER('igor borlot borba') FROM DUAL; -> Resultado: "IGOR BORLOT BORBA"

-- USANDO A FUNÇÃO INITCAP

SELECT INITCAP('igor borlot borba') FROM DUAL; -> Resultado: "Igor Borlot Borba"

Page 4: Curso Oracle - Programação PL-SQL

-- USANDO A FUNÇÃO CONCAT

SELECT CONCAT('IGOR','BORBA') FROM DUAL; -> Resultado: "IGORBORBA"

-- USANDO A FUNÇÃO SUBSTR

SELECT SUSBTR('IGOR', 1, 2) FROM DUAL; -> Resultado: "IG"

-- USANDO A FUNÇÃO LENGTH

SELECT LENGTH('IGOR') FROM DUAL -> Resultado: "4";

-- USANDO A FUNÇÃO INSTR

SELECT INSTR('IGOR', 'g') FROM DUAL; -> Resultado: "2"

-- USANDO A FUNÇÃO LPAD

SELECT LPAD('2222', 8, '#') FROM DUAL; -> Resultado: "####2222"

-- USANDO A FUNÇÃO TRIM

SELECT TRIM('S' FROM 'SSMITH') FROM DUAL; -> Resultado: "MITH"

Funções Numéricas

As funções numéricas aceitam entrada numérica e retornam valores numéricos. Esta seção descreve algumas das

funções numéricas:

ROUND(coluna|expressão) – Arredonda a coluna, expressão ou valore para n casas decimais ou e n for

omitido, nenhuma casa decimal (Se n for negativo, os números à esquerda do ponto de decimal serão

arredondados).

TRUNC(coluna|expressão) – Trunca a coluna, expressão ou valor para n casas decimais ou se n for omitido,

nenhuma casa decimal (Se n for negativo, os números à esquerda do ponto decimal serão truncados para

zero).

MOD(m,n) – Retorna o resto de m dividido por n.

Exemplificando o uso das funções de caractere, temos:

-- USANDO A FUNÇÃO ROUND

SELECT ROUND(20.235, 2) FROM DUAL; --> Resultado: "20.24"

-- USANDO A FUNÇÃO TRUNC

SELECT TRUNC(20.235, 2) FROM DUAL; --> Resultado: "20.23"

-- USANDO A FUNÇÃO MOD

SELECT MOD(1600, 300) FROM DUAL; --> Resultado: "100"

Funções de Datas

Os produtos da Oracle armazenam datas em um formato numérico interno, representando o século, ano, mês, dia,

horas, minutos e segundos.

O formato de entrada e exibição default para qualquer data é DD-MON-YY, logo  as datas válidas para a o Oracle

estão entre 1 de janeiro, 4712 A.C. e 31 de dezembro, 9999 D.C.

Vejamos abaixo algumas funções de data encontradas no Oracle:

Page 5: Curso Oracle - Programação PL-SQL

SYSDATE – É a função de data que retorna a data e hora atual. Você pode usar o SYDATE da mesma forma

como usuaria qualquer outro nome de coluna. Por exemplo, é possível exibir a data atual selecionando

SYSDATE a partir de uma tabela qualquer (inclui-se a tabela fictícia DUAL).

MONTHS_BETWEEN(data1, data2) – Localiza o número de meses entre a data1 e a data2. O resultado

pode ser positivo ou negativo. Se a data1 for posterior a data2, o resultado será positivo; se data1 for

anterior a data2, o resultado será negativo A parte não-inteira do resultado representa uma parte do mês.

ADD_MONTHS(data, n) – Adiciona um número n de meses de calendário à data. O valor de n deve ser

inteiro ou pode ser negativo.

NEXT_DAY(data, ‘char’) – Localiza a data do próximo dia especifica da data seguinte da semana (‘char’). O

valor de char pode ser um número representado um dia ou uma string de caractere.

LAST_DAY(data) – Localiza a data do último dia do mês que contém a data.

ROUND(data[,'fmt']) – Retorna a data arredondada para a unidade especificada pelo modelo de formato fmt.

Se o modelo de formato fmt for omitido, adata será arredondada para o dia mais próximo.

TRUNC(data[,'fmt']) – Retorna a data com a parte da hora do dia truncada para a unidade especificada pelo

modelo de formato fmt. Se o modelo de formato fmt for omitido, a data será truncada para o dia mais

próximo.

Exemplificando o uso das funções de caractere, temos:

-- USANDO A FUNÇÃO SYSDATE

SELECT SYSDATE FROM DUAL; --> Resultado: "2011-05-10 09:00:00" (exemplificando a data hora atual)

-- USANDO A FUNÇÃO MONTHs_BETWEEN

SELECT MONTHS_BETWEEN('01-JAN-95','01-JAN-96') FROM DUAL; --> Resultado: "12"

-- USANDO A FUNÇÃO ADD_MONTHS

SELECT ADD_MONTHS('01-JAN-98', 6) FROM DUAL; --> Resultado: "11-JUL-98"

-- USANDO A FUNÇÃO NEXT_DAY

SELECT NEXT_DAY('01-FEB-11', 'FRIDAY') FROM DUAL; --> Resultado: "04-FEB-11"

-- USANDO A FUNÇÃO LAST_DAY

SELECT NEXT_DAY('01-SEP-11') FROM DUAL; --> Resultado: "30-SEP-11"

-- USANDO A FUNÇÃO ROUND (1)

SELECT NEXT_DAY('25-JUL-95','MONTH') FROM DUAL; --> Resultado: "01-AUG-95"

-- USANDO A FUNÇÃO ROUND (2)

SELECT NEXT_DAY('25-JUL-95','YEAR') FROM DUAL; --> Resultado: "01-JAN-96"

-- USANDO A FUNÇÃO TRUNC (1)

SELECT NEXT_DAY('25-JUL-95','MONTH') FROM DUAL; --> Resultado: "01-JUL-95"

-- USANDO A FUNÇÃO TRUNC (2)

SELECT NEXT_DAY('25-JUL-95','YEAR') FROM DUAL; --> Resultado: "01-JAN-95"

Aritmética com datas

Page 6: Curso Oracle - Programação PL-SQL

Os bancos de dados de dados armazenam datas como números, logo você pode executar cálculo usando

operadores aritméticos como adição e subtração. É possível adicionar e subtrair constantes de número bem como

datas. Vejamos as abaixo as possíveis operações:

data + número = data .:. Neste caso adiciona um número de dias para um data;

data – número = data .:. Neste caso subtrai um número de dias de uma data;

data – data = número de dias .:. Neste caso subtrai uma data de outra;

data + número/24 = data .:. Neste caso adiciona um número de horas para uma data.

-- USANDO A FUNÇÃO SYSDATE COM OPERAÇÕES ARITMÉTICAS

SELECT (SYSDATE-2) FROM DUAL; --> Resultado: "2011-04-10" (exemplificando a data hora atual - número

de dias)

Funções de Conversão

A conversão de dados no Oracle pode se dar pelas seguintes formas:

Conversão implícita de tipo de dados;

Conversão explícita de tipo de dados.

Para atribuições, o Oracle Server pode converter automaticamente (de forma implícita) o seguinte:

De VARCHAR2 ou CHAR para NUMBER;

De VARCHAR2 ou CHAR para DATE;

De NUMBER para VARCHAR2;

De DATE para VARCHAR2.

Para avaliação da expressão, o Oracle Server pode converter automaticamente o seguinte:

De VARCHAR2 ou CHAR para NUMBER;

De VARCHAR2 ou CHAR para DATE.

Conversão explícita de tipo de dados:

Funções de Conversão Explítica

O PL/SQL oferece três funções – como podemos observar na figura acima – para converter um valor de um tipo

de dados para outro:

TO_CHAR(número[data, [fmt],[nlsparams]) – Converte um número ou data para uma string de caractere

VARCHAR2 com modelo de format fmt.

Page 7: Curso Oracle - Programação PL-SQL

Convesão de Número

O parâmetro nlsparams especifica os seguintes caracteres, que são retornados por elementos de

formato de número:

Caractere decimal;

Separador de grupo;

Símbolo de moeda local;

Símbolo de moeda internacional.

Se nlsparams ou qualquer outro parâmetro for omitido, essa função utilizará os valores de

parâmetro default para a seção.

Conversão de Data

O parâmetro nlsparams especifica o idioma no qual os nomes de dias, meses e abreviação

retornam. Se este parâmetro for omitido, essa função utilizará os idiomas de data default para a

seção.

TO_NUMBER(carac,[fmt], [nlsparams])

Converte uma string de caractere contendo dígitos para um número no formato especificado pelo

modelo de formato opcional fmt.

O parâmetro nlsparams tem a mesma finalidade neste função como na função TO_CHAR para a

conversão de número.

TO_DATE(carac, [fmt], [nlsparams])

Converte uma string de caractere representando uma data para um valor de data de acordo com

o fmt especificado.

Se fmt for omitido, o formato é DD-MON-YY.

O parâmetro nlsparams possui a mesma finaliade na função TO_CHAR para a conversão de data.

Usando a função TO_CHAR com Datas

-- SINTAXE DA FUNÇÃO TO_CHAR

TO_CHAR(data, 'fmt')

-- CONVERTENDO A DATA/HORA ATUAL PARA STRING

SELECT TO_CHAR(SYSDATE, 'DD-MM-YYYY') FROM DUAL -> Resultado: "05-03-2011"

O modelo de formato:

Deve estar entre aspas simples e fazer distinção entre maiúsculas e minúsculas;

Pode incluir qualquer elemento de formato de data válido;

Tem um elemento fmt para remover espaços preenchidos ou suprimir zeros à esquerda;

É separado do valor de data por uma vírgula.

Usando a função TO_CHAR com Números

-- SINTAXE DA FUNÇÃO TO_CHAR

TO_CHAR(data, 'fmt')

-- CONVERTENDO A DATA/HORA ATUAL PARA STRING

SELECT TO_CHAR(3000, '$99,999') FROM DUAL -> Resultado: "$3,000"

Page 8: Curso Oracle - Programação PL-SQL

O modelo de formato:

Deve estar entre aspas simples e fazer distinção entre maiúsculas e minúsculas;

Pode incluir qualquer elemento de formato de número válido;

Tem um elemento fmt para remover espaços preenchidos ou suprimir zeros à esquerda;

É separado do valor do número por uma vírgula.

Usando a função TO_NUMEBR e TO_DATE

-- SINTAXE DA FUNÇÃO TO_DATE

TO_DATE(carac[, 'fmt'])

-- SINTAXE DA FUNÇÃO TO_NUMBER

TO_NUMBER(carac[, 'fmt'])

Exemplos de formatos de data válidos:

SCC ou CC – Século; Prefixos S data AC com -;

Anos em datas YYYY ou SYYYY - Ano; Prefixos S data AC com -;

YYY ou YY ou Y – Últimos três, dois ou um dígitos do ano;

Y, YYY – Ano com vírgula nesta posição;

IYYY, IYY, IY, I - Quatro, três, dois ou um dígito  do ano com base no padrão ISO;

SYEAR ou YEAR – Ano inteiro; Prefixos S data AC com -;

BC ou AD – Indicador AC/DC;

B.C. ou A.D. – Indicador com pontos AC/DC;

Q – Trimestre do ano;

MM – Mês, valor de dois dígitos;

MONTH – Nome do mês preenchidos com espaços limite a nove caracteres;

MON – Nome do mês, abreviação de três letras;

RM – Mês em números romanos;

WW ou W – Semana do ano ou mês;

DDD ou DD ou D – Dia do ano, mês ou semana;

DAY – Nome do dia preenchido com espaços limitado a nove caracteres;

DY – Nome do dia; abreviação de três letras;

J – Dia do calendário juliano; o número de dias deste 31 de dezembro 4713 BC.

Exemplos de formatos de hora:

AM ou PM - Indicador de meridiano;

A.M. ou P.M. - Indicador de meridiano com pontos.

HH ou HH12 ou HH24 – Horas do dia ou hora (1 a 12) ou hora (0 a 23);

MI – Minuto (0 a 59);

SS – Segundo (0 a 59);

SSSSS – Segundos após a meia-noite (0-86399).

Exemplos de outros formatos:

/ . , - A pontuação é reproduzida no resultado;

“of the” - A string entre aspas é reproduzida no resultado.

Exemplos de formatos especificando sufixos para influenciar na exibição de número:

TH – Número ordinal (por exemplo, DDTH para 4TH);

SP – Número por extenso (por exemplo, DDSP para FOUR);

Page 9: Curso Oracle - Programação PL-SQL

SPTH ou THSP – Números ordinais por extenso (por exemplo, DDSPTH ou FOURTH).

Exemplos de formatos de número válidos:

Se estiver convertendo um número para tipo de dados de caractere, você pode usar o seguintes elementos:

9 - Posição numérica (número de 9s determinam o tamanho da

exibição. Exemplo: 999999. Resultado: 1234.

0 – Exibe zeros à esquerda. Exemplo: 099999. Resultado: 001234.

$ - Sinal de dólar flutuante. Exemplo: $999999. Resultado: $1234.

L – Sinal da moeda local flutuante. Exemplo: L999999. Resultado: FF1234.

. – Ponto decimal na posição especificada. Exemplo: 999999.99. Resultado: 1234.00.

, – Vírgula na posição especificada. Exemplo: 999,999. Resultado: 1, 234.

MI – Sinais de menos à direita (valores negativos). Exemplo: 999999MI. Resultado: 1234-.

PR – Coloca números negativos entre parênteses. Exemplo: 999999PR. Resultado: (1234).

EEEE – Notação científica (formato deve especificar quatro

Es). Exemplo: 99,999EEEE. Resultado: 1.234E+03.

V – Multiplica por 10 n vezes (n = número de 9s após o V). Exemplo: 9999v99. Resultado: 123400.

B – Exibe valores de zero como espaço, não 0. Exemplo: B9999.99. Resutlado: 1234.00.

Outras funções muito utilizadas:

NVL(expr1, expr2) – Converte nulo para um valor real.

Os tipos de dados que podem ser usados são data, número e caractere;

Dada a sintaxe, temos:

expr1 – é o valor de origem ou expressão que pode conter nulo;

expr2 – é o valor de destino para a conversão de nulo.

Exemplificando, temos:

NUMBER – NVL(number_column, 9)

DATE - NVL(date_column, ’01-JAN-95′)

CHAR ou VARCHAR2 – NVL(character_column, ‘Unavaiable’)

DECODE(col/expressão, pesquisa1, resultado1[, pesquisa2, resultado2, ...,][, default]) – Facilita as pesquisas

condicionais realizando o trabalho de uma instrução CASE ou IF-THEN-ELSE.

A função DECODE decodifica uma expressão de um modo similar a lógica IF-THEN-ELSE usada em

diversas linguagens. A função DECODEdecodifica a expressão após compará-la a cada valor

de pesquisa. Se expressão forma a mesma da pesquisa, o resultado é retornado.

Exemplificando, temos o uso das duas funções citadas acima:

-- EXEMPLO DE USO DA FUNÇÃO NVL COM EXPRESSÕES

SELECT NVL(NULL, 9) FROM DUAL; -> Resultado: "9";

-- EXEMPLO DE USO DA FUNÇÃO NVL COM COLUNAS

SELECT CD_FUNCIONARIO, DS_FUNCIONARIO, NVL(QT_SALARIO, 0) FROM FUNCIONARIO; -> Resultado: "1", "IGOR

BORLOT BORBA", "0".

-- EXEMPLO DE USO DA FUNÇÃO DECODE COM COLUNAS

SELECT CD_FUNCIONARIO, DS_FUNCIONARIO, DECODE(CD_CARGO, 1, (QT_SALARIO*1), 2, (QT_SALARIO*2),

QT_SALARIO) FROM FUNCIONARIO; -> Resultado: "1", "IGOR BORLOT BORBA", "15000".

Aninhando Funções

Page 10: Curso Oracle - Programação PL-SQL

As funções de uma única linha podem ser aninhadas em qualquer nível;

Funções aninhadas são avaliadas a partir do nível mais interno para o nível mais externo.

Aninhamento de Funções

Exemplificando, temos:

-- EXEMPLO DE ANINHAMENTO DE FUNÇÕES

SELECT CD_FUNCIONARIO, NVL(TO_CHAR(DS_FUNCIONARIO),'NÃO INFORMADO')) FROM FUNCIONARIO --> Resultado:

"Se nulo, resultará no valor NÃO INFORMADO".